数据库半同步模式
数据库半同步复制模式
前置准备
-
配置情况
-
主机 说明 192.168.4.51 主数据库服务器 192.168.4.52 从数据库服务器 192.168.4.1 从数据库服务器
-
-
说明
- 先搭建一主多从架构
-
过程
#4.51备份数据给4.52 4.1 开启binlog日志
mysql -uroot -p
create database db1;
create table db1.s(id int auto_increment primary key, name varchar(10) not null);
insert into db1.s(name) values('jack');
exit
mysqldump -uroot -p -B db1 > 1db1.sql #先备份一份
scp 1db1.sql root@192.168.4.52:/root/ #先给4.52一份
vim /etc/my.cnf
===================
[mysqld]
server_id=51
log-bin=db51
===============================
systemctl restart mysqld
mysqldump -uroot -p --master-data -B db1 > 2db2.sql #主要测试--master-data用处
scp 2db1.sql root@192.168.4.1:/root/ #这份给4.1
mysql -uroot -p
grant replication slave on *.* to look@'%' identified by '123abc...A';
#授权同步用户look
#4.52恢复数据 配置主从同步
mysql -uroot -p < 1db1.sql #直接导入了
vim /etc/my.cnf
===============
[mysqld]
server_id=52 #配置不同id
=========================
systemctl restart mysqld #重启服务
mysql -uroot -p
change master to
master_host='192.168.4.51',
master_user='look',
master_password='123abc...A',
master_log_file='db51.000001',
master_log_pos=154 #主那边show master status 看
start slave; #开启
show slave status; #查看IO SQL是否启动
#4.1恢复数据 配置主从同步
mysql -uroot -p < 2db1.sql #直接导入
ERROR 1794 (HY000) at line 22: Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.
#--master-data 参数作用出来了。。。。没有配置server_id无法导入。。。
vim /etc/my.cnf
==================
[mysql]
server_id=1
==========================
systemctl restart mysqld
mysql -uroot -p < 2db1.sql #现在可以成功导入了
grep 'CHANGE MASTER TO' 2db1.sql #查看偏移量
CHANGE MASTER TO MASTER_LOG_FILE='db51.000001', MASTER_LOG_POS=154;
mysql -uroot -p
change master to
master_host='192.168.4.51',
master_user='look',
master_password='123abc...A',
master_log_file='db51.000001',
master_log_pos=154
start slave; #启动
show slave status; #查看IO线程 SQL线程
#4.51测试
mysql -uroot -p
insert into db1.s(name) values ('Tom');
#4.52查看
mysql -uroot -p
select * from db1.s;
+----+------+
| id | name |
+----+------+
| 1 | jack |
| 2 | Tom | #有了
+----+------+
#4.1查看
mysql -uroot -p
select * from db1.s;
+----+------+
| id | name |
+----+------+
| 1 | jack |
| 2 | Tom | #有了
+----+------+
说明 --master-data备份的数据会有主从语句 change master to master_log_file=xxxx master_log_pos=xxxx 这个语句 所以需要配置server_id才能导入 指定的时候这两个参数可以省略 因为已经有了
半同步配置过程
从mysql5.5开始,mysql以插件的形式支持半同步复制
区别
- 对于异步复制:
- 主库将事务binlog事件写入到binlog文件中,此时主库只会通知一下dump线程发送这些新的binlog,然后主库就会继续处理提交操作,而此时不会保证这些binlog传到任何一个从库节点上
- 对于全同步复制:
- 当主库提交事务之后,所有的从库节点必须全部收到,APPLY并且提交这些事务,然后主库线程才能继续做后续操作。这里面有一个很明显的缺点就是,主库完成一个事务的时间被拉长,性能降低。
- 对于半同步复制:
- 是介于全同步复制和异步复制之间的一种,主库只需要等待至少一个从库节点收到并且Flush binlog到relay-log文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全执行并且提交的反馈,这样就节省了很多时间。
半同步复制具体特性
- 从库会在连接到主库时告诉主库,它是不是配置了半同步
- 如果半同步复制在主库端是开启的,并且至少有一个半同步复制的从库节点,那么此时主库的事务线程在提交时会被阻塞并等待,两种结果,要么至少一个从库节点通知它已经收到了所有这个事务的binlog事件,要么一直等待直到超过配置的某一个时间点为止,而此时,半同步复制将自动关闭,转换为异步复制
- 从库节点只有在接收到某一个事务的所有binlog,并将其写入并Flush到relay-log文件之后,才会通知对应主库上面的等待线程
- 如果在等待过程中,等待时间已经超过了配置的超时时间,没有任何一个节点通知当前事务,那么此时主库会自动转换为异步复制,当至少一个半同步从节点赶上来时,主库便会自动转换为半同步方式的复制
- 半同步复制必须是在主库和从库两端都开启时才行,如果在主库上没有打开,或者在主库上开启了而在从库上没有开启,主库都会使用异步方式复制
#确认数据库允许动态加载模块
mysql -uroot -p
show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
install plugin rpl_semi_sync_master SONAME 'semisync_master.so'; #加载master模块
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so'; #加载slave模块
select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%' #查看模块是否安装成功
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE | //模块安装成功
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+
#启用半同步复制 安装后默认是关闭的
set global rpl_semi_sync_master_enabled=1; #启用master半同步复制
set global rpl_semi_sync_slave_enabled=1; #启用slave半同步复制
#查看半同步复制模式是否启用
show variables like 'rpl_semi_sync_%_enabled';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON | //模块已启用
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+
可以修改配置文件,永久启用半同步复制
vim /etc/my.cnf
========================
[mysqld]
plugin-load='rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so'
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1
====================================================================================
systemctl restart mysqld
更加详细半同步内容https://www.cnblogs.com/kevingrace/p/10228694.html