同一台机器用docker实现mysql的主从同步

1.创建映射的文件夹已经配置文件

/usr/mysql/mysql-master/my.cnf  (配置文件)
/usr/mysql/mysql-master/conf.d
/usr/mysql/mysql-master/data

 

/usr/mysql/mysql-slave/my.cnf  (配置文件)
/usr/mysql/mysql-slave/conf.d
/usr/mysql/mysql-slave/data

 

2.编写配置文件

2.1  编写/usr/mysql/mysql-master/my.cnf     

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
pid-file		= /var/run/mysqld/mysqld.pid
socket			= /var/run/mysqld/mysqld.sock
datadir			= /var/lib/mysql
#log-error		= /var/log/mysql/error.log
#bind-address   = 127.0.0.1
expire_logs_days = 7
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=200
slow_query_log = ON
slow_query_log_file = /mnt/data/mysqlData/mysql/sql.log
long_query_time = 1
lower_case_table_names = 1
event_scheduler = ON
server-id = 3310
log-bin = mysql-bin
explicit_defaults_for_timestamp

[client]
default-character-set=utf8

2.2  编写/usr/mysql/mysql-slave/my.cnf

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
pid-file		= /var/run/mysqld/mysqld.pid
socket			= /var/run/mysqld/mysqld.sock
datadir			= /var/lib/mysql
#log-error		= /var/log/mysql/error.log
#bind-address   = 127.0.0.1
expire_logs_days = 7
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=200
slow_query_log = ON
slow_query_log_file = /mnt/data/mysqlData/mysql/sql.log
long_query_time = 1
lower_case_table_names = 1
event_scheduler = ON
server-id = 3311
log-bin = mysql-slave-bin
relay_log=edu-mysql-relay-bin
explicit_defaults_for_timestamp

[client]
default-character-set=utf8

 

3.安装docker,以及下载mysql镜像(如果没有安装过的话)

 

yum install docker
systemctl start docker
docker pull mysql:5.7

 

4.启动master数据库和slave数据库

-name :容器命名为mysql_server_3310
-p :将容器的3306端口映射到宿主机的3310端口(slave将容器的3306端口映射到宿主机的3311端口)
-d : 后台运行
--restart=always : docker重启后,容器也随之启动
-v :目录挂载
-e MYSQL_ROOT_PASSWORD :初始化root账号的密码为123456

 

docker run --name mysql_server_3310 -d -p 3310:3306 --restart=always -v /usr/mysql/mysql-master/data/:/var/lib/mysql -v /usr/mysql/mysql-master/conf.d:/etc/mysql/conf.d -v /usr/mysql/mysql-master/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


docker run --name mysql_server_3311 -d -p 3311:3306 --restart=always -v /usr/mysql/mysql-slave/data/:/var/lib/mysql -v /usr/mysql/mysql-slave/conf.d:/etc/mysql/conf.d -v /usr/mysql/mysql-slave/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 

5.关联master和slave

5.1  在master服务器中进入mysql查看master状态

-- 进入mysql
docker exec -it mysql_server_3310 /bin/bash
mysql -uroot -p123456

--  创建用户slave,密码123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

-- 授予slave用户 `REPLICATION SLAVE`权限和`REPLICATION CLIENT`权限,用于在`主` `从` 数据库之间同步数据
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-- 授予所有权限则执行命令: GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%';

-- 使操作生效
FLUSH PRIVILEGES;


-- 查看状态
show master status; 

注:File和Position字段的值slave中将会用到,在slave操作完成之前不要操作master,否则将会引起状态变化,即File和Position字段的值变化 !!!

 

注:在给用户授权时,mysql出现如下报错:

Last_SQL_Error: Error 'Operation CREATE USER failed for 'slave'@'%'' on query. Default database: ''. Query: 'CREATE USER 'slave'@'%' IDENTIFIED BY PASSWORD '*2F7A17C3E76FB561456B2111C0E78CFB5E5030A5''

这个报错的原因可能是由于:(1)已创建过该用户 (2)已有该用户的授权信息
解决方法:

删除此用户,刷新,并重启slave

#删除该用户
mysql> drop user 'slave'@'%';
 
mysql> FLUSH PRIVILEGES;
 
# 重启同步
mysql> stop slave;
 
mysql> start slave;
 
# 最后查看是否同步正常
mysql> show slave status\G

 

5.2  在slave服务器中进入mysql,启动主从同步

master_host :master服务器地址(公网ip或者Navicat for MySQL填的ip地址)
master_port :端口号
master_user :用于数据同步的用户(之前在master中创建授权的用户)
master_password :用于同步用户的密码
master_log_file :指定slave从哪个日志文件开始复制数据,即之前提到的File字段值
master_log_pos :从哪个Position开始读,即之前master中的Position字段值,0则是从头开始完整的拷贝master库
master_connect_retry :连接失败时重试的时间间隔,默认是60秒

docker exec -it mysql_server_3311 /bin/bash
mysql -uroot -p123456

change master to master_host='47.98.172.34',master_port=3310, master_user='slave', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos= 769, master_connect_retry=30;

# 开启主从同步过程  【停止命令:stop slave;】
start slave;

5.3 查看主从同步状态

show slave status \G;

 

如下Slave_IO_RunningSlave_SQL_Running 都是Yes的话,就说明主从同步已经配置好了!

 

注意:

Slave_IO_State 如果是Waiting for master to send event,那么就成功一半了,如果是Connecting to master,基本就是配置失败了,建议重新检查下配置,具体失败的原因可以查看日志追踪 或者Last_IO_Error字段

 

我们说成功一半,并没有说成功了,那么另一半在于Slave_IO_Running与Slave_SQL_Running

如果都是Yes,那么恭喜你,可以测试主从复制的效果了,如果有一个不是Yes,一半是重启从容器后,事务回滚引起的,那么给出解决方法如下

 

stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;

执行后,再次观察三个关键字段应该就都没问题了

至此,一主一从已经搭建完成,再添加从实例的方式与上文一致,这里就不在赘述了。

 

6.测试主从复制

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章