MySQL复制(异步方式、半同步方式、GTID)总结

这是之前做的笔记,整体有些凌乱,后续有时间再整理一下格式!!!!

异步复制:在主节点写入日志即返回成功,默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。异步复制可以实现最佳的性能,主库把binlog日志发送给从库,这一动作就结束了,并不验证从库,会造成主从库数据不一致。
半同步复制:一主多从模式下,有一个从节点返回成功,即成功,不必等待多个节点全部返回。
MySQL半同步,MySQL5.5由Google贡献的补丁才开始支持半同步复制(semi Replication)模式,该模式可以确保从服务器接收完主服务器发送的binlog日志文件并写入自己的中继日志(relay log)里,然后会给主服务器一个反馈,告诉对方已经接收到完毕,这时主库线程才返回当前session告知操作完成,当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。
※主从同步可以同步多个数据库,也可以设置为一个数据库同步,如果设置一个数据库,在从服务器上其他数据可以写操作。
※半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式。
MySQL异步复制的配置:
① master服务器
1、启用二进制日志
log-bin=master-bin.log
2、选择一个唯一的server-id
server-id=(0-2^31-1) 我要求配置的iP+port
3、创建一个具有复制权限的用户
CREATE USER 'slave_user'@'slave_host' IDENTIFIED BY 'slave_pass';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'slave_host'
显示从服务器同步的状态:SHOW MASTER STATUS;
※连接至主服务器上通过SHOW MASTER STATUS 语句确定其当前的复制坐标。
执行这个命令显示File和Position的值,因为还需要用它们,以便能够把主服务器读取二进制位置时间的起始位置告知从服务器
② slave服务器
1、启用中继日志
relay-log=
2、选择一个唯一的server-id
server-id=(0-2^31-1)(必须唯一,避免冲突,我要求配置的iP+port
3、连接至主服务器,进行复制
CHANGE MASTER TO
MASTER_HOST='',
MASTER_PORT='',--※主服务器没有使用默认端口需要端口命令指定
MASTER_USER='',
MASTER_PASSWORD='',
MASTER_LOG_FILE='',
MASTER_LOG_POS='';
4、从服务器开始复制,然后查看从服务运行状态
START SLAVE;show slave status\G;
========================================================================
半同步复制方式:(MySQL5.5版本时谷歌提供的补丁)
半同步复制的安装配置半同步复制插件在(通用二进制方式安装)/usr/local/mysql/lib/plugin
MySQL复制(异步方式、半同步方式、GTID)总结_第1张图片
1、在master和slave库首次启动时,安装插件,并开启半同步复制:mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql>set global repl_semi_sync_master_enabled=ON;2、在从节点上执行下列命令,启用半同步复制操作
mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql>set global repl_semi_sync_slave_enabled=ON;
在初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次启动时系统会自动加载该插件,无需再次执行上边命令,另外再my.cnf文件中配置加入以下命令:repl_semi_sync_master_enabled=1repl_semi_sync_slave_enabled=1这样以后启动MySQL时就会自动开启半同步复制功能。
参数说明:
半同步复制参数配置较少,其中在master主库上4个相关参数,如下:
rpl_semi_sync_master_enabled=ON -- 表示master主库上已经开启半同步复制模式
rpl_semi_sync_master_timeout=10000 --该参数为10000毫秒,即10秒,不过,这个参数是动态动态可调,表示如果主库在某次十五中的等待时间超过10秒,则降级为异步复制模式,不在等待slave从库,如果主库再次探测slave从库恢复,则会自动回到半同步复制模式
rpl_semi_sync_master_wait_no_slave --默认开启,表示是否允许master每个事务提交后都要等待slave的接收确认信号,默认为ON,即每一个事务都要等待,如果为OFF,则slave追赶上后,也不会开启半同步复制模式,需要手工开启。
rpl_semi_sync_master_trace_level=32 --表示用于开启半同步复制模式时的调试级别
rpl_semi_sync_master_wait_for_slave_count
rpl_semi_sync_master_wait_point
rpl_stop_slave_timeout
=============================================================================
从库参数:
rpl_semi_sync_slave_enabled =ON --表示slave开启半同步复制模式,
rpl_semi_sync_slave_trace_level=32 --表示用于开启半同步复制模式的调试级别,默认32
rpl_stop_slave_timeout
半同步复制功能配置:
1、在master库上导出一份全量数据:
mysqldump -uroot -p123456 -q --single-transaction --master-data=2 -A > alldata.sql
2、把主库拷贝到从库,在slave库上执行导入
3、在从库上建立主从关系,(master_log_file和master_log_pos的值使用命令:show master status;查看)
root@localhost [(none)]> change master to master_host='192.168.0.104',master_user='root',master_password='123456',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=107;
root@localhost [(none)]>start slave;
※还可以分别单独启动IO线程和SQL线程, start slave io_thread;start slave sql_thread;
建立主从复制,并开启同步复制
验证半同步复制模式是否已经开始工作了?可以在master主库查看状态:
show status like '%semi%';
在slave从库上查看状态,
show status like '%semi%';
Rpl_semi_sync_slave_status --用于显示从服务器是否启动半同步复制模式,如果状态值为ON,则表示半同步复制模式已经开始工作=================================================================================================GTID复制模式GTID复制:(global transaction id 全局事务标识符) MySQL5.6版本开始支持
GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog(MASTER_LOG_FILE)和POS点(MASTER_LOG_POS),只需要知道master的IP、端口、账号、密码即可。因为复制是自动的,MySQL会通过内部机制GTID自动找点同步。
GTID复制名词释义:
1、server-id:服务器身份id,在初始化MySQL时,会自动生成一个server-id并写到数据目录的auto.cnf文件中,官方不建议修改,并且server-id跟GTID有密切关系。
2、GTID:全局事务标识符,使用这个功能时,内次事务提交都会在binlog里生成一个唯一的标识符,它由UUID和事务ID组成,首次提交的事务为1,第二次为2,第三次为3,以此类推
开启GTID,无需找到binlog和POS点,直接change master to master_auto_postion=1即可,它会自动寻找同步
GTID工作流程:
1、在master上一个事务提交,并写入binlog里。
2、binlog日志发送到slave,slave接收并写入中继日志里,slave读取到这个GTID,并设置gtid_next的值。例如
set @@session。gtid_next='=fbd841f9-5590-11e8-b819-000c29e6461e';
然后告诉slave接下来的事务必须使用GTID,并写入它自己的binlog里。
3、slave检查并确认这个GTID没有被使用,如果没有被使用,那么开始执行这个事务并写入自己的binlog里
4、由于gtid_next的值不为空,slave不会尝试去生成一个新的gtid而是通过主从同步来获取GTID
如果设置MySQL5.6GTID方式的主从同步呢?在master和slave上,需要同时在my.cnf文件中加入以下内容:
log_bin=mysql-bin --开启二进制日志
binlog_format=row --二进制日志格式
log_slave_updates=1 --开启二进制日志
gtid_mode=ON --开启gtid模式
enforce_gtid_consistency=ON --开启强制gtid一致性功能
==================================================================================
然后在master上导出:
mysqldump -uroot -p123456 -q --single-transaction -R -E --triggers --default-character-set=utf-8 --master-data=2 -B yourDB >/yourDB.sql
CHANGE MASTER TO
MASTER_HOST='master2.example.com',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;

change master to master_host='192.168.0.104',master_user='root',master_password='123456',master_port=3306,master_auto_position=1;
※注意:如果使用GTID,就不能在使用传统的binlog和POS方式,否则会报错。
1、GTID同步复制是基于事务的,所以myisam表不支持,这可能导致多个GTID分配给同一个事务
2、不支持create table ……select语句,因为该语句会被拆分成create table和insert两个事务,并且,如果这两个事务被分配同一个GTID,则会导致insert被备库忽略掉。(如下图所示:)
主库上执行show slave hosts; --查看有哪些从库绑定主库。
sync_master_info --启用可以确保无信息丢失
master_info_repository、relay_log_info_repository --启用这两项崩溃时,二进制及从服务器安全的功能
binlog_checksum、master_verify_checksum、slave_sql_verify_checksum --启用有关复制的所有校验。
binlog_rows_query_log_events --启用可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度。
slave_parallel_workers --多线程复制(从服务器配置。默认是0,表示禁用多线程功能)
简单的主从复制配置:
1、master节点配置
[mysqld]
binlog_format=row
log_bin=mysql-bin.log
log_slave_updates=1|ON|true --MySQL5.6,必须配置此参数,因为需要在binlog找到同步复制的信息,5.7版本不建议启用此配置
※开启log_slave_updates参数,是吧relay-log里的日志内容再记录到slave本地的binlog里,在MySQL5.7,官方进行了调整,用一张gtid_executed系统表记录同步复制的信息,这样就不用开启log_slave_updates参数,避免两次IO保存relay-log和主库的binlog,减少了从库的压力。
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=table
relay_log_info_repository=table
sync_master_info=1
slave_parallel_workers=2
binlog_checksum=CRC32
master_verify_checksum=1
slave_sql_verify_checksum=1
binlog_rows_query_log_events=1
server_id=1033306
#report_port=3306
#report_host=

2、slave节点配置
1.2、配置slave节点:
[mysqld]
binlog_format=ROW
log_slave_updates=true
gtid_mode=on
enforce_gtid_consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
sync_master_info=1
slave_parallel_workers=2
binlog_checksum=CRC32
master_verify_checksum=1
slave_sql_verify_checksum=1
binlog_rows_query_log_events=1
server_id=1043306
#report_port=3306
#log_bin=mysql-bin.log
#report_host=
relay_log_recovery=1 MySQL5.5或mariadb10.0版本开始,增加了relay_log_recovery参数,这个参数的作用是:当slave从库宕机后,假如relay_log损坏,导致一部分中继日志没有处理,则自动放弃未执行的relay-log,并且重新从master上获取日志,这样就保证了relay_log的完整性,默认是关闭的,将relay_log_recovery的值设置为1市可在slave上开启该功能,建议开启。
=====================================================================================================
2、创建复制用户
mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY '123123';
3、为备节点提供初始数据集
锁定主表,备份主节点上的数据,将其还原至从节点;如果没有启用GTID,在备份时需要在master上使用show master status命令查看二进制日志文件名称及事件位置,以便后面启动slave节点时使用。
4、启动从节点的复制线程
如果启用了GTID功能,则使用如下命令:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.104', MASTER_USER='zhang', MASTER_PASSWORD='123123', MASTER_AUTO_POSITION=1;
总结:
MySQL版本复制延迟:
MySQL5.5:延迟较大
MySQL5.6:一库一线程 等于没解决
MySQL5.7:一组一线程,gtid 彻底解决。slave_parallel_workers=设置线程数(最大1024个)slave_parallel_type=logical_clock(基于表的组提交并行复制),默认值为database(基于库复制)
--设置从服务器只读模式
全局设置 set global read_only =1|ON|true
vim /etc/my.cnf
read_only =1 ※只读模式对具有 super 权限的用户来说没有作用。
※ 在MySQL5.7版本新曾参数,super_read_only,用于设置super权限的用户禁止写操作。
root@localhost [(none)]>show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.01 sec)

MySQL复制流程:
异步:客户请求-》master产生binlog-》客户请求成功
半同步:客户请求-》master产生binlog-》IO传输给slave-》slave产生中继日志-》master收到slave已成功产生中继日志的消息-》客户请求成功
同步:客户请求-》master产生binlog-》IO传输给slave-》slave产生中继日志-》SQL线程重演日志-》master收到slave已成功产生中继日志的消息-》客户请求成功




你可能感兴趣的:(MySQL)