本文档介绍如何在三台服务器利用docker搭建mysql5.7三机主从复制及mycat1.6实现数据库读写分离。

序言

本文档介绍如何在三台服务器利用docker搭建mysql5.7三机主从复制及mycat1.6实现数据库读写分离。

环境需求

  • Docker

  • 三台服务器 Centos 7 ,服务器名称使用IP地址末尾代替,分别为182,181,180.

唯一要求

1
ulimit -n 根据实际进行设置

Docker

docker的安装方式请参照官方地址:https://docs.docker.com/install/linux/docker-ce/centos/

其他系统请选择合适的方式安装。

MySQL主从搭建

本方案的设计是1台主节点182,2台从节点181、180

182下的mysql.cnf

1
2
3
4
5
[mysqld]
#唯一id,如果开启主从功能则每台MySQL节点不能相同
server-id = 1
#开启mysql-log-bin功能
log-bin=mysql-bin

180下的mysql.cnf

1
2
3
4
5
[mysqld]
#唯一id,如果开启主从功能则每台MySQL节点不能相同
server-id = 2
#开启mysql-log-bin功能
log-bin=mysql-bin

181下的mysql.cnf

1
2
3
4
5
[mysqld]
#唯一id,如果开启主从功能则每台MySQL节点不能相同
server-id = 3
#开启mysql-log-bin功能
log-bin=mysql-bin

MySQL主节点

182节点

1
2
3
4
5
6
7
8
docker run -d --restart=always --name mysql5.7master \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD='密码' \
-p 3309:3306 \
-v /data/mysql5.7master/backupdir:/var/lib/backupdir \
-v /data/mysql5.7master/datadir:/var/lib/mysql \
-v /data/mysql5.7master/mysql.cnf:/etc/mysql/conf.d/mysql.cnf \
mysql:5.7

简单介绍

  • -d:后台运行;

  • --restart=always:允许跟随docker服务启动而启动;

  • --name mysql5.7master:docker容器名称,从节点宿主机同理;

  • -v /etc/localtime:/etc/localtime:将服务器宿主机的时间挂载到容器中,实现时区同步;

  • -e MYSQL_ROOT_PASSWORD=’密码’:MySQL服务root用户密码,修改你想要的密码即可;

  • -p 3309:3306:将宿主机的3309端口映射到容器的3306端口,即MySQL服务端口号,以便于外部访问;

  • -v /data/mysql5.7master/backupdir:/var/lib/backupdir:其目录中存放的是将要进行数据库还原的.sql文件,从节点宿主机同理;

  • -v /data/mysql5.7master/datadir:/var/lib/mysql:MySQL服务的根目录,从节点宿主机同理;

  • -v /data/mysql5.7master/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:指定MySQL服务的配置文件,从节点宿主机同理;

  • mysql:5.7:MySQL官方5.7 docker镜像。

MySQL从节点

180节点

1
2
3
4
5
6
7
8
docker run -d --restart=always --name mysql5.7slave1 \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD='密码' \
-p 3309:3306 \
-v /data/mysql5.7slave1/backupdir:/var/lib/backupdir \
-v /data/mysql5.7slave1/datadir:/var/lib/mysql \
-v /data/mysql5.7slave1/mysql.cnf:/etc/mysql/conf.d/mysql.cnf \
mysql:5.7

181节点

1
2
3
4
5
6
7
8
docker run -d --restart=always --name mysql5.7slave2 \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD='密码' \
-p 3309:3306 \
-v /data/mysql5.7slave2/backupdir:/var/lib/backupdir \
-v /data/mysql5.7slave2/datadir:/var/lib/mysql \
-v /data/mysql5.7slave2/mysql.cnf:/etc/mysql/conf.d/mysql.cnf \
mysql:5.7

进入Docker容器命令

1
2
3
4
5
6
7

#182节点
docker exec -it mysql5.7master bash
#180节点
docker exec -it mysql5.7slave1 bash
#181节点
docker exec -it mysql5.7slave2 bash

使用MySQL镜像客户端命令直接进入MySQL控制台

1
2
3
4
5
6
7
8
#182节点
docker run -it --link mysql5.7master:mysql --rm mysql:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

#180节点
docker run -it --link mysql5.7slave1:mysql --rm mysql:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

#181节点
docker run -it --link mysql5.7slave2:mysql --rm mysql:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

建立主从复制账户replicate

相当于给从节点建立一个MySQL服务账户,使其有权限可以进行数据拉取。所以仅需在主节点182执行如下SQL即可。

# 连接主节点182

1
docker run -it --link mysql5.7master:mysql --rm mysql:5.7 sh -c 'exec mysql -h"\$MYSQL_PORT_3306_TCP_ADDR" -P"\$MYSQL_PORT_3306_TCP_PORT" -uroot -p"\$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

SQL如下:

1
2
3
create user 'replicate'@'%' identified by '123456abc';
grant replication slave on *.* to 'replicate'@'%';
flush privileges;

查看主节点mysql状态,将其master_log_file、master_log_pos记录下来提供给从节点进行主从建立。

SQL如下:

1
show master status;

从节点开启主从复制功能

SQL如下:

1
2
3
4
5
6
7
8
9
10
11
stop slave;
change master to
master_host='10.10.10.235',
master_port=3309,
master_password='123456abc',
master_user='replicate',
master_log_file='mysql-bin.000003',
master_log_pos=749;

start slave;
show slave status\G;

简单介绍

  • stop slave;:停止从功能;
  • change master to 部分
  1. master_host=’10.10.10.235’:MySQL主节点所在服务器IP地址,此处因为我的是三台物理服务器,此处即写的是宿主机的IP地址,如果是只有一台宿主机,可以写docker网络中的主节点IP地址;

  2. master_port=3309:MySQL主节点所在服务器映射MySQL容器的端口号,如果是同一台宿主机,此处可以写容器中MySQL服务的3306端口;

  3. master_password=’123456abc’,master_user=’replicate’:主从复制账户名和密码;

  4. master_log_file=’mysql-bin.000003’,master_log_pos=749;:在主节点使用SQL命令show master status; 获取到的主节点信息。每次主节点产生变动都会变化,所以如果主从复制发生建立失败都要重新修改两个对应的值。

  • stop slave;:开启从功能;

  • show slave status\G;:查看是否建立主从复制成功,确保出现两个YES

然后就可以建立新数据库,查看是否同步

SQL如下:

1
2
3
4
#数据库名称使用横杠要加上``号
create DATABASE `box-db`;
create DATABASE boxtest;
create DATABASE db_bit;

主从复制即搭建完成

Mycat1.6读写分离

1
2
3
4
5
6
7
docker run -d --restart=always --name=mycat1.6 \
-v /etc/localtime:/etc/localtime \
-v /data/mycat1.6/schema.xml:/usr/local/mycat/conf/schema.xml \
-v /data/mycat1.6/server.xml:/usr/local/mycat/conf/server.xml \
-v /data/mycat1.6/rule.xml:/usr/local/mycat/conf/rule.xml \
-p 3306:8066 -p 9066:9066 \
mycat:1.6.6.1

schema.xml
server.xml
rule.xml

简单介绍

  • -d:后台运行;

  • --restart=always:允许跟随docker服务启动而启动;

  • --name mycat1.6:docker容器名称;

  • -v /etc/localtime:/etc/localtime:将服务器宿主机的时间挂载到容器中,实现时区同步;

  • -v /data/mycat1.6/schema.xml:/usr/local/mycat/conf/schema.xml:编写MySQL数据库的连接信息,对应的逻辑数据库指向MySQL的真实数据库;

  • -v /data/mycat1.6/server.xml:/usr/local/mycat/conf/server.xml:mycat逻辑数据库名称以对应MySQL中的真实数据库,mycat管理员账户和密码;

  • -v /data/mycat1.6/rule.xml:/usr/local/mycat/conf/rule.xml:mycat读写分离规则;

  • -p 3306:8066:mycat提供数据库功能的管理端口,在连接数据库客户端看来,这个就是数据库端口;

  • -p 9066:9066:mycat管理自身的数据库功能端口;

  • mycat:1.6.6.1:mycat镜像名称,注意,官方提供了Dockerfile进行制作镜像,具体的Dockerfile如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cat > Dockerfile << EOF
    FROM openjdk:8-jdk-stretch
    ENV JAVA_OPTS="-Xmx2048m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1536m -Xss2m"
    ENV CATALINA_OPTS="-Djava.awt.headless=true"
    ADD http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz /usr/local
    RUN cd /usr/local && tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz && ls -lna
    VOLUME /usr/local/mycat/conf
    VOLUME /usr/local/mycat/logs
    EXPOSE 8066 9066
    CMD ["/usr/local/mycat/bin/mycat", "console"]
    EOF

读写分离即安装完成