参考资料:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architectureSnitchesAbout_c.html#concept_ds_c34_fqf_fk
一个snitch(告密者)决定应当从哪个数据数据中心和机架写入和读取数据。snitch通知Cassandra关于网络的拓扑情况以保证数据请求能够高效地路由并且允许通过把机器按数据中心和机架分组以便Cassandra放置数据副本。所有的节点关于snitch的配置应当是一致的。Cassandra尽全力以保证在一个机架上只有一个备份(不在同一个机架上放多个备份,而是放置在不同机架上)。
提示:如果在数据插入到集群后修改了snitch配置,你必须进行一次深度的恢复,因为snitch影响数据备份放置的位置。
Dynamic snitching
显示了从多个备份中读取数据并根据历史选择最好的备份的能力。
如果可能的话,使请求不路由到性能差的节点。dynamic snitch是默认启用的并在大多数情况下被推荐使用。默认情况下,所有的snitch都使用dynamic snitch层来显示读取延迟,如果可能的话,不将请求路由到性能差的节点上。dynamic snitch默认是启动的,多数部署情况下都建议使用dynamic snitch。
SimpleSnitch
默认的SimpleSnitch不需要知道数据中心和机架的信息。当使用数据中心时,可以使用SimpleSnitch。使用SimpleSnitch时,你需要指定keyspace的策略选项只有一项——复制因子。
RackInferringSnitch
RackInferringSnitch通过机架和数据中心来定义节点的位置,节点用进制表示ip地址的的第二组为数据中心,第三组为机架。下面是个例子:
PropertyFileSnitch
根据机架和数据中心决定节点的位置。这个snitch在配置文件cassandra-topology.properties中由用户定义网络情况描述。使用这个snitch的情况有两种:节点的ip地址不均匀或者如果你的数据副本需求比较复杂。当使用这个snitch时,你可以定义你想要的数据中心的名字。请确保数据中心的名字和keyspace的复制策略相关联。配置文件cassandra-topology.properties中应当包含集群中的每一个节点,并且每一个节点的cassandra-topology.properties应当相同。
如果你的ip地址分布不均匀,并且有两个物理数据中心和一个逻辑数据中心,每个物理数据中心有两个机架,逻辑数据中心存放分析数据的备份。cassandra-topology.properties可能如下:
# Data Center One
175.56.12.105 =DC1:RAC1
175.50.13.200 =DC1:RAC1
175.54.35.197 =DC1:RAC1
120.53.24.101 =DC1:RAC2
120.55.16.200 =DC1:RAC2
120.57.102.103 =DC1:RAC2
# Data Center Two
110.56.12.120 =DC2:RAC1
110.50.13.201 =DC2:RAC1
110.54.35.184 =DC2:RAC1
50.33.23.120 =DC2:RAC2
50.45.14.220 =DC2:RAC2
50.17.10.203 =DC2:RAC2
# Analytics Replication Group
172.106.12.120 =DC3:RAC1
172.106.12.121 =DC3:RAC1
172.106.12.122 =DC3:RAC1
# default for unknown nodes default =DC3:RAC1
GossipingPropertyFileSnitch
GossipingPropertyFileSnitch定义了一个本地节点的数据中心和机架。使用gossip传播信息给其他节点。conf目录下的配置文件cassandra-rackdc.properties定义了默认地数据中心和机架:
dc =DC1
rack =RAC1
EC2Snitch
将一个简单的集群(集群中的所有节点都在一个单一区域内)部署在亚马逊的EC2是可以使用EC2Snitch。这个区域被视为数据中心并且可用的区域被视为数据中心上的机架。例如,如果一个节点在us-east-1a,us-east是数据中心的名字,1a是机架的位置。因为私人的ip地址被使用了,snitch不能跨越多个区域。当定义keyspace的策略选项时,使用EC2的区域名字(例如us-east)作为数据中心的名字。
EC2MultiRegionSnitch
当你在亚马逊Use the EC2 EC2 上布置一个多区域的集群时,请使用Amazon EC2。当使用EC2Snitch时,区域被视为数据中心并且可用的区域被视为数据中心上的机架。例如,如果一个节点在us-east-1a,us-east是数据中心的名字,1a是机架的位置。
这个snitch使用公网地址作为作为广播地址从而能够方便的跨越区域。这就意味着你必须配置每一个节点,设置listen_address为内网地址,broadcast_address为公网地址。这样就允许在一个EC2区域的节点绑定另一个区域的节点,从而实现了多个数据中心。(对于区域内的通信,在连接建立后Cassandra转换成内部ip)。
此外,你必须在配置文件cassandra.yaml中设置种子节点的地址,而且必须是公网ip,因为内网地址是不能路由的。例如:
seeds: 50.34.16.33, 60.247.70.52
对于每一个种子节点,使用这个命令去找到公共的ip地址:
curl http://instance-data/latest/meta-data/public-ipv4
最后,请确保参数storage_port 或者 ssl_storage_port是可以被访问的。
当定义keyspace的策略选项时,使用EC2的区域名字(例如us-east)作为数据中心的名字。