前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL基于GTID主从复制之半同步复制

MySQL基于GTID主从复制之半同步复制

作者头像
星哥玩云
发布2022-08-16 15:23:35
7200
发布2022-08-16 15:23:35
举报
文章被收录于专栏:开源部署开源部署

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 root@localhost 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 RedHat@'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线程后,会自动调转为半同步模式进行数据传输

关闭io线程 在master上再进行事务时会等待10s后从半同步状态转为异步。

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

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的文件已经转为数据库中的表。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档