【mysql】主从复制

优势

虽然写操作必须在主服务器进行,但是读可以分散到不同的副本,可以显著提高读取性能,可以在副本进行备份而不破坏相应的源数据,在副本进行数据分析不影响主服务器性能。

复制方式

异步、半异步

 1.在主库上记录binlog

在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录bin log。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。

2.从库将主库的二进制日志复制到其本地的中继日志中

首先,从库会启动一个I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个二进制转储线程(bin log dump(该线程没有对应的SQL命令)来读取主库上bin log中的事件。它不会对事件进行轮询,如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库I/O线程会将接收到的事件记录到中继日志中。

3.从库的SQL线程从中继日志中读取事件并在备库执行

当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所 以中继日志的开销很低。

I/o线程能够独立于SQL线程之外工作

偏移量复制与GTID复制对比

GTID优势

1.复制速度提升,改善数据延迟

每个库有一个单独的(sql thread)进行同步复制

2.更好的支持自动容灾切换

避免了在传送 binlog 逻辑上依赖文件名和物理偏移量,不用手动指定pos点,而是自动获取

偏移量复制缺点

1.容易造成主从延迟

mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是按事务执行顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步,问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能和slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:“主库上那个相同的DDL也需要执行10分,为什么slave会延时?”,答案是master可以并发,Slave_SQL_Running线程却不可以。

在主库上并发运行的査询在备库只能串行化执行,因为只有一个SQL线程来重放中继日志中的事件,这是很多工作负载的性能瓶颈所在。虽然有 一些针对该问题的解决方案,但大多数用户仍然受制于单线程。

因为传统的方式里,你需要找到binlog和POS点,然后change master to指向,而不是很有经验的运维,往往会将其找错,造成主从同步复制报错,在mysql5.6里,无须再知道binlog和POS点,需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。

https://www.yuque.com/ccazhw/tuacvk/kzq9ip

实现方式

主从服务器搭建成功后,从库启动一个I/O线程与主库建立普通的客户端连接,之后在主库启动一个二进制转储进程,读取

同步方式分为三种:基于语句的复制、基于行的复制和二者混合

binlog+偏移量全局事务标识符(GTID)
复制方式

与引擎无关,基于二进制日志

可以对GTID使用基于语句的复制或基于行的复制,官方建议使用基于行的格式
优点每笔交易都可以在提交到原始服务器上并由任何副本应用时进行标识和跟踪。这意味着在启动新副本或故障转移到新源时,不必使用GTID引用日志文件或这些文件中的位置,从而极大地简化了这些任务。由于基于GTID的复制完全基于事务,因此可以很容易地确定源和副本是否一致。只要在源上提交的所有事务也都在副本上提交,则可以保证两者之间的一致性。
缺点mysql5.6以上可用

其他方式还包括使用中间件实现,kingshard、mycat、Gaea等。

配置

主服务器必须开启binlog,副本无需开启也可完成复制过程(但是开启可以用于数据备份和崩溃恢复),主从都必须设置唯一大于0的server_id(主服务器为0禁止副本连接,由0改为正整数时需要重启服务,由正整数更改不需重启)。如果源上已有数据,需要创建快照以将数据复制到副本。

MyISAM必须先停止处理源上的语句以获取读取锁再进行复制,否则可能导致副本上的数据库不一致或损坏。innodb不需要读取锁定,有足够长的事务来传输数据快照就足够了。

1.在每台服务器设置唯一server_id

//更改当前会话
SET GLOBAL server_id = 21;

//更改配置文件以永久生效,防止重启后丢失
[mysqld]
server-id=21

2.在主服务器创建用于复制的用户并赋权

mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

https://dev.mysql.com/doc/refman/8.0/en/binlog-replication-configuration-overview.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值