解决方案:
方案1:直接读主库 。(问题主库压力大) 。
方案2:我们设置一个更新时间窗口,在刚刚更新的一段时间内,我们默认都从主库读取,过了这个窗口之后,我们会挑选最近有过更新的从库进行读取
方案3:我们直接记录用户更新的时间戳,在请求的时候把这个时间戳带上,凡是最后更新时间小于这个时间戳的从库都不予以响应 。
2、单调读一致性本次读到的数据不能比上次读到的旧 。【产生原因是不同从库上数据更新有延迟导致的】
由于主从节点更新数据的时间不一致,导致用户在不停地刷新的时候,有时候能刷出来,再次刷新之后会发现数据不见了,再刷新又可能再刷出来,就好像遇见灵异事件一样
解决方案:就是根据用户ID计算一个hash值,再通过hash值映射到机器 。同一个用户不管怎么刷新,都只会被映射到同一台机器上 。这样就保证了不会读到其他从库的内容,带来用户体验不好的影响 。
3、因果一致性指的是:如果节点 A 在更新完某个数据后通知了节点 B,那么节点 B 之后对该数据的访问和修改都是基于 A 更新后的值 。于此同时,和节点 A 无因果关系的节点 C 的数据访问则没有这样的限制 。
4、最终一致性最终一致性是所有分布式一致性模型当中最弱的 。可以认为是没有任何优化的“最”弱一致性,它的意思是说,我不考虑所有的中间状态的影响,只保证当没有新的更新之后,经过一段时间之后,最终系统内所有副本的数据是正确的 。
它最大程度上保证了系统的并发能力,也因此,在高并发的场景下,它也是使用最广的一致性模型 。
1.5CAP定理CAP 理论含义是,一个分布式系统不可能同时满足一致性(C:Consistency),可用性(A: Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的2个 。
选项描述C(Consistency) 一致性分布式系统当中的一致性指的是所有节点的数据一致,或者说是所有副本的数据一致A (Availability)可用性Reads and writes always succeed. 也就是说系统一直可用,而且服务一直保持正常P (Partition tolerance)分区容错性系统在遇到一些节点或者网络分区故障的时候,仍然能够提供满足一致性和可用性的服务
举个场景来说明CAP:
文章插图
Consistency-一致性
一致性是在写操作后进行读操作可以读到最新的数据状态,当数据分布在多个节点上时,从任意节点读取到的数据都是最新的 。
商品信息读写要满足一致性需要实现如下目标:
1.商品服务写入主数据库成功, 则想从数据库查询数据也成功
2.商品服务写入主数据库失败,则向从数据库查询也失败
实现:
1.写入主数据库后要数据同步到从数据库
2.写入主数据库后,在向从数据库同步期间要将从数据库锁定, 等待同步完成后在释放锁,以免在写新数据后,向从数据库查询到旧的数据 。
分布式一致性的特点:
1.由于存在数据库同步过程,写操作的响应会有一定的延迟 。
2.为了保定数据的一致性,对资源暂时锁定,待数据同步完成后释放锁定资源 。
3.如果请求数据同步失败的节点则会返回错误信息, 一定不会返回旧数据 。
Availability-可用性
可用性是指任何操作都可以得到响应的结果,且不会出现响应超时或响应错误 。
商品信息读写要满足可用性需要实现如下目标:
1.从数据库接收到数据库查询的请求则立即能够响应数据查询结果
2.从数据库不允许出现响应超时或错误
实现:
1.写入主数据库后要将数据同步到从数据 。
2.由于要保证数据库的可用性,不可以将数据库中资源锁定 。
3.即使数据还没有同步过来,从数据库也要返回查询数据, 哪怕是旧数据,但不能返回错误和超时 。
Partition tolerance-分区容错性
分布式系统的各个节点部署在不同的子网中, 不可避免的会出现由于网络问题导致节点之间通信失败,此时仍可以对外提供服务, 这个就是分区容错性 (分区容忍性) 。
商品信息读写要满足分区容错性需要实现如下目标:
1.主数据库想从数据库同步数据失败不形象写操作
2.其中一个节点挂掉不会影响另一个节点对外提供服务
【分布式系统架构】实现:
1.尽量使用异步取代同步操作,举例 使用异步方式将数据从主数据库同步到从数据库, 这样节点之间能有效的实现松耦合;
推荐阅读
- win7桌面文件路径修改-win7系统桌面文件路径修改-
- win7系统如何关闭UAC功能控制的问题
- 新手教程,Linux系统下MySQL的安装
- 十分钟搞定分布式一致性算法
- 分布式数据之缓存技术,今天就一起来揭开其神秘面纱
- 让重装系统更简单:无需使用U盘,3分钟带你体验“云重装”
- 开源NAS系统OpenMediaVault安装与体验
- 七氟丙烷气体灭火系统要求?七氟丙烷灭火系统设置要求
- Go语言实现海量日志收集系统
- 每个软件架构师和软件工程师都必须知道的10种设计模式