1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Mysql主从复制之异步与半同步以及主从切换(实验)

Mysql主从复制之异步与半同步以及主从切换(实验)

时间:2020-07-26 19:32:37

相关推荐

Mysql主从复制之异步与半同步以及主从切换(实验)

什么是异步,半同步:

一、异步复制(Asynchronous replication)

1、逻辑上

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

2、技术上

主库将事务 Binlog 事件写入到 Binlog 文件中,此时主库只会通知一下 Dump 线程发送这些新的 Binlog,然后主库就会继续处理提交操作,而此时不会保证这些 Binlog 传到任何一个从库节点上。

二、半同步复制(Semisynchronous replication)

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

实验:

项目环境:2台centos7、MySQL5.7.26(编译安装)

项目描述:搭建2台MySQL服务器,实现主从复制、为后面的读写分离做前期的准备,构建一个简单的MySQL集群。

项目步骤:

安装好centos7的系统,编译安装好MySQL,在主服务器启动二进制日志功能,新建并且授权用户,并且将主服务器里的数据使用mysqldump导出,在从服务器上使用mysql导入数据,做好前期2台服务器之间的数据的一致性工作。在slave上配置master的信息,开启slave功能验证主从复制的效果主从的切换,模拟主服务器出现故障,将从服务器提升为主,再将其他的MySQL服务器配置为从。整个过程都是纯手工完成。可以考虑使用脚本完成。将异步复制升级到半同步复制

操作步骤:

1.修改mysql的配置文件,启动二进制日志功能vim /etc/f在主服务器上开启二进制日志,server_id=1#binary loglog_binserver_id = 1在从服务器上也可以开启二进制日志,server_id=2#binary loglog_binserver_id = 22.在主服务器上新建并且授权一个用户,只给予复制权限用于复制二进制日志root@(none) 15:04 mysql>grant replication slave on *.* to '用户名'@'从服务器的IP地址' identified by '密码';Query OK, 0 rows affected, 1 warning (0.02 sec)3.备份出主服务器上的数据,然后到导入到从服务器上[root@sc-mysql-master ~]# mysqldump -uroot -p'密码#' --all-databases > /backup/all_db.sql[root@sc-mysql-master backup]# scp all_db.sql root@1从服务器ip地址:/root 100% 11MB 21.0MB/s 00:00 在从服务器上导入数据[root@sc-mysql-slave ~]# mysql -uroot -p'密码' <all_db.sql mysql: [Warning] Using a password on the command line interface can be insecure.4.在从服务器上配置master 的信息在主服务器上查看当前的二进制日志的文件和位置号root@(none) 15:12 mysql>show master status; +----------------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------------------------+----------+--------------+------------------+-------------------+| sc-mysql-master-bin.000001 |449 | | | |+----------------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)root@(none) 15:19 mysql>root@(none) 15:19 mysql>flush logs; 刷新二进制日志文件Query OK, 0 rows affected (0.02 sec)root@(none) 15:20 mysql>show master status;+----------------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------------------------+----------+--------------+------------------+-------------------+| sc-mysql-master-bin.000002 |154 | | | |+----------------------------+----------+--------------+------------------+-------------------+1 row in set (0.01 sec)在从服务器上配置master的信息[root@sc-mysql-slave ~]# mysql -uroot -p'密码'root@(none) 15:26 mysql>CHANGE MASTER TO MASTER_HOST='master地址' ,MASTER_USER='slave',MASTER_PASSWORD='密码',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000020',MASTER_LOG_POS=154;Query OK, 0 rows affected, 2 warnings (0.04 sec)root@(none) 15:27 mysql>root@(none) 15:27 mysql>show slave status \G; 查看slave的状态信息*************************** 1. row ***************************Slave_IO_State: Master_Host: master地址Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: sc-mysql-master-bin.000002Read_Master_Log_Pos: 154Relay_Log_File: sc-mysql-slave-relay-bin.000001Relay_Log_Pos: 4Relay_Master_Log_File: sc-mysql-master-bin.000002Slave_IO_Running: NoSlave_SQL_Running: No5.在master和slave上关闭防火墙和selinux主服务器[root@sc-mysql-master backup]# service firewalld stopRedirecting to /bin/systemctl stop firewalld.service[root@sc-mysql-master backup]# getenforce Permissive[root@sc-mysql-master backup]#从服务器[root@sc-mysql-slave ~]# service firewalld stopRedirecting to /bin/systemctl stop firewalld.service[root@sc-mysql-slave ~]# getenforce Disabled[root@sc-mysql-slave ~]#6.在slave上启动复制功能root@(none) 15:33 mysql>start slave;Query OK, 0 rows affected (0.01 sec)root@(none) 15:33 mysql>root@(none) 15:33 mysql>show slave status \G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: master地址Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: sc-mysql-master-bin.000002Read_Master_Log_Pos: 154Relay_Log_File: sc-mysql-slave-relay-bin.000002Relay_Log_Pos: 330Relay_Master_Log_File: sc-mysql-master-bin.000002Slave_IO_Running: Yes --》是yesSlave_SQL_Running: Yes --》是yes表示主从复制已经配置成功了7.验证主从复制的效果在master上新建库root@(none) 15:36 mysql>create database zouweicheng;Query OK, 1 row affected (0.00 sec)root@(none) 15:36 mysql>use zouweichengDatabase changedroot@zouweicheng 15:37 mysql>show tables;Empty set (0.00 sec)root@zouweicheng 15:37 mysql>create table t1(id int);Query OK, 0 rows affected (0.06 sec)root@zouweicheng 15:38 mysql>insert into t1 values(1),(2);Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0root@zouweicheng 15:38 mysql>8.到slave上去看master.info 和relay-log.info[root@sc-mysql-slave ~]# cd /data/mysql/ 到数据目录下查看[root@sc-mysql-slave mysql]# cat master.info 25sc-mysql-master-bin.000002782master ip地址oudiSanchuang123#3306600[root@sc-mysql-slave mysql]# cat relay-log.info 7./sc-mysql-slave-relay-bin.000002958sc-mysql-master-bin.000002782001

