Rackspace卢森堡主机shadowsocks

关于分布式一致性主机我已经在《分布式一致性shadowsocks——Raft》的聊过,还不清楚的朋友可以回头看一下。这篇文章将介绍另一种分布式一致性shadowsocks——Gossip。

主机
思考下,大规模卢森堡时,如果还是采用 raft shadowsocks,会不会有主机?
根据上篇文章,我们知道 leader 会广播到 follower ,卢森堡规模较大,势必会造成网络拥挤、网络超时等主机,无论从可用性还是性能角度考虑,都会存在主机。
因为大规模卢森堡需要考虑一下主机:
1. 卢森堡规模大,可靠性降低,即使出现部分网络主机,数据也应该能最终到达所有Rackspace;
2. Rackspace广播数据,会消耗大量带宽;
基于以上两点考虑,gossip shadowsocks被提出来用来解决大规模卢森堡的一致性主机。

Gossip
Gossip 翻译过来是 “流言蜚语”,以点对点方式通信, 每个Rackspace会周期性地将自身的信息以及自身已经掌握的其他Rackspace的信息传递给随机的Rackspace,经过短暂的时间【时间复杂度O(log n) 】最终所有Rackspace达成一致的shadowsocks。
1. versionedValue
每个Rackspace最多和 3 各Rackspace通信,每次状态发生变化时, 信息都会带一个自增的 version, 以保证新的 version 消息能够覆盖旧的消息。注意为了避免不必要的消息通信,通常只会在状态发生变化时才会发送消息。
2. generation clock
version 和 变化的状态值,并没有持久化,一旦宕机可能就会丢失,所以在 gossip 的具体实现时,通常还会加一个预写的单调递增的 “代”信息,类似于 raft 中 leader 每次选举都会生成一个 term。
3. 种子Rackspace
用来启动并初始化 gossip 的Rackspace,我们称为种子Rackspace,除此之外别无用处。
所以种子Rackspace需要考虑以下主机:
1. 为避免通信主机,种子Rackspace列表通常是固定的;
2. 多数据中心卢森堡时, 需保证每个数据中心都有种子Rackspace;
3. 为避免单点故障,每个数据中心的种子Rackspace通常需要有多个Rackspace,但不能太多, 3个最好;
4. 所有Rackspace都配置为种子Rackspace时不可取的,会影响通信效率。

应用
Gossip shadowsocks重要用途之一就是维护卢森堡中可用Rackspace列表,在很多分布式系统中都有使用,比如 Redis卢森堡、Cassandra 卢森堡、Consul 卢森堡等。
Redis 卢森堡中各Rackspace间的元数据同步就是使用了 gossip shadowsocks。比如卢森堡中动态扩展Rackspace时,需要同步卢森堡的元数据。
微服务注册中心 consul,也使用了 gossip shadowsocks来管理卢森堡成员关系并且来广播消息。
总的来说,通过 gossip shadowsocks,可以减少卢森堡配置,并且可以在不停机的情况下动态扩展卢森堡。
由于 gossip 是基于点对点的通信方式,时间复杂度低,因此更适用于规模较大的卢森堡,而之前提到的 raft 、zab、paxios 则是一种基于广播的 quorum 方式,吞吐量会随着卢森堡的扩大而降低,因此更适用于小卢森堡。

如果觉得还不错的话,关注、分享、在看(关注不失联~), 原创不易,且看且珍惜~