前提条件:
(1).先确保已经安装好了两个mysql容器. 我系统是用了ubuntu20.4,容器是用dnmp集成安装环境创建的.
如果你和我一样用的是dnmp,你应该知道怎么修改docker-compose.yml文件才能创建两个mysql的容器,下面是我修改的,其实就是照着原有的mysql节点写的,改容器名字,volumesmysql:
image: mysql:${MYSQL_VERSION}
container_name: mysql
ports:
- "${MYSQL_HOST_PORT}:3306"
volumes:
- ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
- ${DATA_DIR}/mysql:/var/lib/mysql/:rw
restart: always
networks:
- default
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
TZ: "$TZ"
mysql_2:
image: mysql:${MYSQL_VERSION}
container_name: mysql_2
ports:
- "3307:3306"
volumes:
- ./services/mysql/mysql_2.cnf:/etc/mysql/conf.d/mysql.cnf:ro
- ./data/mysql_2:/var/lib/mysql/:rw
restart: always
networks:
- default
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
TZ: "$TZ"
(2)mysql配置文件修改.
我把mysql容器作为主,mysql_2容器作为从
主配置文件mysql.cnf添加了
#主从配置相关
log_bin=/var/lib/mysql/mysql-bin.log
server-id=1
#如果复制多个数据库,重复设置这个选项即可,从机设置replicate_do_db
binlog_do_db=abc
#忽略同步的数据库也可用,从机设置replicate_ignore_db
binlog-ignore-db=mysql
从配置文件mysql_2.cnf
#从机设置
log_bin=/var/lib/mysql/mysql-bin.log
server-id=2
replicate-do-db=abc #待同步的数据库
replicate-ignore-db=mysql #不同步的数据
(3).手动同步一次数据库. 我的两个容器都有一个新建的数据库abc,都是没有任何表的就不同步了.同步也很简单,借助navicat的数据传输很容易就做到
(4).记录主机的ip ,我用sudo docker inspect mysql|grep IPAddress查看了作为主机的mysql容器的ip
172.18.0.2就是我要的
第一部分:主机器的设置
(1).登录主机的mysql新建同步用的账户,查看master信息
用root登陆主机,依次执行下面的sql
create user 'repl'@'%' identified with mysql_native_password by 'repl123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
这里的%是主机的ip,这里我完全可以换成 172.18.0.2
查看一下master的状态 ,记录相关信息,设置从机的时候要用到
(2)测试刚生成的同步账户
能够登录的话说明同步用的账户是没问题的,顺便罗嗦一下每做一步关键的操作要核实是否生效了,不然到了最后一大堆的问题缠绕你,需要一步步的排查是很痛苦的.
第二部分:从机器的设置
(1).测试同步用的账户
进入从机器的mysql 容器mysql_2
说明在从机器上使用同步用的账户是没问题的,要注意的是这里的ip是主机器的ip,这一步没通过的话会有问题 Last_IO_Error: error connecting to master 'replication@…
(2).实现主从同步
用从机mysql_2的root登录,执行
change master to
master_host='172.18.0.2',
master_user='repl',
master_password='repl123456',
master_log_file='mysql-bin.000007',
master_log_pos=811;
#这里的master_user,master_password是之前创建的同步用的账户和密码
#master_host是主机器的ip
#master_log_file和master_log_pos是第一部分(1) 里记录的File和Position
执行start slave; #开启从库 (stop slave:关闭从库)
执行show slave status; #检查服务器状态
看到Slave_IO_State为Waiting for master to send event
Slave_IO_Running为Yes
Slave_SQL_Running为Yes基本可以断定设置成功了
(3)验证主从同步是否生效
在主库建个表试试
create table `abc`.`tb` (
`id` int(10) not null,
`content` varchar(255) null,
primary key (`id`)
);
从机上刚开始执行show tables是空的,主机上建表后,从机上也就有表了,说明同步是成功的!
缺少图片的可以看百家号上发布的
http://baijiahao.baidu.com/builder/preview/s?id=1672887750965452403