启用半同步复制在主服务器上执行安装root@localhost [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.00 sec)root@(none) 15:45 mysql>set global rpl_semi_sync_master_enabled=1;Query OK, 0 rows affected (0.00 sec)启用半同步root@(none) 15:46 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)在从服务器上执行安装插件root@localhost [(none)]>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';Query OK, 0 rows affected (0.01 sec)从库上启用半同步功能root@(none) 15:59 mysql>set global rpl_semi_sync_slave_enabled=1;Query OK, 0 rows affected (0.00 sec)root@(none) 16:00 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.01 sec)root@(none) 16:01 mysql>

三、半同步测试从库停止复制以后在主库建表测试slave:root@localhost [(none)]>stop slave;Query OK, 0 rows affected (0.01 sec)masterroot@localhost [(none)]>use xucl;Database changedroot@localhost [xucl]>create table t1(id int);Query OK, 0 rows affected (10.01 sec)可以看到,主库在10秒内没有收到应答后自动改为异步复制,然后再引擎层提交事务。如何知道当前主从复制的状态是半同步还是异步?root@xiongda 16:39 mysql>show status like 'Rpl_semi_sync_master_status';+-----------------------------+-------+| Variable_name| Value |+-----------------------------+-------+| Rpl_semi_sync_master_status | ON | 表示是半同步+-----------------------------+-------+1 row in set (0.00 sec)root@xiongda 16:41 mysql>在从服务器上stop slave;root@xiongda 16:39 mysql>stop slave;Query OK, 0 rows affected (0.01 sec)root@xiongda 16:42 mysql>在主服务器上执行数据插入或者建表、数据修改等操作,触发半同步,如果半同步失败,主服务器会切换到异步root@xiongda 16:41 mysql>create table t6(id int);Query OK, 0 rows affected (10.09 sec) 所花费的时间超过10秒root@xiongda 16:42 mysql>root@xiongda 16:42 mysql>show status like 'Rpl_semi_sync_master_status';+-----------------------------+-------+| Variable_name| Value |+-----------------------------+-------+| Rpl_semi_sync_master_status | OFF | 半同步关闭+-----------------------------+-------+1 row in set (0.00 sec)root@xiongda 16:43 mysql>在从服务器那边启用start slave ;root@xiongda 16:42 mysql>start slave;Query OK, 0 rows affected (0.01 sec)root@xiongda 16:44 mysql>root@xiongda 16:44 mysql>show tables; 查看同步情况+-------------------+| Tables_in_xiongda |+-------------------+| t1|| t3|| t4|| t5|| t6|+-------------------+5 rows in set (0.00 sec)root@xiongda 16:45 mysql>在主服务器上查看状态root@xiongda 16:43 mysql>show status like 'Rpl_semi_sync_master_status';+-----------------------------+-------+| Variable_name| Value |+-----------------------------+-------+| Rpl_semi_sync_master_status | ON |+-----------------------------+-------+1 row in set (0.01 sec)root@xiongda 16:44 mysql>

主从切换

mysql主从关系中,如果master宕机了,则要提升slave为主,等原来的主库恢复之后,则要把老的主库变为从库,这样才能尽最大可能的保证应用层面的业务高可用性和数据的完整性。

## mysql主从切换为从主:从库变主库old slave: show processlist;# 确保Slave has read all relay log;STOP SLAVE IO_THREADshow slave status \G;检查IO及SQL线程是否正常,如果为NO表明同步不一致stop slave;reset master;reset slave all;(看版本号)grant replication slave on *.* repl@'IP' identified by 'replpwd';show master status;#记住这里列出的log_file和log_pos信息------------------------------------------------------------------------------## 主库变从库old master:Reset master;(新的slave,老的master)Reset slave;change master to master_host="IP",master_port=3306,master_user="repl",master_password="replpwd",master_log_file="...",#上一步中列出的log_filemaster_log_pos="...";#上一部中列出的log_posstart slave;show slave status\G;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。