DB中的读写分离
不考虑缓存,这边只考虑Mysql:
为了系统高可用,一般Mysql设置master和Slave,Master负责记录delete/update/insert/create,创建函数,创建存储过程,Slave会快速接受这些操作,从而同步。
一、主从数据库的区别
从数据库(Slave)是主数据库的备份,当主数据库(Master)变化时从数据库要更新,这些数据库软件可以设计更新周期。
这是提高信息安全的手段。主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存。
(1) 主从分工
其中Master负责写操作的负载,也就是说一切写的操作都在Master上进行,而读的操作则分摊到Slave上进行。这样一来的可以大大提高读取的效率。在一般的互联网应用中,经过一些数据调查得出结论,读/写的比例大概在 10:1左右 ,也就是说大量的数据操作是集中在读的操作,这也就是为什么我们会有多个Slave的原因。但是为什么要分离读和写呢?熟悉DB的研发人员都知道,写操作涉及到锁的问题,不管是行锁还是表锁还是块锁,都是比较降低系统执行效率的事情。我们这样的分离是把写操作集中在一个节点上,而读操作其其他的N个节点上进行,从另一个方面有效的提高了读的效率,保证了系统的高可用性。
(2) 基本过程
1)、Mysql的主从同步就是当master(主库)发生数据变化的时候,会实时同步到slave(从库)。
2)、主从复制可以水平扩展数据库的负载能力,容错,高可用,数据备份。
3)、不管是delete、update、insert,还是创建函数、存储过程,都是在master上,当master有操作的时候,slave会快速的接受到这些操作,从而做同步。
(3) 用途和条件
1)、mysql主从复制用途
实时灾备,用于故障切换
读写分离,提供查询服务
备份,避免影响业务
2)、主从部署必要条件:
主库开启binlog日志(设置log-bin参数)
主从server-id不同
从库服务器能连通主库
二、主从同步的粒度、原理和形式:
(1)、 三种主要实现粒度
详细的主从同步主要有三种形式:statement、row、mixed
1)、statement: 会将对数据库操作的sql语句写道binlog中
2)、row: 会将每一条数据的变化写道binlog中。
3)、mixed: statement与row的混合。Mysql决定何时写statement格式的binlog, 何时写row格式的binlog。
(2)、主要的实现原理、具体操作、示意图
1)、在master机器上的操作:
当master上的数据发生变化时,该事件变化会按照顺序写入bin-log中。当slave链接到master的时候,master机器会为slave开启binlog dump线程。当master的binlog发生变化的时候,bin-log dump线程会通知 slave,并将相应的binlog内容发送给slave。
2)、在slave机器上操作:
当主从同步开启的时候,slave上会创建两个线程:I\O线程。该线程连接到master机器,master机器上的binlog dump 线程会将binlog的内容发送给该I\O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log;sql线程。该线程读取到I/O线程写入的ralay log。并且根据relay log。并且根据relay log 的内容对slave数据库做相应的操作。
3)MYSQL主从复制原理图
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
异步复制
半同步复制原理
MySql数据库从库同步其他问题及解决方案
1)、mysql主从复制存在的问题:
● 主库宕机后,数据可能丢失
● 从库只有一个sql Thread,主库写压力大,复制很可能延时
2)、解决方法:
● 半同步复制---解决数据丢失的问题
● 并行复制----解决从库复制延迟的问题
3)、半同步复制mysql semi-sync
(半同步复制)半同步复制:
● 5.5集成到mysql,以插件的形式存在,需要单独安装
● 确保事务提交后binlog至少传输到一个从库
● 不保证从库应用完这个事务的binlog
● 性能有一定的降低,响应时间会更长
● 网络异常或从库宕机,卡主主库,直到超时或从库恢复
4)、主从复制--异步复制原理、半同步复制和并行复制原理比较
有时候出现的问题和解决方案
MySQL读写分离状态正常,但是数据不同步
起因:发现 MySQL Slave 数据库 各项状态正常即SQL 线程 IO线程正常,但就是数据不更新,解决办法每次重启服务 恢复正常。
解决办法:
Slave数据库my.cnf 配置文件添加如下配置
slave_net_timeout=30
重启MySQL服务:service mysqld restart