MySQL 主从复制概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。一般主服务器负责写,而从服务器负责读,Mysql的主从复制的过程是一个异步的过程。
MySQL 主从复制作用
1.读写分离
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2.高可用
当系统中某个节点发生故障时,可以方便的故障切换。
3.提高读写性能
有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,这样可以提高系统的读写性能。
MySQL 主从形式
1.一主一从
2.一主多从,提高系统的读性能
一主一从和一主多从是最常见的主从架构,实施起来简单并且有效,
优点:不仅可以实现高可用,而且还能读写分离,进而提升集群的并发能力。
缺点:主库更新的数据到从库更新数据有一定的延迟。
3.多主一从
多主一从可以将多个mysql数据库备份到一台存储性能比较好的服务器上
4.双主复制
双主复制,也就是互做主从复制,每个master既是master,又是另外一台服务器的slave。这样任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
5.级联复制
如果太多从库从主库同步数据,会对主库有一点压力,所以可以让一部分从库从连接主库的从库上同步数据。
主从复制的原理
例如一主一从的情况下,从库 B 跟主库 A 之间维持了一个长连接:
1.在从库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。
2.在从库 B 上执行 start slave 命令,这时候从库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。
3.主库 A 校验完用户名、密码后,开始按照从库 B 传过来的位置,从本地读取 binlog,发给 B。
4.从库 B 拿到 binlog 后,写到本地文件,称为中转日志(relay log)。
5.sql_thread 读取中转日志,解析出日志里的命令,并执行。
循环复制问题
在双主复制的情况下A、B库都为主库,会互相发送更新语句,所以为了避免循环执行的情况,要求两个库的 server id 必须不同,如果相同,则它们之间不能设定为主备关系。MySQL 在 binlog 中记录了这个命令第一次执行时所在实例的 server id。每个库在收到从自己的主库发过来的日志后,先判断 server id,如果跟自己的相同,表示这个日志是自己生成的,就直接丢弃这个日志。
读写分离的问题及解决办法
问题:主库更新数据到从库更新数据会存在延迟,客户端执行完一个更新事务后马上发起查询,如果查询选择的是从库的话,就有可能读到刚刚的事务更新之前的状态。
解决方案:
- 强制走主库方案
1.对于必须要拿到最新结果的请求,强制将其发到主库上。比如,在一个交易平台上,卖家发布商品以后,马上要返回主页面,看商品是否发布成功。那么,这个请求需要拿到最新的结果,就必须走主库。
2.对于可以读到旧数据的请求,才将其发到从库上。在这个交易平台上,买家来逛商铺页面,就算晚几秒看到最新发布的商品,也是可以接受的。那么,这类请求就可以走从库。 - sleep 方案
主库更新后,读从库之前先 sleep 一下。 - 判断主备无延迟方案
show slave status 结果里的 seconds_behind_master 参数的值,可以用来衡量主备延迟时间的长短。每次从库执行查询请求前,先判断 seconds_behind_master 是否已经等于 0。如果还不等于 0 ,那就必须等到这个参数变为 0 才能执行查询请求。 - 用redis之类的做缓存
主库更新成功之后更新进redis,下次读也就直接读redis了。
网友评论