GTIDs全局事务标识符:是mysql5.6.5新加的技术
无论在master上提交事务,还是在slave上应用,每一个事务都可以被识别并跟踪
添加新的salve或者将slave提升为master都不需要考虑以哪一个二进制日志和哪一个position
1、完全基于事务的,所以不支持myisam引擎,可能导致多个GTIDs分配给同一个事务
2、Create table .....select 语句不支持
3、create/drop temporary table 不支持
4、必须使用enforce-gtid-consistency参数,强调复制一致性的参数
5、sql-slave-skip-counter不支持,跳过主从复制的参数
6、在mysql5.6.9之后的版本导入使用mysqldump制作的备份,需要保证二进制日志中不包含GTIDs
7、在mysql5.6.7之前,使用mysql_upgrade命令会出现问题。
配置基于GTIDs的replication
1、将master和slave服务器都设置为read-only
set @@global.read_only=on;
2、将主从服务器mysql服务关闭
/etc/init.d/mysql stop
3、开启GTIDs
开启GTIDs需要在主从服务器上开启
[mysqld]
gtid-mode=on
log-bin
log-slave-updates
enforece-gtid-consistency(mysql5.6.9之前是--disable-gtid-unsafe-statement)
在从库上还需要增加skip-slave-start参数
之后启动服务
4、配置slave
mysql> change master to
-> master_host='xxx',
-> master_port=3306,
-> master_user='xx',
-> master_passowrd='xxx',
-> master_auto_position=1;
Start slave;
提升replication的性能
1、使用内网或者专线传输binlog日志
2、将二进制日志保存在独立的存储介质上
3、使用多核CPU
4、如果二进制日志不是row格式,尽可能不要再insert或者update的时候使用select 就是尽量减少子查询
5、想办法减少master的写I/O(redis memcache)
6、更新架构设计
让更新频繁,实时的数据查询放到master上,在通过持久化session,让发生修改的用户先看到,其他人等待同步后再查看replication,如果开发难以实现可以这样
用户修改先保存在memcache里面,经过一点时间再同步到数据库里面,客户端优先找memchache数据,如果没有数据再读取master ,然后再读取slave这个逻辑
多线程方式传输二进制日志
只能工作在GTIDs模式下
只能对不同库执行操作才能使用多线程传输。
[mysqld]
Slave-parallel-workers=N(默认值为0,不开启)
N可以根据CPU核心数进行调整,代表开启的线程数
日志错误
大多数replication错误是因为日志错误引起的
主日志和中继日志都有可能出错
辨别的方法
mysqlbinlog masert_binlog_file >/dev/null
mysqlbinlog slave_binlog_file >/dev/null
屏幕下有相应的回显就代表出现的错误
跳过日志错误
在从库上执行
Stop slave;
Set global sql_slave_skip_counter=1;
Start slave;
基于GTID不生效
如果是中继日志出错,可以在salve上查看slave状态,根据日志信息跳过出错日志
基于GTIDs模式下的replication:
Stop slave;
Set gtid_next=’uuid:nexti_d’;
Begin;commit;
Set gtid_next=’automatic’;
Start slave;
Replication监控及自动故障切换
为监控机器赋予权限 在主库上执行
grant create,insert,drop,select,super,replication slave,reload on *.* to replm@ip identified by 'replm' with grant option;
Ip是监控机器的ip地址
修改主从服务器的配置文件
[mysqld]
Report-host=当前机器的IP地址
Master-info-repository=table
Relay-log-info-repository=table
gtid-mode=on
log-bin
log-salve-updates
binlog-format=row
enforece-gtid-consistency(mysql5.6.9之前是--disable-gtid-unsafe-statement)
之后重启生效
最后一步
启动监控端
mysqlfailover --master=replm(用户名):replm(密码)@ip(mater机器IP地址) --discover-salves-login=replm:replm 自动通过master机器发现slave机器