linux怎么查看本机内存大小
249
2022-10-25
【干货】Docker Mysql数据库主从同步配置详细
一. 说之前
前两天 MTSC 2018 在北京国际会议中心圆满召开,并取得非常好的反响,虽然临时有事,没去成,但还是非常赞许为此会议付出的朋友和小伙伴们~
二. 背景
三. 今天分享啥
没错,正如标题上写的,今天会先给大家讲一下,如何《基于docker+mysql实现主从同步配置方法》 ,当然docker只是辅助,重点是Mysql如何实现高可用的方法。
注:有的测试小伙伴会说,这个不是开发或者是架构师的事吗,测试要关注这个干嘛?现在互联网正式在线上运营的产品我相信都是高可用架构的,掌握产品架构的实现,帮助测试更好的掌握先机,再说,让你们多学点知识,总不见得是坏事吧〜
四. 具体操作
4.1 先建立数据存放目录(~/test/mysql_test/)
--mysql --master --data --conf --my.cnf --slave --data --conf --my.cnf
4.2 准备好 Mysql Master(主库)和Mysql Slave(从库)的my.cnf文件
Master my.cnf 配置文件:
[mysqld] server_id = 1 log-bin= mysql-bin read-only=0 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/
Slave my.cnf 配置文件:
[mysqld] server_id = 2 log-bin= mysql-bin read-only=1 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/
注:在本文中,由上述my.cnf配置文件可得知,主从同步针对的数据库(除了mysql,sys,information_schema,performance_schema这些以外)的其它所有数据库都会进行同步(含数据库、表、数据等)
小结:
由上述master my.cnf和slave my.cnf配置文件中可知,两者的区别主要在于server_id和read-only值不同 server_id标识服务实例,master和slave值需要保证唯一 read-only中值为0表示支持可读写、1的话表明仅支持可读
4.3 创建master主容器
docker run --name mastermysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/master/data:/var/lib/mysql -v ~/test/mysql_test/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
4.4 创建slave从容器
docker run --name slavemysql -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/slave/data:/var/lib/mysql -v ~/test/mysql_test/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
4.5 master容器设置
//进入master容器 docker exec -it mastermysql bash //启动mysql命令,刚在创建窗口时我们把密码设置为:root mysql -u root -p //创建一个用户来同步数据,每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE 权限。 CREATE USER 'slave'@ '%' IDENTIFIED BY '123456'; (其实可省略) GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456'; //这里表示创建一个slaver同步账号slave,允许访问的IP地址为%,%表示通配符 //查看状态,记住File、Position的值,在Slave中将用到 show master status/G;
4.6 slave容器设置
//进入slaver容器 docker exec -it slavemysql bash //启动mysql命令,刚在创建窗口时我们把密码设置为:root mysql -u root -p //设置主库链接 change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306; //启动从库同步 start slave; //查看状态 show slave status\G;
如果 show slave status\G命令结果中出现: Slave_IO_Running: Yes Slave_SQL_Running: Yes 以上两项都为Yes,那说明没问题了。
五、注意事宜
5.1 首先在主从没有生效的时候,要保持两台服务器数据库、表相同,数据相同
那如何实现主从库在开始之间的同步呢,别怕,继续看〜
master容器上执行:
mysqldump -uroot -p --all-databases >/root/all_database.sql
将all_database.sql拷贝到从库中来,在slave从库容器上执行:
mysql -uroot -p 如此两步骤,主库和从库数据会追加相平,保持同步! 再此过程中,若主库存在业务,在同步的时候要先锁表,让其不要有修改! #如需要,可以master容器中,执行以下命令锁定数据库以防止写入数据。mysql>FLUSH TABLES WITH READ LOCK; 等待主从数据追平,主从同步后在打开锁! #解锁数据表。
mysql>UNLOCK TABLES; 主从数据追平后,定位好从库到主库日志的文件名字,和相应的位置 master主库运行: mysql> show master status\G; 看到且记住相应文件名字和位置,下面会用到哦! slave从库运行: #设置主库链接
change master to master_host='172.17.0.9',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=2037,master_port=3306;
#执行从库同步
start slave;
#查看从库同步状态
show slave status\G; 在结果中看到: Slave_IO_Running: Yes
Slave_SQL_Running: Yes 即可成功同步! 六、主从同步验证 6.1 如当前数据库情况如下: 6.2、在master主库容器中,创建数据库master_demo,并在此库下创建表userinfo,并插入一条记录 create database master_demo;
use master_demo;
create table userinfo(username varchar(50),age int);
insert into userinfo values('Tom',18); 6.3、此时,进入从库容器中,查看: 确实已经将在master主库新建的数据库和表记录都同步过来了。 既然是主从同步,那反过来验证一下,在从库下插入记录后,会不会同步到主库中来呢? 在从库上操作插入记录: insert into userinfo values('slave',20); 查看: 切到master主库中,查看: 发现在master主库中,还是只有一条记录,说明与预期设想的一样,在从库中插入记录,是不会同步到master主库中来的 再来一波,在主库master上,插入新记录: insert into userinfo values('master',25); 在从库中,查看 发现在master主库中新加入的master记录,在从库中同步过来了。 到此,基于docker mysql数据库的主从同步配置,验证到此结束,命令、配图给的如此详细,还不来点个赞~ 七. 未完待续 接下来,还会给大家介绍的有 《Docker Mysql数据库实现双主同步配置详细》
《Docker Mongo数据库实现主从同步配置详细》
《Docker Mongo数据库实现主主同步配置详细》
《Docker +Nginx+Keepalived实现架构高可用》
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~