Docker----基于docker搭建mysql主从复制,延迟复制

基于Docker的Mysql主从复制搭建

  • 资源有限
  • 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐
  • 一台机器上可以运行多个Docker容器
  • Docker容器之间相互独立,有独立ip,互不冲突
  • Docker使用步骤简便,启动容器在秒级别

因为本人实在本地进行搭建的,所以本次会用docker内网地址进行主从连接

master slave
ip: 172.17.0.2 ip: 172.17.0.3
  • 可以使用docker inspect 容器名进行查看docker地址

1.利用Docker搭建主从服务器

1.第一步,先创建一个简单的容器,将容器里面的/etc/mysql文件夹拷贝到本地

  • 我将拷贝出来的mysql文件夹修改为config文件夹,放置在我本地的/docker/mysql-master/文件夹下
docker run --name mysql -d registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_dev:mysql5.7.21

2.搭建完整的mysql容器
1.mysql-master(主):

docker run -d --name mysql-master --restart always -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql-master/config/:/etc/mysql -v /docker/mysql-master/data/:/var/lib/mysql -p 3316:3306 registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_dev:mysql5.7.21

2.mysql-slave(从):

docker run -d --name mysql-slave --restart always -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql-slave/config/:/etc/mysql -v /docker/mysql-slave/data/:/var/lib/mysql -p 3317:3306 registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_dev:mysql5.7.21

2.配置master(主)

1.修改本地的/docker/mysql-master/config/mysql.conf.d的mysqld.cnf文件

  • 对应容器中的/etc/mysql/mysql.conf.d/mysqld.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	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# 开启二进制日志功能
log-bin=mysql-bin
# 定义mysql支持的语法类型
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# 一般设置为IP,同一局域网内注意要唯一
server_id=1
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

2.配置完成后重启 mysql ,使用如下命令:

docker restart mysql-master

3.接下来创建数据同步用户:
1.进入数据库内:

docker exec -it mysql-master bash

2.登录数据库:

mysql> mysql -u root -p

3.增加mysql主从账号:

mysql> grant replication slave on *.* to repl@'172.17.0.%' identified by '123456';
 mysql> flush privileges;

4.查看查看log_bin选项:
log_bin 是on 代表开启

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/lib/mysql/mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+
6 rows in set (0.00 sec)

5.查看master状态:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1607 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 接下来会用到master状态中的值进行主从连接

3.配置slave(从)

1.修改配置文件:

[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	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#开启二进制日志功能
log-bin=mysql-slave-bin
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

server_id=2
binlog-ignore-db=mysql
log_slave_updates=1

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
  • 保存之后重启数据库

2.进入从mysql配置主从连接

1.主从同步连接

mysql> change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000002', master_log_pos=1607, master_connect_retry=30;  

命令解释:

master_host: Master 的IP地址
master_user: 在 Master 中授权的用于数据同步的用户
master_password: 同步数据的用户的密码
master_port: Master 的数据库的端口号
master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的master状态中的 File 字段的值
master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
  • 上文中提到,因为本人是在本地进行的搭建,所以用docker内网地址进行的连接,端口使用的是默认的3306,如果要是使用ip地址进行连接,请将master_host='172.17.0.2'换成ip地址,端口则换成宿主机映射的端口即可。

2.在 Slave 的 MySQL 终端执行查看主从同步状态

show slave status \G;

显示如下,简单的一部分:

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.2
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 1339
               Relay_Log_File: 17ca0a0f1e57-relay-bin.000002
                Relay_Log_Pos: 856
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
  • Slave_IO_Running 和 Slave_SQL_Running 是No,表明 Slave 还没有开始复制过程。相反 Slave_IO_Running 和 Slave_SQL_Running 是Yes表明已经开始工作了,因为我已经运行过了,所以我的显示的都是 Yes。

3.执行以下命令,开始开启主从同步:

start slave;
  • 执行之后再次查看,发现SlaveIORunning 和 SlaveSQLRunning 已经变成Yes,证明成功,。

4.验证
1.master操作,创建一个test数据库,和usertb表,并插入一行数据

mysql> create database test;
mysql> use test;
mysql> create table usertb ( username varchar(20) not null, password varchar(20) not null);
mysql> insert into usertb values ('user1','111');
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+

2.slave操作,查询数据正常同步过来

mysql> select * from test.usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+
1 row in set (0.00 sec)

3.延迟复制配置

  • 延迟复制配置,通过设置slave上的 MASTER TO MASTER_DELAY参数实现。
  • CHANGE MASTER TO MASTER_DELAY = N;
  • N为多少秒,该语句设置从数据库延时N秒后,再与主数据库进行数据同步复制。

1.配置延迟一分钟

mysql> stop slave;
mysql> change master to MASTER_DELAY = 60;
mysql> start slave;

2.测试,在主库插入如下一条数据

mysql> insert into usertb values ('user2','222');

3.数据插入后,在主节点可以很快查询到,但是从节点需要60秒后才会查询到,如果你配置完成后的效果是这样的,那就说明mysql5.7延迟复制配置成功了。

mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
| user2    | 222      |
+----------+----------+
2 rows in set (0.01 sec)

4.查看SQL_Delay的值为60,表示设置成功
查看方法就是show slave status \G;

 mysql> show slave status \G;
 Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 60
  • 注释
  • SQL_Delay:一个非负整数,表示秒数,Slave滞后多少秒于master。
  • SQL_Remaining_Delay:当 Slave_SQL_Running_State 等待,直到MASTER_DELAY秒后,Master执行的事件。
  • 此字段包含一个整数,表示有多少秒左右的延迟。在其他时候,这个字段是NULL。

5.延迟复制原理解析

  • mysql的延迟复制实际上影响的只是SQL线程将数据应用到从数据库,而I/O线程早已经把主库更新到数据写入到了从库的中继日志中,因此,在延迟复制期间即使主库down掉了,从库到了延迟复制的时间,依然会把数据更新到和主库down机时一致。

猜你喜欢

转载自blog.csdn.net/weixin_44006354/article/details/103651843