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

序言

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

环境需求

  • Docker

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

唯一要求

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

Docker

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

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

MySQL主从搭建

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

182下的mysql.cnf

[mysqld]

#唯一id,如果开启主从功能则每台MySQL节点不能相同

server-id = 1

#开启mysql-log-bin功能

log-bin=mysql-bin

180下的mysql.cnf

[mysqld]

#唯一id,如果开启主从功能则每台MySQL节点不能相同

server-id = 2

#开启mysql-log-bin功能

log-bin=mysql-bin

181下的mysql.cnf

[mysqld]

#唯一id,如果开启主从功能则每台MySQL节点不能相同

server-id = 3

#开启mysql-log-bin功能

log-bin=mysql-bin

MySQL主节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

182节点

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从节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

180节点

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节点

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
8
9
10
11
12
13

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
9
10
11
12
13

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即可。

# 连接MySQL控制台

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
4
5
6
7

create user 'replicate'@'%' identified by '123456abc';

grant replication slave on *.* to 'replicate'@'%';

flush privileges;

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

SQL如下:

1
2

show master status;

从节点开启主从复制功能

SQL如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

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

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;

  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
5
6

create DATABASE `box-education`;

create DATABASE boxtest;

create DATABASE db_benefit;

数据库名称使用横杠要加上``号

主从复制即搭建完成

Mycat1.6读写分离

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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

简单介绍

  • -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
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    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

读写分离即安装完成

结尾语

如果需要MySQL服务的mysql.cnf和mycat的schema.xml、server.xml和rule.xml的具体配置请按照主页的联系方式进行沟通。