分布式数据库CAP原理
传统数据库事务具备原子性,一致性,隔离性和持久性
分布式数据库是CAP
C(Consistency):强一致性,也就是同一时间所有节点的数据一直保持一致
A(Availiability):高可用性,服务一直可用
P(Partition tolerance):分区容错性,某节点或网络分区故障时,仍然能够对外提供一致性或可用性的服务
在分布式系统中,数据分区容错性是必然存在的。而C和A只能选择其一。
在分布式系统中,为了保证系统的可用性,通常都采用了复制的方式,避免一个节点损坏,导致整个系统不可用。就出现了每个节点的数据出现了很多个副本的情况,而数据从一个节点复制到另一个节点时需要时间和要求网络畅通,所以当p发生时,也就是无法向某个节点复制数据时,这时候有两个选择,
选择A时,那个失去联系的节点还可以向外提供服务,不过不能保证数据是一致性的。
选择C时,为了保证数据库的一致性,必须等待那个失去联系的节点恢复过来,此时那个节点不能对外提供服务,也就是系统属于不可用状态。
持久化
- RDB
在指定时间间隔内,将内存中的数据集的快照写入磁盘。
自动备份:
在关闭redis服务时,会自动将内存中的数据存入磁盘中的dump.rdb文件中。
也可以配置文件,设置在一定条件下就将数据存储到磁盘文件中。
缺点:如果服务意外down掉时,就会导致最后一次快照没持久化。
优点:适合大规模备份,对数据完整性和一致性要求不高。
也可以手动备份,每次执行完语句就备份,但这对性能消耗很大 - AOF
已日志的形式记录redis的所有写操作,只许追加文件,不能改写文件。在redis启动之初,去执行一遍所有的写操作,来构建数据。
追写策略:每次一执行完写操作就追加文件,性能较差。每秒追加文件,可能会导致最后一秒数据丢失。还有就是不追加
主从复制
-
复制原理
1.从服务器链接主服务器,并发送同步请求。2. 主服务器搜集完所有的写命令集,3. 发送快照,4. 从服务器载入快照。5. 主服务器发送缓存快照,6. 从服务器执行命令。完成数据的构建。全量复制是刚链接上时,从服务器会从主服务器获取所有的数据。
增量复制是开始工作时,主服务器的数据复制到从服务器中。
分布式锁实现原理
- 因为redis是单线程的,所以他的命令具备原子性,用setnx保存k-v实现分布式锁
- 当key不存在时,证明没加锁,可以保存
- 当key存在时,证明被加锁了,需要等待
- 如果加锁成功,但又遇到系统执行异常,导致key没有被释放,这会造成死锁
加过期时间,比如过期10秒
此时如果来A,B两个线程,A线程执行13秒,B线程执行7秒,当A线程执行到第10秒时,被自动释放锁,此时B线程加锁,执行3秒就被释放锁,因为A线程执行结束了会执行finnaly释放锁。锁就会一直失效
所以需要加UUID,线程唯一标识。 - 针对上面问题还需要加一个定时器线程,设置一个总过期时间和一个过期时间,当过期时间到总过期时间的1/3,所还没被释放,就延长总过期时间。