mysql集群
1 主从复制 解决单机故障问题
2 高可用 对外提供一个主节点,投票选举机制.
3 cluster集群,多个主节点
怎么优化单个主节点的处理能力?从主从复制出发
主节点 master 写操作,数据变更,binlog记录。会有一个dump线程和从节点的I/O线程交互,dump将binglog中具体数据传给IO线程。
从节点,slave 开启I/O线程,从主节点读取binglog,将其写入 relay log (中继日志),再通过sql线程,读取relay log ,写入从库。
mysql主从复制的方式:
异步复制:服务端访问数据库,主数据库写到log中,并返回成功。之后主从再同步数据
半同步复制:mysql5.5版本之后,插件的方式提供的, 就是开头所写的主从复制,当sql线程已经把中继日志写成功之后,再返回给主数据库,主数据库再返回服务端。
读写分离的数据同步问题:
如果采用了mysql的异步复制方案,可能存在并发读写情况下主从数据不一致,
半同步就是解决了这个数据不一致问题。但是同时引入了一个问题:多了主从之间数据或信息的一个来回传输过程。会造成写数据延迟。
单主节点情况下,采用异步复制方式,怎么去优化mysql的处理能力?
1.数据库代理:
思想: 原先是服务层直接对主从数据库进行读写,现在中间添加一层代理,就是说服务层的请求,会到代理层(proxy) ,写操作,代理层依然路由到主库, 可以通过一些计算方式,计算出主库的数据,同步到从库,需要多久,比如需要100ms,那么在写数据的时候,给数据加一个标识 t1=t+100ms,t写时当前时间,100ms是主从同步需要的时间。 接下来进行读操作,也是进入到代理,代理会判断,当前时间t0,与t1的大小关系,如果t0<t1,认为从库没有同步完,比请求路由到主库,反之则路由到从库。
2.redis与mysql同步方案
思想:读操作 ,先读redis,没有再去mysql取,取出了再放mqsql。
写操作 ,先写redis,异步存mysql,然后再有个监控机制(cacal alibaba开源的),监控到mysql插入了数据,把这条数据回写到redis中。写redis时,给key加上一个过期时间,在写操作过程中,如果mysql挂了,那么会丢失一条数据,这个没办法。如果redis挂了,当redis重启后,监控机制会继续把数据写进redis,保证同步。
cacal实现原理 : 伪装一个从数据库,实现主从同步协议,主数据库通过异步的方式发送信息给伪装数据库,cacal有一个Client(客户端),实现了从mysql中取binlog的功能,以及数据的解析(binlog是一个二进制文件),将binlog同步到redis。实现了这么一套映射流程。