1 /* 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 package org.apache.hadoop.hbase.replication; 20 21 import java.util.List; 22 import java.util.Map; 23 import java.util.Set; 24 import java.util.UUID; 25 26 import org.apache.hadoop.classification.InterfaceAudience; 27 import org.apache.hadoop.conf.Configuration; 28 import org.apache.hadoop.hbase.ServerName; 29 30 /** 31 * This provides an interface for maintaining a set of peer clusters. These peers are remote slave 32 * clusters that data is replicated to. A peer cluster can be in three different states: 33 * 34 * 1. Not-Registered - There is no notion of the peer cluster. 35 * 2. Registered - The peer has an id and is being tracked but there is no connection. 36 * 3. Connected - There is an active connection to the remote peer. 37 * 38 * In the registered or connected state, a peer cluster can either be enabled or disabled. 39 */ 40 @InterfaceAudience.Private 41 public interface ReplicationPeers { 42 43 /** 44 * Initialize the ReplicationPeers interface. 45 */ 46 void init() throws ReplicationException; 47 /** 48 * Add a new remote slave cluster for replication. 49 * @param peerId a short that identifies the cluster 50 * @param clusterKey the concatenation of the slave cluster's: 51 * hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent 52 */ 53 void addPeer(String peerId, String clusterKey) throws ReplicationException; 54 55 /** 56 * Add a new remote slave cluster for replication. 57 * @param peerId a short that identifies the cluster 58 * @param clusterKey the concatenation of the slave cluster's: 59 * hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent 60 * @param tableCFs the table and column-family list which will be replicated for this peer 61 */ 62 void addPeer(String peerId, String clusterKey, String tableCFs) throws ReplicationException; 63 64 /** 65 * Removes a remote slave cluster and stops the replication to it. 66 * @param peerId a short that identifies the cluster 67 */ 68 void removePeer(String peerId) throws ReplicationException; 69 70 /** 71 * Restart the replication to the specified remote slave cluster. 72 * @param peerId a short that identifies the cluster 73 */ 74 void enablePeer(String peerId) throws ReplicationException; 75 76 /** 77 * Stop the replication to the specified remote slave cluster. 78 * @param peerId a short that identifies the cluster 79 */ 80 void disablePeer(String peerId) throws ReplicationException; 81 82 /** 83 * Get the table and column-family list string of the peer from ZK. 84 * @param peerId a short that identifies the cluster 85 */ 86 public String getPeerTableCFsConfig(String peerId) throws ReplicationException; 87 88 /** 89 * Set the table and column-family list string of the peer to ZK. 90 * @param peerId a short that identifies the cluster 91 * @param tableCFs the table and column-family list which will be replicated for this peer 92 */ 93 public void setPeerTableCFsConfig(String peerId, String tableCFs) throws ReplicationException; 94 95 /** 96 * Get the table and column-family-list map of the peer. 97 * @param peerId a short that identifies the cluster 98 * @return the table and column-family list which will be replicated for this peer 99 */ 100 public Map<String, List<String>> getTableCFs(String peerId); 101 102 /** 103 * Get the replication status for the specified connected remote slave cluster. 104 * The value might be read from cache, so it is recommended to 105 * use {@link #getStatusOfPeerFromBackingStore(String)} 106 * if reading the state after enabling or disabling it. 107 * @param peerId a short that identifies the cluster 108 * @return true if replication is enabled, false otherwise. 109 */ 110 boolean getStatusOfConnectedPeer(String peerId); 111 112 /** 113 * Get the replication status for the specified remote slave cluster, which doesn't 114 * have to be connected. The state is read directly from the backing store. 115 * @param peerId a short that identifies the cluster 116 * @return true if replication is enabled, false otherwise. 117 * @throws IOException Throws if there's an error contacting the store 118 */ 119 boolean getStatusOfPeerFromBackingStore(String peerId) throws ReplicationException; 120 121 /** 122 * Get a set of all connected remote slave clusters. 123 * @return set of peer ids 124 */ 125 Set<String> getConnectedPeers(); 126 127 /** 128 * List the cluster keys of all remote slave clusters (whether they are enabled/disabled or 129 * connected/disconnected). 130 * @return A map of peer ids to peer cluster keys 131 */ 132 Map<String, String> getAllPeerClusterKeys(); 133 134 /** 135 * List the peer ids of all remote slave clusters (whether they are enabled/disabled or 136 * connected/disconnected). 137 * @return A list of peer ids 138 */ 139 List<String> getAllPeerIds(); 140 141 /** 142 * Attempt to connect to a new remote slave cluster. 143 * @param peerId a short that identifies the cluster 144 * @return true if a new connection was made, false if no new connection was made. 145 */ 146 boolean connectToPeer(String peerId) throws ReplicationException; 147 148 /** 149 * Disconnect from a remote slave cluster. 150 * @param peerId a short that identifies the cluster 151 */ 152 void disconnectFromPeer(String peerId); 153 154 /** 155 * Returns all region servers from given connected remote slave cluster. 156 * @param peerId a short that identifies the cluster 157 * @return addresses of all region servers in the peer cluster. Returns an empty list if the peer 158 * cluster is unavailable or there are no region servers in the cluster. 159 */ 160 List<ServerName> getRegionServersOfConnectedPeer(String peerId); 161 162 /** 163 * Get the timestamp of the last change in composition of a given peer cluster. 164 * @param peerId identifier of the peer cluster for which the timestamp is requested 165 * @return the timestamp (in milliseconds) of the last change to the composition of 166 * the peer cluster 167 */ 168 long getTimestampOfLastChangeToPeer(String peerId); 169 170 /** 171 * Returns the UUID of the provided peer id. 172 * @param peerId the peer's ID that will be converted into a UUID 173 * @return a UUID or null if the peer cluster does not exist or is not connected. 174 */ 175 UUID getPeerUUID(String peerId); 176 177 /** 178 * Returns the configuration needed to talk to the remote slave cluster. 179 * @param peerId a short that identifies the cluster 180 * @return the configuration for the peer cluster, null if it was unable to get the configuration 181 */ 182 Configuration getPeerConf(String peerId) throws ReplicationException; 183 }