最近有公司有需求,需要在两台机器上使用docker的方式部署mysql,并部署成主从的方式。记录一下。
一、环境准备
准备两台机器A,B。
两台机器都是centos7,假设A内网是192.168.1.0,B内网是192.168.1.1。
二、准备主从mysql需要的配置文件
mysql_master.cnf
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql#log-error = /var/log/mysql/error.log# By default we only accept connections from localhostbind-address = 0.0.0.0port=3307# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0## 设置server_id,一般设置为IP,注意要唯一server_id=100## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)binlog-ignore-db=mysql# 如果备份多个数据库,重复设置这个选项即可binlog-do-db=my_db## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)log-bin=edu-mysql-bin## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存binlog_cache_size=1M## 主从复制的格式(mixed,statement,row,默认格式是statement)binlog_format=mixed## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。expire_logs_days=7## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062
mysql_slave.cnf
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql#log-error = /var/log/mysql/error.log# By default we only accept connections from localhostbind-address = 0.0.0.0port=3307# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0## 设置server_id,一般设置为IP,注意要唯一server_id=101## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)binlog-ignore-db=mysql# 如果备份多个数据库,重复设置这个选项即可binlog-do-db=my_db## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用log-bin=edu-mysql-slave1-bin## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存binlog_cache_size=1M## 主从复制的格式(mixed,statement,row,默认格式是statement)binlog_format=mixed## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。expire_logs_days=7## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062## relay_log配置中继日志relay_log=edu-mysql-relay-bin## log_slave_updates表示slave将复制事件写进自己的二进制日志log_slave_updates=1## 防止改变数据(除了特殊的线程)read_only=1
三、配置主mysql
1、安装mysql
拷贝mysql_master.cnf到机器A的/mnt/mysql/mysql_master.cnf,执行下列命令:
sudo docker run --net host --name mymysql -v /mnt/mysql:/var/lib/mysql -v /mnt/mysql/mysql_master.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=password --restart always -d mysql
2、配置
# 连接mysqldocker run -it --net host --rm mysql sh -c 'exec mysql -h "127.0.0.1" -P 3307 -uroot -ppassword'# 执行下列sqlcreate database my_db; CREATE USER 'slave'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; show master status;
执行show master status; 以后要记住File、Position两个参数,在配置从mysql的时候会用到。
mysql_slave.png
四、配置从mysql
1、安装mysql
拷贝mysql_slave.cnf到机器B的/mnt/mysql/mysql_slave.cnf,执行下列命令:
sudo docker run --net host --name mymysql -v /mnt/mysql:/var/lib/mysql -v /mnt/mysql/mysql_slave.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=password --restart always -d mysql
2、配置
# 连接mysqldocker run -it --net host --rm mysql sh -c 'exec mysql -h "127.0.0.1" -P 3307 -uroot -ppassword'# 执行下列sqlcreate database my_db;# master_log_file 对应 File# master_log_pos 对应 Positionchange master to master_host='192.168.1.0', master_user='slave', master_password='password', master_port=3307, master_log_file='edu-mysql-bin.000004', master_log_pos=2611, master_connect_retry=10; show slave status; start slave; show slave status;
五、测试
# 在主mysql创建表并插入数据create table hi_tb(id int(3),name char(10)); insert into hi_tb values(001,'bobu');
# 在从数据库检查可以看到已经有对应的数据show tables; select * from hi_tb;
作者:xsren
链接:https://www.jianshu.com/p/48928afdd9a1