Cassandra 集群部署中配置的 Snitch 类型
1. 概述
在本教程中,我们将了解Snitch 的工作以及Cassandra *如何使用它来有效地路由请求。我们还将查看 Cassandra 中可用的各种类型的Snitch 。
2. 什么是Snitch ?
Snitch 只是报告每个节点所属的机架和数据中心——本质上,它确定并通知 Cassandra 集群的网络拓扑 。
有了集群拓扑的这种知识,包括节点之间的相对接近度,Cassandra 能够有效地将请求路由到集群内的适当节点。
2.1. 写操作上的Snitch
Cassandra 使用来自Snitch 的信息将节点分组到机架和数据中心。因此,为了避免在写入操作期间出现相关故障,Cassandra 尽一切努力不在同一个机架中存储副本。
2.2. 读操作上的Snitch
我们知道,在读取操作期间,Cassandra 必须根据它们的一致性级别 联系多个节点和副本。为了使读取操作高效,Cassandra 使用来自 snitch 的信息来识别将最快返回副本的节点。
然后查询该节点以获取完整的行信息。然后,Cassandra 向其他副本节点查询哈希值,以确保返回最新数据。
3. Snitch 的种类
**默认的Snitch SimpleSnitch不支持拓扑。也就是说,它不知道集群的机架和数据中心。**因此,它不适合多数据中心部署。
为此,Cassandra 提出了各种符合我们要求的Snitch 。通常,我们可以在配置文件cassandra.yml文件中通过属性名称endpoint_snitch来配置 snitch 的类型。
让我们看看几种类型的Snitch 以及它们是如何工作的。
3.1. PropertyFileSnitch
PropertyFileSnitch是一个机架感知的Snitch 。我们可以在名为cassandra-topology.properties的文件中将集群拓扑信息作为键值属性提供。在这个属性文件中,我们提供了每个节点所属的机架和数据中心名称。
此外,我们可以为机架和数据中心使用任何名称。但我们需要确保数据中心名称与keyspace定义中定义为NetworkTopologyStrategy的名称相匹配。
这是cassandra-topology.properties的示例内容:
# Cassandra Node IP=Data Center:Rack
172.86.22.125=DC1:RAC1
172.80.23.120=DC1:RAC1
172.84.25.127=DC1:RAC1
192.53.34.122=DC1:RAC2
192.55.36.134=DC1:RAC2
192.57.302.112=DC1:RAC2
# default for unknown nodes
default=DC1:RAC1
在上面的示例中,有两个机架(RAC1、RAC2)和一个数据中心(DC1)。任何未涵盖的节点 IP 都将落入默认数据中心 (DC1) 和机架 (RAC1)。
这个Snitch 的一个缺点是我们需要确保cassandra-topology.properties文件与集群中的所有节点同步。
3.2. GossipingPropertyFileSnitch
GossipingPropertyFileSnitch也是一个机架感知的Snitch 。为了避免按照PropertyFileSnitch的要求手动同步机架和数据中心,在这个Snitch 中,我们只需为cassandra-rackdc.properties文件中的每个节点单独定义机架和数据中心名称。
这些机架和数据中心的信息使用 gossip 协议与所有节点交换。
这是cassandra-rackdc.properties文件的示例内容:
dc=DC1
rack=RAC1
3.3. Ec2Snitch
顾名思义,Ec2Snitch 与Amazon Web Service (AWS) EC2中的集群部署有关。在单个 AWS 区域部署中,区域名称被视为数据中心,可用区名称被视为机架。
如果我们只需要单数据中心部署,则不需要属性配置。而在多数据中心部署的情况下,我们可以在cassandra-rackdc.properties文件中指定dc_suffix。
例如,在us-east地区,如果我们需要几个数据中心,我们可以提供dc_suffix配置为:
dc_suffix=_1_DC1
dc_suffix=_1_DC2
上面给出的每个配置都进入两个不同的节点。因此,它导致us_east_1_DC1 和us_east_1_DC2作为数据中心的名称。
3.4. Ec2MultiRegionSnitch
在 AWS 中进行多区域集群部署的情况下,我们应该使用Ec2MultiRegionSnitch。此外,我们需要同时配置cassandra.yaml和cassandra-rackdc.properties。
我们必须将公共 IP 地址配置为广播地址,如果需要,还可以将其用作cassandra.yaml中的种子节点。此外,我们必须配置一个私有 IP 地址作为listen_address。最后,我们必须在公共 IP 防火墙上打开session_port或ssl_session_port。
这些配置允许节点跨 AWS 区域进行通信,从而实现跨区域的多数据中心部署。在单个区域的情况下,Cassandra 节点在建立连接后切换到私有 IP 地址进行通信。
cassandra_rackdc.properties中跨区域每个节点的dc_suffix数据中心配置类似于Ec2Snitch。
3.5. GoogleCloudSnitch
顾名思义,GoogleCloudSnitch 用于在 Google Cloud Platform 中跨一个或多个区域进行集群部署。与 AWS 类似,区域名称被认为是数据中心,可用区是机架。
在单数据中心部署的情况下,我们不需要任何配置。相反,在多数据中心部署的情况下,类似于Ec2Snitch,我们可以在cassandra-rackdc.properties文件中设置dc_suffix 。
3.6. RackInferringSnitch
RackInferringSnitch从节点 IP 地址的第三个和第二个八位字节推断节点与机架和数据中心的接近程度。
4. 动态Snitch
默认情况下,Cassandra 将我们在cassandra.yml文件中配置的任何 snitch 类型与另一种称为DynamicEndpointSnitch 的 snitch 包装在一起。这个动态snitch从已经配置好的底层snitch中获取集群拓扑的基本信息。然后它监控节点的读取延迟,甚至跟踪任何节点中的压缩操作。
**然后动态Snitch 使用此性能数据为任何读取查询选择最佳副本节点。**通过这种方式,Cassandra 避免了将读取请求重新路由到错误或繁忙(执行缓慢)的副本节点。
动态 snitch 使用gossip的修改版本的Phi 累积故障检测机制来确定读取请求上的最佳副本节点。坏度阈值是一个可配置的参数,用于确定与性能最佳的节点相比,首选节点必须执行多糟糕才能失去其优先状态。
Cassandra 会定期重置每个节点的性能分数,让表现不佳的节点恢复并表现得更好,从而恢复其优先地位。