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

it2022-05-05  108

目录

准备

基于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

则同步成功。

(^_^)


最新回复(0)