Snitches概述
Cassandra提供了Snitches功能,可以知道集群中的每个节点所属数据中心和机架。所有机架感应策略都实现了相同的接口IEndpointSnitch。先来看看Snitches的类图:
IEndpointSnitch接口中提供了比较实用的方法:
- //通过ip地址获取机架
- publicStringgetRack(InetAddressendpoint);
- //通过ip地址获取数据中心
- publicStringgetDatacenter(InetAddressendpoint);
- //按节点距离排序
- publicList<InetAddress>getSortedListByProximity(InetAddressaddress,Collection<InetAddress>unsortedAddress);
- //比较节点与指定节点远近
- publicintcompareEndpoints(InetAddresstarget,InetAddressa1,InetAddressa2);
- //开如gossip协议
- publicvoidgossiperStarting();
(1)SimpleSnitch:这种策略不能识别数据中心和机架信息,适合在单数据中心使用;
(2)NetworkTopologySnitch:这种策略提供了网络拓扑结构,以便更高效地消息路由;
(3)DynamicEndpointSnitch:这种策略可以记录节点之间通信时间间隔,记录节点之间通信速度,从而达到动态选择最合适节点的目的。
SimpleSnitch比较简单就不用介绍了,此类只是一个默认实现。下面主要介绍NetworkTopologySnitch和DynamicEndpointSnitch两种策略。
NetworkTopologySnitch
- publicintcompareEndpoints(InetAddressaddress,InetAddressa2)
- {
- if(address.equals(a1)&&!address.equals(a2))
- return-1;
- if(address.equals(a2)&&!address.equals(a1))
- return
- StringaddressDatacenter=getDatacenter(address);
- Stringa1Datacenter=getDatacenter(a1);
- Stringa2Datacenter=getDatacenter(a2);
- if(addressDatacenter.equals(a1Datacenter)&&!addressDatacenter.equals(a2Datacenter))
- if(addressDatacenter.equals(a2Datacenter)&&!addressDatacenter.equals(a1Datacenter))
- StringaddressRack=getRack(address);
- Stringa1Rack=getRack(a1);
- Stringa2Rack=getRack(a2);
- if(addressRack.equals(a1Rack)&&!addressRack.equals(a2Rack))
- if(addressRack.equals(a2Rack)&&!addressRack.equals(a1Rack))
- return0;
- }
2、到这里表示3个节点ip均不相同,与1一样,比较数据中心,然后比较机架;
3、到这里表示同数据中心,同机架,返回0.
这里用到了两个方法:getDatacenter和getRack,不同的子类实现不同。AbstractNetworkTopologySnitch有四个子类实现:
PropertyFileSnitch
- #DataCenterOne
- 175.56.12.105=DC1:RAC1
- 175.50.13.200=DC1:RAC1
- 175.54.35.197=DC1:RAC1