文章知识点主要来源于拉钩教育《java高薪训练营》及其他知识扩展,感谢拉钩教育平台提供的优质教育资源,以及各位老师的热情指导!本文仅做学习笔记使用,如有不适,请联系本人。
一、分布式一致性
分布式数据一致性,指的是数据在多个副本中存储时,各个副本中的数据是一致的,如果不一致,会使用同步的方式进行拷贝复制达到一致性。
二、一致性分类
2.1 强一致性
要求系统写入什么,读出来的就是什么,但实现起来往往对系统性能影响很大,而且难以实现。
2.2 弱一致性
系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后能够达到一致,但会尽可能的保证在某个时间级别后,数据能够达到一致状态。
2.2.1 读写一致性
用户读取自己写入结果的一致性,保证用户能够第一时间看到自己更新的内容。
比如:我们发一条朋友圈,朋友圈的内容是不是被你的好友第一时间看到不重要,但是一定要显示在自己的列表上。
解决方案:
- 对于一些特定的内容我么只从主库(写操作的库)去读,但是会对于主库造成很大压力。
- 设置一个更新窗口,在更新的一段时间范围内,默认从主库读取,过了这个时间段,挑选有更新的从库读取。
- 记录用户的更新时间戳,在请求的时候把这个时间戳带上,比如主库更新时间为09:00:00,从库记录中最近更新时间为08:58:00,这样带有09:00:00时间戳的请求因为大于从库的最新更新时间一律被从库拒绝,因为主库尚未同从库数据同步。
2.2.2 单调读一致性
本次读到的数据不能比上次读到的旧。
例:你更新完手机号,多次访问个人资料页,有的时候你会发现手机号是最新的,有的时候则是旧的!
上图案例解决办法:
根据用户id计算一个hash值,再通过hash值映射到机器,同一个用户不管怎么刷新,都只会被映射到同一台机器。
2.2.3 因果一致性
指如果节点A在更新完某个数据后通知了节点B,那么节点B之后对于该数据的访问和修改都是基于A更新后的值,与此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制。
2.2.4 最终一致性
最终一致性是分布式一致性模型中最弱的,其不考虑所有的中间状态的影响,只保证当没有新的更新之后,经过一段时间之后,最终系统内所有的副本数据都是正确的,它最大程度的保证了系统的并发能力,也因此,在高并发的场景下,他也是使用最广的一致性模型!
保证数据完整性!