MySQL的集群主要有两个成熟方案:分布式集群
和主从集群
。 本文主要介绍MySQL的主从集群方案在Docker下的部署。
Docker下的MySQL主从集群部署,与直接通过启动MySQL server来部署是类似的。要注意的三个点是,配置文件、数据目录的映射、以及replica用户的创建。
以下将介绍最简单的单Master-单Slave的主从集群部署,需要增加Slave时,配置是类似的。
0x01 准备工作
在开始实操之前,我们首先建立一个工作目录,用于配置文件的存放和DB文件的存放:
> mkdir master_slave && cd master_slave
配置文件
首先新建两个配置文件,这两个配置文件在之后均会被重命名为my.cnf
,被mysqld所读取:
Master配置
新建master.cnf
:
> vi master.cnf
master.cnf
配置文件内容如下:
[mysqld]
server-id=1
binlog-ignore-db = "mysql"
binlog-format = mixed
log-bin=mysql-bin
datadir=/var/lib/mysql
innodb_flush_log_at_trx_commit=1
sync_binlog=1
Slave配置
新建slave.cnf
:
> vi slave.cnf
slave.cnf
配置文件内容如下:
[mysqld]
server-id=2
binlog-format=mixed
log_bin=mysql-bin
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1
数据存放目录
在工作目录下新建两个目录master_db
和slave_db
分别用于存放Master和Slave的数据。
> mkdir master_db && mkdir slave_db
执行完以上命令后,工作目录下应有以下文件和目录:
> ls
master.cnf master_db slave.cnf slave_db
创建子网
启动两个容器之前,我们先为集群创建一个子网段
,用于之后指定连个容器的静态IP和网段。
> docker network create --subnet=172.18.0.0/16 mysql_cluster
61692c855b9f405f69e42af272b6985b4188d404ee042c5ff7bef9d8d216264e
出现返回的子网ID值,说明子网创建成功。可运行以下命令检查子网创建是否成功:
> docker network ls
NETWORK ID NAME DRIVER SCOPE
cd02d1cfbf34 bridge bridge local
ddbfa3497c79 host host local
61692c855b9f mysql_cluster bridge local
c87cd569f510 none null local
可以看到,我们名为mysql_cluster
的子网已经创建成功。
0x02 启动
执行以下命令之前,请先确认当前工作目录为之前创建的master_slave
下。
启动Master节点
执行以下命令,启动Master节点:
> docker run -d --name=master \
-v $PWD/master_db:/var/lib/mysql \
-v $PWD/master.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root \
--net=mysql_cluster \
--ip=172.18.0.2 \
mysql:5.7
启动Slave节点:
执行以下命令,启动Slave节点:
> docker run -d --name=slave \
-v $PWD/slave_db:/var/lib/mysql \
-v $PWD/slave.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root \
--net=mysql_cluster \
--ip=172.18.0.3 \
mysql:5.7
建立repl账号
执行以下命令,进入master
容器,并执行mysql
命令,连接master数据库。(默认密码已通过环境变量配置为root
)
> docker exec -it master mysql -u root -p
连接数据库后,首先创建一个用于同步的账号repl
, 密码为slave123
。slave
的ip为172.18.0.3
:
mysql> create user repl@172.18.0.3;
mysql> grant replication slave on *.* to repl@172.18.0.3 identified by 'slave123';
mysql> flush privileges;
创建完repl
账户后,顺便执行show master status
命令,记录下查询到的信息。后面配置slave
时将会使用到。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000009 | 1389 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置Slave
执行以下命令,进入slave
容器,并执行mysql
命令,连接slave数据库。(默认密码已通过环境变量配置为root
)
> docker exec -it slave mysql -u root -p
接着执行以下sql语句,配置slave的master:
mysql> CHANGE MASTER TO MASTER_HOST='172.18.0.2',MASTER_USER='repl',MASTER_PASSWORD='slave123', MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=1389;
注意,以上信息,请根据之前查询到的master status来配置。
接着,激活slave:
mysql> start slave;
最后,查询slave状态:
mysql> SHOW SLAVE STATUS \G;
至此,我们的Mysql master-slave集群已经启动完成。
参考资料
MySQL 設定 Master-Slave Replication 同步
网友评论