Docker 安装 MySQL数据库 实现主从复制

安装mysql镜像,并启动两个容器,分别命名为master\slave1

docker pull mysql

docker run --name master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=masterRoot -d mysql

docker run --name slave1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=slave1Root -d mysql

--

查看master的ip

docker inspect --format='{{.NetworkSettings.IPAddress}}'  f7e6499911c8

172.17.0.3

--

修改master配置文件my.cnf
在[mysqld]配置中添加两个配置

log-bin         = mysql-bin
server-id		= 1

修改slave1配置文件my.cnf
在[mysqld]配置中添加两个配置

log-bin         = mysql-bin
server-id		= 2

--

在master数据库中创建用来同步数据的用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';  

REPLICATION SLAVE 常用于建立复制时所需要用到的用户权限,也就是slave server必须被master server授权具有该权限的用户,才能通过该用户复制。
并且"SHOW SLAVE HOSTS"这条命令和REPLICATION SLAVE权限有关,否则执行时会报错:

ERROR 1227 (42000): Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s) for this operation

REPLICATION CLIENT 不可用于建立复制,有该权限时,只是多了可以使用如"SHOW SLAVE STATUS"、"SHOW MASTER STATUS"等命令。

--

mysql> show master status
    -> ;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
 
mysql> 

--

在slave1中执行

change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=156, master_connect_retry=30;  

这里需要注意下,master_host用master容器的ip,master_port是3306,master_log_file是上面master的show master status的File,master_log_pos则是Position。

我一开始以为master_port是主机映射到master容器的端口3307,搞了半天也搞不通。

--
主从同步完成。

--

TODO
读写分离


建议用 compose,有几点改进:

  1. 配置文件改好挂进去,而不是启动容器之后再改
  2. 把数据通过数据卷挂出来,容器没了数据不丢
  3. compose 下可以用 link 参数,这个参数将容器名/容器 ip 写到 hosts 里,这样就不用去找 ip 了
2020/10/21 posted in  Docker