MySQL复制扩展功能
一、mysql的并行复制
1.默认情况下slave中使用的是sql单线程回放,在master时多用户读写,如果使用单线程回放会造成主从复制延迟,针对这个问题一般采用mysql多线程回放来解决。
在slave中设定:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=2
gtid-mode=ON 表示开启全局事务标识,表示每个事务都会有一个全局唯一的标识,可以跨多个mysql实例使用,它可以用来跟踪事务的执行情况无需依赖于传统的二进制日志的位置进行复制
enforce-gtid-consistency=ON
slave-parallel-type=LOGICAL_CLOCK 基于组提交
slave-parallel-workers=16 开启线程数量
relay_log_info_repository=TABLE 回放日志在表中记录
relay_log_recovery=ON 日志回放恢复功能开启
mysql组提交是一个性能优化特性,允许在一个事务日志同步操作中将多个事务日志一起写入,可以减少io的次数,提高数据库整体性能
2.三个线程:
主从复制的原理是基于binlog进行数据同步,在这个过程中基于3个线程来操作,一个主库线程两个从库线程。
二进制日志转储线程是一个主库线程,当从库线程连接的时候,主库线程可以将二进制日志发送给从库,一般情况下当主库读取事件时会在binlog上加锁,读取完之后会将锁释放掉
从库io线程连接到主库,向主库发送请求更新binlog,这是从库的io线程就可以读取到主库的二进制日志转储线程发送的binlog更新部分并且拷贝到本地的中继日志
从库sql线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据和主库保持同步
3.复制的三步骤:
master将写操作记录到二进制日志中
slave将master的binlog events拷贝到它的中继日志
slave重做中继日志中的事件,将改变应用到自己的数据库中。重启后从接入点开始复制
4.架构缺陷:
master更新完成后直接发送二进制日志到slave,但slave是否真正保存数据,master端不会检测
master端直接保存二进制日志到磁盘
二、半同步模式
1.原理:
用户线程写入完成master中的dump会把日志推送到slave端
slave中的io线程接收后保存到中继日志
保存完成后slave向master端返回ack
在未接收slave的ack时master端不做提交而是一直等待
2.gtid模式
在gtid激活之后,当master出现问题后,slave2和master的数据最接近会作为新的mastser,slave1指向新的master,它不会去检测新的master的pos id,只需要继续读取自己的gtid_next。
设置gtid:分别在master端和slave端开启gtid模式
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
symbolic-links=0
2.启用半同步模式:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
symbolic-links=0
rpl_semi_sync_master_enabled=1 开启半同步
进入到mysql的视图下
install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
打开半同步功能:
set global rpl_semi_sync_master_enabled=1;
同理,在slave端也分别开启半同步模式
但在slave端,需要重启io线程半同步才生效
stop slave io_thread; start slave IO_THRED;
四、mysql高可用之组复制
1.mysql group replication(mgr)对属于同一组的服务器自动进行协调,对于要提交的事务组成员必须就全局事务序列中给定事务的顺序达成一致
将多个节点组成一个复制组,在执行读写事务的时候需要通过一致性协议层的同意,也就是读写事务想要进行提交,必须经过组里大多数节点的同意才可以提交,但针对只读事务不需要经过组内同意,直接提交即可。
2.single-primary mode(单写或单主模式)
组内只有一个节点可读可写,其他节点只可读
3.多写或多组模式(multi-primary mode)
组内的所有机器都是primary节点,同时可以进行读写操作
4.实现mysql组复制
在上述的一般配置代码上加入以下配置信息:
plugin_load_add='group_replication.so' 加载组复制插件
group_replication_group_name="fhdfh udhfudfhudhfbdufdufudb"
group_replication_start_on_boot=off 在server启动的时候不自动启动组复制
group_replication_local_address="172.25.254.10:3306" 指定插件接受其他成员的信息端口
group_replication_group_seeds="172.25.254.10:3306,172.25.254.20:3306" 本地地址允许访问成员列表
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8" 主机白名单
group_replication_bootstrap_group=off 不随系统自启而启动,仅在初始成员主机中手动启动
group_replication_single_primary_mode=OFF 使用多主模式
group_replication_enforce_update_everywhere_checks=ON 组同步有任何改变检测更新
group_replication_allow_local_disjoint_gtids_join=1 放弃自己的信息以master事件为主
配置sql