etcd与redis的特性解析
为什么写这个,因为感觉这玩意官方写得不太明白,所以想用更为通俗易懂的方式写清楚这是什么,看得愉快~
关于etcd
etcd 官方对它的定义是:一个高度一致的分布式键值存储系统,能为分布式系统或机器集群提供可靠的数据存储服务。它的厉害之处在于,即便遇到网络分区,也能优雅地完成领导者选举,而且机器故障也不怕,哪怕是领导者节点出问题也能应对。
咱们先拆拆 “分布式” 这三个字。etcd 可以由很多节点组成一个集群,最关键的是,每个节点存储的信息都高度一致。再看 “键值存储系统”,这说明它和 redis 本质上是一类东西,都是用来存键值对的。但两者的区别也很明显,etcd 主打的就是 “高度一致” 和 “分布式”,而 redis 集群里每个节点的信息并不完全相同。
更具体地说,redis 是基于内存进行读写的,这就让它特别适合高并发的场景;而 etcd 则更适合对一致性要求高的分布式场景。
etcd 能保证节点一致性,靠的是raft 算法。这个算法把节点分成了三类:领导者、追随者和候选人。领导者的职责很明确,负责处理写数据的请求,还得和追随者保持通信;追随者主要是处理客户端的读请求;候选人呢,就是未来有可能成为领导者的节点。
那一致性是怎么保证的? 简单说,就是要让追随者的数据和领导者保持一致,这是通过追随者向领导者发起心跳来实现的。有了心跳,领导者就能和追随者保持连接,一旦有新数据,就能随时通知追随者同步。当追随者处理客户端的读请求时,它会在领导者给的租期时间内完成操作,要是超过租期,就会主动和领导者通信,确保拿到的数据是最新的,这样就不会把脏数据返回给客户端了。
关于redis
主要提提 redis 的一个重要概念 —— 分布式锁。
首先,什么是分布式锁? 它是专门用在分布式场景下的锁,能保证在分布式环境中,多个服务同时只能有一个拿到这把锁。这好处可不小,在高并发环境里,能确保同一时间只有一个服务能访问特定的共享资源,从而避免出现竞态条件和数据不一致的问题。
那 redis的应用场景有哪些? 比如在高并发请求中,能保证多个请求同时到来时,对数据的更改不会出错;还能用来限流,保护服务器的高可用性。
为什么 redis 能实现分布式锁? 因为 Redis 的SETNX 命令是原子操作。在并发情况下,这个命令能保证只有一个客户端能成功设置锁,也就是说,只有一个服务能获得锁。一旦锁被创建,其他客户端就不能重复创建了。具体操作 起来是这样的:一个服务要访问共享资源时,会先检查锁对应的键是否存在。如果存在,说明已经有服务在访问了,那它就不能再访问,得等着锁被释放;如果不存在,就会创建这个键,也就是拿到锁,然后去访问资源,访问完再把键删掉,释放锁。另外,在分布式场景里,不管 redis 是作为集群还是单体存在,它都是独立于每个微服务的,这样每个微服务都能公平地加锁和释放锁。