Docker部署MySQL5.7主从复制结构

7 篇文章 0 订阅
6 篇文章 0 订阅

目录

准备

基于bin-log文件位置的主从复制

基于事务的主从复制


Mysql复制可以将一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。 默认情况下,复制是异步的,slave不需要永久连接以接收来自主站的更新。 根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。

MySQL中复制的优点包括:

横向扩展解决方案 - 在多个从站之间分配负载以提高性能。 在此环境中,所有写入和更新都必须在主服务器上进行。 但是,读取可能发生在一个或多个从站上。 该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
分析 - 可以在主服务器上创建实时数据,而信息的分析可以在从服务器上进行,而不会影响主服务器的性能。
远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。

MySQL 5.7支持不同的复制方法。 传统方法基于从主机的二进制日志复制事件,并要求其中的日志文件和位置在主机和从机之间同步。 基于全局事务标识符(GTID)的较新方法是事务性的,因此不需要处理这些文件中的日志文件或位置,这极大地简化了许多常见的复制任务。 只要在主服务器上提交的所有事务也已应用于从服务器,使用GTID进行复制可确保主服务器和从服务器之间的一致性。 

MySQL中的复制支持不同类型的同步。原始类型的同步是单向异步复制,其中一个服务器充当主服务器,而一个或多个其他服务器充当从服务器。这与作为NDB Cluster特征的同步复制形成对比。在MySQL 5.7中,除了内置的异步复制之外,还支持半同步复制。使用半同步复制,在返回执行事务的会话之前对主块执行提交,直到至少一个从服务器确认已接收并记录事务的事件为止。 MySQL 5.7还支持延迟复制,使得从属服务器故意滞后于主服务器至少一段指定的时间。

MySQL有两种核心类型的复制格式:基于语句的复制(SBR),复制整个SQL语句,以及基于行的复制(RBR),它仅复制已更改的行。 还可以使用第三种混合复制(MBR)。

下面介绍如何搭建不同类型的复制环境,包括配置,设置,操作等。

准备

首先根据《docker部署Mysql部署两个docker容器,容器名称分别命名为mysql,mysql_slave,也可以命名为其他名称,根据跟人喜好,只要能区分mysql容器,否则会导致混乱。将mysql作为主节点,mysql_slave作为从节点,开始搭建mysql主从节点集群。

基于bin-log文件位置的主从复制

基本原理是,MySQL主节点(数据源)将更新和更改作为“事件”写入bin-log,bin-log根据记录的数据库更改以不同的日志记录格式存储。 从节点配置为从主站读取二进制日志,并在从节点的本地数据库上执行二进制日志中的事件,达到数据复制的目的。

默认情况下,所有从节点复制主节点的所有执行事件,从节点来确定那些时间要执行,如果没有特别配置指定,从节点会执行所有的事件,如果需要,就需要指定从节点同步并执行部分数据库或者表写事件。

不能配置主节点只记录特定事件。

MySQL同时也支持多个slave节点同步一个主节点不同的数据,断开同步,回复同步。

配置基于bin-log文件位置的主从复制,主要配只有,1,主从服务器都打开bin-log;2,主从服务都设置唯一的server_id;3,主节点上创建同步账号,并授权。4,从节点上使用change master to语句配置主节点的IP或域名,端口,同步账号,同步账号密码,binlog名称,binlog位置这些信息。配置

1,mysql容器修改配置

在mysql容器的配置文件my.cnf中[mysqld]配置下增加

[mysqld]
log-bin=mysql-bin
server-id=1

2,mysql_slave容器修改配置

在mysql_slave容器的配置文件my.cnf中[mysqld]配置下增加

[mysqld]
log-bin=mysql-bin
server-id=2

3,重新启动mysql容器和mysql_slave容器

[root@ecs-7bc6-0001 ~]# docker restart {containerId}
[root@ecs-7bc6-0001 ~]# docker restart {containerId}

4,mysql上创建同步账号并授权

登入mysql容器

docker exec -it {containerId} /bin/bash

登入mysql中,创建账号backup并且授权。

mysql> CREATE USER 'backup'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%.example.com';
mysql> flush privileges;

5,mysql上通过以下命令锁定提交写操作,只能读不能写。且记录binlog文件名称和位置。

mysql> FLUSH TABLES WITH READ LOCK;

保持执行锁操作的客户端运行,用来让锁保持有效,因为客户端推出后锁就会释放。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     2198 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

如果主库已经有数据了,需要同步数据,需要将数据导出再导入到从库中去,推荐使用mysqldump,简单有效。

6,mysql_slave上增加配置,并启动

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='{masterip}',
    ->     MASTER_USER='{master同步用户名称}',
    ->     MASTER_PASSWORD='{master同步用户密码}',
    ->     MASTER_LOG_FILE='{binlog文件名称}',
    ->     MASTER_LOG_POS={binglog文件位置};
mysql> start slave;
mysql> show slave status\G;

出现

Slave_IO_Running: Yes
           Slave_SQL_Running: Yes

则基于binlog位置的主从同步成功。

7,测试

再mysql容器的master数据库创建数据库,创建表,插入数据。如下:

mysql> create database test1;
Query OK, 1 row affected (0.01 sec)

mysql> use test1;
Database changed
mysql> create table test1(name varchar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test1 values('apple'),('banana');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

发现从数据库中也有了主数据库创建的数据库,表以及插入的数据,如下:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test1              |
+--------------------+
6 rows in set (0.00 sec)

mysql> use test1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test1;
+--------+
| name   |
+--------+
| apple  |
| banana |
+--------+
2 rows in set (0.00 sec)

基于事务的主从复制

基于事务的主从复制,使用全局事务标识(GTID),识别和跟踪每个事务。在master节点上提交,有slave节点识别跟踪每个事务,使用事务,就不需要指定binlog的文件名称和位置,只要master节点的事务都在slave节点执行,即可保证数据一致性。基于事务的模式下,又可以分为基于语句的复制和基于行的复制,官方推荐是由基于行的复制。

1,mysql容器修改配置,两个容器都修改配置,增加配置

gtid_mode=ON
enforce-gtid-consistency=true
binlog_format=row

2,重新启动两个docker容器

3,mysql master上创建同步账号并授权。

4,mysql_slave同步。

登入mysql_slave命令行客户端执行。

mysql> CHANGE MASTER TO
     >     MASTER_HOST = host,
     >     MASTER_PORT = port,
     >     MASTER_USER = user,
     >     MASTER_PASSWORD = password,
     >     MASTER_AUTO_POSITION = 1;
mysql> start slave;

5,查看slave状态

mysql> show slave status\G;

出现

Slave_IO_Running: Yes
           Slave_SQL_Running: Yes

则同步成功。

(^_^)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值