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上会创建两个线程:IO线程。该线程连接到master机器,master机器上的binlog dump 线程会将binlog的内容发送给该IO线程。该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

原文地址:https://www.cnblogs.com/qianjinyan/p/10340291.html