非集中式结构
什么是非集中式结构?
在非集中式结构中,服务的执行和数据的存储被分散到不同的服务器集群,服务器集群之间通过消息传递进行通信和协调,非集中式结构没有中央服务器和节点服务器之分,所有的服务器地位都是平等的。
非集中式结构解决了集中式结构中面临的单点瓶颈和单点故障问题,提升了系统的并发度,比较适合大规模集群的管理。
本文集中描述三种典型的非集中式架构系统:
- Akka集群
- Redis集群
- Cassandra集群
Akka集群
Akka是一个开发库和运行环境,用于构建可扩展、弹性的、快速响应的应用程序。
Akka基于Actor模型实现,Actor模型是一个封装了状态和行为的对象,它接收消息并基于该消息执行计算。Actor之间通信的唯一机制就是消息传递,每个Actor都有自己的MailBox。
Actor发送的Mail信息会存储在接收方的MailBox中,接受党按照mail到达的先后顺序,从MailBox中提取mail消息,并进行相应的计算处理。
Actor模型采用异步消息调用机制,具有非阻塞、高性能等特点,可以用于处理并发问题。Akka集群充分利用了Actor模型的优势,提供了一个非集中式架构的集群管理模块,用来构建可扩展、弹性的分布式应用程序。
Akka集群中的节点分为Leader节点和非Leader节点,和非Leader节点相比,Leader节点只是增加了负责节点的加入和移出集群的功能。
对于数据同步,Akka集群采用的是谁的时间戳最新,就以谁为准的原则。Akka集群采用了Gossip协议,该协议是最终一致性协议,它的原理是每个节点周期性的从自己维护的集群节点列表中,随机选择k个节点,将自己存储的数据信息发给着k个节点,接收到该信息的节点采用前面讲的共识原则,对收到的数据和本地数据进行合并,这样迭代几个周期后,集群中所有节点上的数据信息就一致了。
Akka集群在创建时,节点被分为三种类型:
- 种子节点,使用静态配置文件方式或者系统运行时指定方式,可以生成种子节点,种子节点是普通节点加入集群的联系点,可以自动接收新加入集群的节点的信息。
- 首种子节点,首种子节点是配置文件中的第一个种子节点,其功能是集群第一次启动时,首种子节点启动起来,集群才能组建成功,保证集群第一次创建时只有一个集群。
- 普通节点,可以向种子节点或集群中的任意节点发送Join消息,请求加入集群。
Akka集群的每个节点启动后,读取配置文件获取种子节点列表,开始组建集群:
- 如果本节点是首种子节点,则把自己加入到集群列表,即以自己为中心构建集群。
- 如果本节点为种子节点,则向首种子节点请求加入集群,当首种子节点回复同意消息后,可以加入集群,否则不可加入集群。
- 如果本节点为普通节点,则可以向任一种子节点请求加入集群,收到同意后,则加入集群,否则不可加入集群。
Redis集群
Redis是一个开源的、包含多种数据结构的高性能Key-value数据库,主要有以下特征:
- 支持多种数据结构。
- 支持数据的持久化和备份。
- 基于内存运行,具有极高的性能。
Redis集群中不存在中央节点,每个节点都可以和其他节点通信,所有节点都负责存储数据、记录集群的状态,客户端可以访问或者连接到任一节点上。
Redis集群中每个节点都存在主备,也就是说每台服务器上都运行两个Redis服务,分别是主备,主故障后,备升主。
在数据的分片存储方面,Redis集群引入了”哈希槽“的概念,集群中内置了16384个哈希槽,每个节点负责一部分哈希槽,当客户端要存储一个数据或对象时,Redis先对key进行CRC16校验,然后进行16384取模,来决定哈希槽的编号,从而确定存储到哪个节点上。
Cassandra集群
Cassandra集群的架构是基于一致性哈希的完全P2P结构,没有Master的概念,所有节点都是同样的角色,彻底避免了因为单点问题导致的系统不稳定。Cassandra集群节点间的状态同步,也是通过Gossip协议来进行P2P通信的。
Cassandra集群中每个节点都代表一个哈希值,每次客户端可以向集群中的任意一个节点请求数据,接收到请求的节点将key值进行哈希操作,找出一致性哈希环上是哪个节点存储该数据u,然后将请求转发到相应节点上,并将查询结果反馈返回给客户端。
下面是关于三种不同的非集中式架构系统的详细比较。