分布式mysql如何保证数据一制,分布式mysql解决方案

2020-05-16:如何保证redis和mysql数据一致?SAGA或者TCC - 这两种需要业务代码的大量配合 。通过业务代码来补偿一致性 。现实当中有XA协议 。比如Ehcache是支持XA协议的 。但是性能表现不佳 , 运维也麻烦 。
二者数据同步的关键在于mysql数据库中主键 , 方案是在redis启动时区mysql读取所有表键值存入redis中,往redis写数据是 , 对redis主键自增并进行读取 , 若mysql更新失败 , 则需要及时清除缓存及同步redis主键 。
先讲MySQL , MySQL中一个事务提交之后就永久写入了 , 同时将事务的操作写入日志 。然后 , slave从master中请求日志,复制这个事务的操作(注意不是sql语句) 。
对于一致性要求高的,从数据库中读,比如金融 , 交易等数据 。其他的从Redis读 。这种方案的好处是由mysql,常规的关系型数据库来保证持久化 , 一致性等 , 不容易出错 。
如果要“保证”数据的安全性,那么会带来开销的进一步提升,以至于使用redis带来的性能优势都会丧失 。正确的做法是区分不同的业务 , 使得并不需要“保证”数据一致性的场合,可以使用redis优化 。而敏感的场合依然使用mysql 。
如何保证数据库缓存的最终一致性?1、从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案 。这种方案下 , 我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可 。
2、解决思路:先删除缓存,再修改数据库 。如果数据库修改失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致 。因为读的时候缓存没有 , 则读数据库中旧数据,然后更新到缓存中 。
3、g、最终一致性(eventual consistency):当没有新更新的情况下,更新最终会通过网络传播到所有副本点,所有副本点最终会一致 , 也就是说使用者在最终某个时间点前的中间过程中无法保证看到的是新写入的数据 。
4、如果在步骤1和步骤2失败的情况下,整个事务会回滚,如果在步骤3失败的情况下,MySQL数据库在重启后会先检查准备的UXID事务是否已经提交,若没有,则在存储引擎层再进行一次提交操作 。这样就保证了redo与binlog的一致性 , 防止丢数据 。
如何解决mysql数据库后台数据一致性真想要提高多节点间的数据一致性,可以考虑采用PXC方案 。现在已知用PXC规模较大的有qunar、sohu , 如果团队里初期没有人能比较专注PXC的话,还是要谨慎些,毕竟和传统的主从复制差异很大,出现问题时需要花费更多精力去排查解决 。
【分布式mysql如何保证数据一制,分布式mysql解决方案】如果在步骤1和步骤2失败的情况下,整个事务会回滚,如果在步骤3失败的情况下,MySQL数据库在重启后会先检查准备的UXID事务是否已经提交,若没有 , 则在存储引擎层再进行一次提交操作 。这样就保证了redo与binlog的一致性,防止丢数据 。
现在的问题很明确,就是如何恢复主从库数据的一致性 。
本工具借鉴 pt-table-checksum 工具思路改写,可以检查随意两个 mysql(支持 mysql sql 语法的数据库)节点的数据一致性 。基于主键以一个块遍历数据表,比对checksum的值,块的大小可通过参数指定 。
以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据 。
分布式系统一致性高可用的解决方案总结1、解决的方案之一便是数据分片,将大数据量在集群中按照一定的规则分片,使数据按照一定的规则分布集群的不同服务器上 , 以减轻单个服务器的压力,保证服务集群的可用性 。

推荐阅读