Class DNSMembershipProvider
- java.lang.Object
-
- org.apache.catalina.tribes.membership.MembershipProviderBase
-
- org.apache.catalina.tribes.membership.cloud.CloudMembershipProvider
-
- org.apache.catalina.tribes.membership.cloud.DNSMembershipProvider
-
- All Implemented Interfaces:
ChannelListener,Heartbeat,MembershipProvider
public class DNSMembershipProvider extends CloudMembershipProvider
AMembershipProviderthat uses DNS to retrieve the members of a cluster.Relying solely on DNS to determine cluster membership requires that all DNS caching between the cluster nodes and the authoritative name server must honour the TTL set by the authoritative name server. Experience has shown that that is often not the case. Therefore, to ensure that new cluster members are not excluded from the cluster due to a stale DNS cache, this membership service accepts messages from any node regardless of whether it or not is listed as a cluster member in DNS and adds that node to the cluster. The DNS entry is, effectively, used by new nodes to identify the other nodes in the cluster to which cluster messages should be sent.
If more control is required over cluster membership, users are strongly encouraged to use
KubernetesMembershipProviderinstead. Alternatively, theEncryptInterceptormay be used to ensure that only nodes with knowledge of the shared key are able to participate in the cluster.TODO: Make the "accept messages from any node and add that node to the cluster" behaviour optional.
Configuration example for Kubernetes
server.xml
minimal example for the Service my-tomcat-app-membership, note the selector<Server ... <Service ... <Engine ... <Host ... <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.cloud.CloudMembershipService" membershipProviderClassName="org.apache.catalina.tribes.membership.cloud.DNSMembershipProvider"/> </Channel> </Cluster> ...
dns-membership-service.yml
First Tomcat pod minimal example, note the labels that must correspond to the selector in the service.apiVersion: v1 kind: Service metadata: annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" description: "The service for tomcat cluster membership." name: my-tomcat-app-membership spec: clusterIP: None selector: app: my-tomcat-app
tomcat1.yml
Environment variable configurationapiVersion: v1 kind: Pod metadata: name: tomcat1 labels: app: my-tomcat-app spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080
DNS_MEMBERSHIP_SERVICE_NAME=my-tomcat-app-membership
-
-
Field Summary
-
Fields inherited from class org.apache.catalina.tribes.membership.cloud.CloudMembershipProvider
connectionTimeout, CUSTOM_ENV_PREFIX, expirationTime, headers, localIp, port, readTimeout, sm, startTime, streamProvider, url
-
Fields inherited from class org.apache.catalina.tribes.membership.MembershipProviderBase
executor, membership, membershipListener, service
-
-
Constructor Summary
Constructors Constructor Description DNSMembershipProvider()Construct a new DNSMembershipProvider.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanaccept(java.io.Serializable msg, Member sender)Invoked by the channel to determine if the listener will process this message or not.protected Member[]fetchMembers()Fetch current cluster members from the cloud orchestration.voidstart(int level)Start the membership provider.booleanstop(int level)Stop the membership provider.-
Methods inherited from class org.apache.catalina.tribes.membership.cloud.CloudMembershipProvider
digest, getEnv, getNamespace, heartbeat, init, messageReceived, updateMember
-
Methods inherited from class org.apache.catalina.tribes.membership.MembershipProviderBase
getMember, getMembers, hasMembers, setMembershipListener, setMembershipService
-
-
-
-
Method Detail
-
start
public void start(int level) throws java.lang.ExceptionDescription copied from interface:MembershipProviderStart the membership provider.- Specified by:
startin interfaceMembershipProvider- Overrides:
startin classCloudMembershipProvider- Parameters:
level- the readiness level- Channel.DEFAULT - will start all services
- Channel.MBR_RX_SEQ - starts the membership receiver
- Channel.MBR_TX_SEQ - starts the membership broadcaster
- Throws:
java.lang.Exception- if an error occurs
-
stop
public boolean stop(int level) throws java.lang.ExceptionDescription copied from interface:MembershipProviderStop the membership provider.- Specified by:
stopin interfaceMembershipProvider- Overrides:
stopin classCloudMembershipProvider- Parameters:
level- the readiness level- Channel.DEFAULT - will stop all services
- Channel.MBR_RX_SEQ - stops the membership receiver
- Channel.MBR_TX_SEQ - stops the membership broadcaster
- Returns:
trueif successful- Throws:
java.lang.Exception- if an error occurs
-
fetchMembers
protected Member[] fetchMembers()
Description copied from class:CloudMembershipProviderFetch current cluster members from the cloud orchestration.- Specified by:
fetchMembersin classCloudMembershipProvider- Returns:
- the member array
-
accept
public boolean accept(java.io.Serializable msg, Member sender)Description copied from interface:ChannelListenerInvoked by the channel to determine if the listener will process this message or not.- Specified by:
acceptin interfaceChannelListener- Overrides:
acceptin classCloudMembershipProvider- Parameters:
msg- Serializablesender- Member- Returns:
- boolean
-
-