「干货」Docker Mysql数据库高可用操作指南

一. 前言

最近公司基础平台架构做了些许调整,期间顺便弄了一下数据库的高可用的方案,一来记录一下,二来近期发表的文章贡献太少了,争取补上来~

二. 今天主题

正如标题上写的,今天给大家分享的内容,是如何基于Docker+Mysql来实现数据库主从同步方案,从而达到Mysql数据库高可用的目的 ,其中Docker只是辅助介绍,重点是Mysql如何实现高可用的方法介绍。

「干货」Docker Mysql数据库高可用操作指南

注:有的测试小伙伴会说,高可用这个不是开发或者是架构师的事吗,测试要关注这个干嘛?相信现在互联网发布到线上运营的产品大多都是高可用架构的,掌握产品架构的实现,可以帮助测试更好的掌握先机,再说,让你们多学点知识,总不见得是坏事吧〜

三. 具体操作

3.1 先建立数据存放目录(~/test/mysql_test/)

--mysql

--master

--data

--conf

--my.cnf

--slave

--data

--conf

--my.cnf

3.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的话表明仅支持可读。

3.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

3.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

3.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;

3.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,那说明没问题了。

四、数据库同步前的操作

4.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;

「干货」Docker Mysql数据库高可用操作指南

看到且记住相应文件名字和位置,下面会用到哦!

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;

「干货」Docker Mysql数据库高可用操作指南

在结果中看到:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

即可成功同步!

五、主从同步验证

5.1 如当前数据库情况如下:

「干货」Docker Mysql数据库高可用操作指南

5.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);

「干货」Docker Mysql数据库高可用操作指南

5.3、此时,进入从库容器中,查看:

「干货」Docker Mysql数据库高可用操作指南

确实已经将在master主库新建的数据库和表记录都同步过来了。

既然是主从同步,那反过来验证一下,在从库下插入记录后,会不会同步到主库中来呢?

在从库上操作插入记录:

insert into userinfo values('slave',20);

查看:

「干货」Docker Mysql数据库高可用操作指南

切到master主库中,查看:

「干货」Docker Mysql数据库高可用操作指南

发现在master主库中,还是只有一条记录,说明与预期设想的一样,在从库中插入记录,是不会同步到master主库中来的

再来一波,在主库master上,插入新记录:

insert into userinfo values('master',25);

「干货」Docker Mysql数据库高可用操作指南

在从库中,查看

「干货」Docker Mysql数据库高可用操作指南

发现在master主库中新加入的master记录,在从库中同步过来了。

到此,基于Docker Mysql数据库的主从同步效果就已经实现出来了,通过数据库主从同步方案的配置,从而达到数据库高可用的目的。

更多更优质的资讯,请关注我,你的支持会鼓励我不断分享更多更好的优质文章。求转发,谢谢~

本文中所涉及到操作图片,均来自于作者公众号中,均为合规取材。


分享到:


相關文章: