Mysql 主从复制之半同步复制(基于gtid)

Mysql主从复制
mysql主从复制原理:
从库有两个线程IO线程和SQL线程
1.从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;
2.主库IO线程对比从库发送过来的master.info里的信息,将binlog文件信息,偏移量和binlog文件名等发送给从库
3.从库接收到信息后,将binlog信息保存到relay-bin中,同时更新master.info的偏移量和binlog文件名
4.从库的SQL线程不断的读取relay-bin的信息,同时将读到的偏移量和文件名写道relay-log.info文件,binlog信息写进自己的数据库,一次同步操作完成。
5.完成上次同步后,从库IO线程不断的向主库IO线程要binlog信息
6.从库如果也要做主库,也要打开log_bin 和log-slave-update参数
配置读写mysql主从复制的步骤:
1.在主库与从库都安装mysql数据库
2.在主库的配置文件(/etc/my.cnf)中配置server-id 和log-bin
3.在登陆主库后创建认证用户并做授权。
4.在从库的配置文件(/etc/my.cnf)中配置server-id
5.登陆从库后,指定master并开启同步开关。
需要注意的是server-id主从库的配置是不一样的。
Server-id存在作用:
mysql同步的数据中是包含server-id的,而server-id用于标识该语句最初是从哪个server写入的。因此server-id一定要有的
Server-id不能相同的原因:每一个同步中的slave在master上都对应一个master线程,该线程就是通过slave的server-id来标识的;每个slave在master端最多有一个master线程,如果两个slave的server-id 相同,则后一个连接成功时,slave主动连接master之后,如果slave上面执行了slave stop;则连接断开,但是master上对应的线程并没有退出;当slave start之后,master不能再创建一个线程而保留原来的线程,那样同步就可能有问题;
在mysql做主主同步时,多个主需要构成一个环状,但是同步的时候有要保证一条数据不会陷入死循环,这里就是靠server-id来实现的;
Mysql的主从复制(gtid)实验配置:

配置环境:rhel6.5 iptables selinx down
172.25.40.1 server1.example.com master
172.25.40.2 server2.example.com slave
安装包:mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
在master和slave上解压后安装mysql数据库:

tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
yum install -y mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm
 /etc/init.d/mysqld start
 grep ‘password‘ /var/log/mysqld.log
```      #筛选初始化是数据库登陆密码
登陆数据库后修改密码:
`alter user [email protected] identified by ‘xxxxxxx‘;` ##修改本地用户密码
1.Master端的操作:

vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
gtid_mode=ON #使用gtid模式
enforce-gtid-consistency=true #强制使用gtid

Slave端的操作:

[mysqld]
server-id=2
gtid_mode=ON
enforce-gtid-consistency=true

注意:在修改两台服务器的mysql配置文件时,一定要保证server-id必须是不同的,server-id的取值范围是:2^32-1
2.重新启动两台服务器上的mysql
` /etc/init.d/mysqld restart`
3.进入主库创建认证用户并授权
`grant replication slave on *.* to [email protected]‘172.25.40.%‘ identified by ‘xxxxxxxxxx‘;`
4.进入slave端指定master

stop slave;
change master to master_host=‘172.25.40.1‘,master_user=‘redhat‘,master_password=‘xxxxxxxxxx‘,master_auto_position=1;
start slave;


5.在设置半同步复制master端的操作

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
Query OK, 0 rows affected (0.50 sec)

mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like ‘%rpl_semi%‘;
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

6.5.在设置半同步复制slave端的操作

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
Query OK, 0 rows affected (0.14 sec)

mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like ‘%rpl_semi%‘;
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)

如果在slave端开启io线程后,会自动调转为半同步模式进行数据传输
![](http://i2.51cto.com/images/blog/201805/02/7687411e99cbec08048536a5589ece39.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

关闭io线程 在master上再进行事务时会等待10s后从半同步状态转为异步。
![](http://i2.51cto.com/images/blog/201805/02/3f2914d044166abddd25f04bacc788e1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

当第二次进行数据插入时会变成异步同步

![](http://i2.51cto.com/images/blog/201805/02/21df15b4774e91b721b9856d9355ea15.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

Mysql 并行复制
多线程工作
Slave端修改配置文件:

[mysqld]
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 #开启16个线程工作
master_info_repository=TABLE #以表的形式存放master_info的信息
relay_log_info_repository=TABLE #以表的形式存放relay_log_info的信息
relay_log_recovery=ON #


重启服务
`/etc/init.d/mysqld restart`
当进入数据库的mysql库中,可以执行sql语句:
`select * from slave_master_info;`
可以看到原本在/var/lib/mysql下的relay-log.info的文件已经转为数据库中的表。

原文地址:http://blog.51cto.com/12183531/2110349

时间: 2024-08-02 00:36:00

Mysql 主从复制之半同步复制(基于gtid)的相关文章

mysql主从复制、半同步复制、主主复制、及从库升级为主库讲解

一.主从复制结构 binlog dump --- io thread  ---  relay log ---- sql thread 1.总体讲解 主从复制时是异步的 半同步是在主从架构下安装插件来达到半同步的 半同步的优点:保证至少一个节点的数据和主节点的数据一致,缺点影响性能 导致主从不同步的原因是 现在的服务器都是单核多线程或者多核多线程,导致主节点可以同时执行多条读写操作,而记录二进制日志则必须按顺序有先后的记录,从节点在一条一条复制过去,生成中继日志,再执行语句. 多个库复制的话,可以

MySQL主从复制、半同步复制和主主复制

同步,异步,半同步复制的比较: 同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕.缺点:完成一个事务可能会有很大的延迟. 异步复制:当Slave准备好才会向Master请求binlog.缺点:不能保证一些事件都能够被所有的Slave所接收. 半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录.它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交.

第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

Linux运维 第四阶段 (七)MySQL REPLICATION(主从复制.半同步复制.复制过滤) 一.MySQL Replication相关概念: 1.复制的作用:辅助实现备份:高可用HA:异地容灾:分摊负载(scaleout):rw-spliting(mysql proxy工作在应用层). 2.master有多个CPU允许事务并行执行,但往二进制日志文件只能一条条写:slave比master要慢:master-slave默认异步方式传送. 3.半同步:仅负责最近一台slave同步成功,其它

Mariadb主从复制,半同步复制,主主复制

文章内容概览 主从复制介绍 主从复制的作用 复制工作流程 复制时应该注意的问题 主从复制配置 半同步复制配置 复制过滤器方法说明和配置 双主(主主复制)配置 文章环境说明 操作系统: [[email protected] ~]# cat/etc/redhat-release CentOS release 6.6 (Final) [[email protected] ~]# uname -r 2.6.32-504.el6.x86_64 [[email protected] ~]# uname -m

MySQL主从复制:半同步、异步

MySQL主从复制:半同步.异步 大纲 前言 如何对MySQL进行扩展? MySQL Replication WorkFlow MySQL主从复制模式 实战演练 MySQL异步复制实现 MySQL半同步复制实现 实验中的思考 总结 前言 本篇我们介绍MySQL Replication的相关内容, 我们首先介绍MySQL CLuster的实现原理和如何一步步构建一个MySQL Replication Cluster 看懂本文需要了解: MySQL基本操作,MySQL日志类型及其作用 如何对MySQ

MySQL基于SSL的主从复制、半同步复制

(一)主从复制的架构图 1.在主数据库上,每执行一个有可能引起数据库发生改变的的语句,都会记录到二进制日志文件中,并把它们保存为事件. 2.每保存一个事件,我们就通过mysql的服务器3306端口发送给另外一台服务器 3.另外一台服务器把这个事件接收下来,接收的时候先保存到本地的中继日志里面 4.然后,mysql从中继日志文件里读一个事件,然后保存到数据文件 (二)一主多从 半同步架构图 1.Master和Slave-1在同一个机房 2.Slave-2和Slave-3在其它机房 3.半同步指的是

MySQL数据的主从复制、半同步复制和主主复制详解

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环

mysql数据库备份,主从复制及半同步复制

1.使用mysqldump备份数据库并通过备份及二进制日志还原数据(备份完后再写入数据,然后再删库) mysqldump -A --single-transaction -F --master-data=2 > /data/backup/mysql.sql -A备份所有数据库,--single-stransaction开启事务备份 -F 刷新日志 --master-data=2记录二进制日志位置 备份前数据库 在表里插入新记录,不在完全备份当中 删库 mysql -e 'drop databas

mysql主从之半同步复制和lossless无损复制

一 MySQL 的三种复制方式 1.1 简介 asynchronous 异步复制 fully synchronous 全同步复制 Semisynchronous 半同步复制 从MySQL5.5 开始,MySQL 以插件的形式支持半同步复制. 1.2 异步复制(Asynchronous replication) MySQL 默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash 掉了,此时主上已经提交的事务可