最近有公司有需求,需要在两台机器上使用docker的方式部署mysql,并部署成主从的方式。记录一下。
参考文章:
- docker下修改mysql配置文件 https://blog.csdn.net/wang704987562/article/details/73460005
- mysql主从 http://raye.wang/2017/04/14/mysqlzhu-cong-fu-zhi-da-jian-ji-yu-ri-zhi-binlog/
一、环境准备
准备两台机器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 localhost
bind-address = 0.0.0.0
port=3307
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-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 localhost
bind-address = 0.0.0.0
port=3307
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-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、配置
# 连接mysql
docker run -it --net host --rm mysql sh -c 'exec mysql -h "127.0.0.1" -P 3307 -uroot -ppassword'
# 执行下列sql
create 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、配置
# 连接mysql
docker run -it --net host --rm mysql sh -c 'exec mysql -h "127.0.0.1" -P 3307 -uroot -ppassword'
# 执行下列sql
create database my_db;
# master_log_file 对应 File
# master_log_pos 对应 Position
change 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;
网友评论