![JAR search and dependency download from the Maven repository](/logo.png)
com.gitee.yanfanvip.ClusterBuild Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of rocksdb Show documentation
Show all versions of rocksdb Show documentation
RocksDB Cluster and Replication cluster
The newest version!
package com.gitee.yanfanvip;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import org.jgroups.JChannel;
import org.jgroups.protocols.BARRIER;
import org.jgroups.protocols.CENTRAL_LOCK;
import org.jgroups.protocols.COUNTER;
import org.jgroups.protocols.FD_ALL;
import org.jgroups.protocols.FD_SOCK;
import org.jgroups.protocols.FRAG2;
import org.jgroups.protocols.MERGE3;
import org.jgroups.protocols.MFC_NB;
import org.jgroups.protocols.MULTI_PING;
import org.jgroups.protocols.TCPPING;
import org.jgroups.protocols.TCP_NIO2;
import org.jgroups.protocols.UNICAST3;
import org.jgroups.protocols.VERIFY_SUSPECT;
import org.jgroups.protocols.pbcast.GMS;
import org.jgroups.protocols.pbcast.NAKACK2;
import org.jgroups.protocols.pbcast.STABLE;
import org.jgroups.protocols.pbcast.STATE_TRANSFER;
import org.jgroups.stack.Protocol;
import com.gitee.yanfanvip.cluster.ClusterDatabase;
import com.gitee.yanfanvip.interfaces.Database;
import com.gitee.yanfanvip.replicate.AcrossClusterDispatch;
import com.gitee.yanfanvip.replicate.AcrossClusterReceive;
import com.gitee.yanfanvip.util.IPHelp;
public class ClusterBuild {
String cluster = "CLUSTER";
int port = 11850;
String[] nodes;
List protstack;
JChannel channel = null;
ClusterDatabase database = null;
public ClusterBuild(String cluster, int port, String nodes) throws Exception {
this.cluster = cluster;
this.port = port;
this.nodes = nodes.split(",");
initProtstack();
}
public String getCluster() {
return cluster;
}
static TCP_NIO2 getTCP(int port) {
TCP_NIO2 tcp = new TCP_NIO2();
tcp.setBindAddress(IPHelp.getAddress());
tcp.setBindPort(port).setPortRange(5).setBindToAllInterfaces(true);
return tcp;
}
static TCPPING getPing(String[] nodes, int defaultPort){
List address = new ArrayList();
for (String node : nodes) {
String[] adds = node.split(":");
if(adds.length > 1){
address.add(new InetSocketAddress(adds[0], Integer.valueOf(adds[1])));
}else{
address.add(new InetSocketAddress(node, defaultPort));
}
}
TCPPING PING = new TCPPING();
PING.setInitialHosts(address);
PING.setPortRange(5);
return PING;
}
private void initProtstack() {
protstack = new ArrayList<>();
protstack.add(getTCP(port));//传输协议
protstack.add(getPing(nodes, port));//发现协议
protstack.add(new MULTI_PING());//多协议监测
protstack.add(new MERGE3());//---如果群集由于某些原因(例如网络分区)而被拆分,则此协议会将子群集合并回一个群集---//
protstack.add(new FD_SOCK());//---故障检测---//
protstack.add(new FD_ALL());//---故障检测---//
protstack.add(new VERIFY_SUSPECT());//---故障检测---//
protstack.add(new BARRIER());//---一些状态传输协议使用BARRIER,因为它允许现有线程完成并阻止新线程一次性获取摘要和状态----//
protstack.add(new NAKACK2());//-- NAKACK2为发送到集群中所有节点的消息提供可靠的传送和FIFO ---//
protstack.add(new UNICAST3());//---UNICAST3为发送方和接收方之间的点对点消息提供可靠的传送和FIFO----//
protstack.add(new STABLE());//---稳定----//
protstack.add(new GMS());//---加入新会员----//
protstack.add(new MFC_NB());//---使用MFC(多播流控制)和单播流控制(UFC)实现流控制---//
protstack.add(new FRAG2());//---FRAG2仅对有效负载(不包括标头)进行分段----//
protstack.add(new STATE_TRANSFER());//State状态同步
protstack.add(new COUNTER());//原子计数器
protstack.add(new CENTRAL_LOCK());//锁
protstack.add(new ClusterDatabase(cluster, port));//数据库
}
public ClusterBuild setDatabaseReceive(int acrossPort){
protstack.add(new AcrossClusterReceive(acrossPort));
return this;
}
@SuppressWarnings("unchecked")
private T find(Class clazz) {
Protocol protocol = null;
for (Protocol p : protstack) {
if(clazz.isAssignableFrom(p.getClass())){
protocol = p;
}
}
return (T) protocol;
}
public ClusterBuild addAcrossClusterDispatch(String cluster, String nodes){
AcrossClusterDispatch dispatch = find(AcrossClusterDispatch.class);
if(dispatch == null){
dispatch = new AcrossClusterDispatch(this.cluster);
protstack.add(dispatch);
}
dispatch.addSite(cluster, nodes);
return this;
}
public JChannel getChannel() throws Exception{
if(channel == null){
channel = new JChannel(protstack);
channel.setDiscardOwnMessages(true);
channel.connect("CLUSTER");
database = channel.getProtocolStack().findProtocol(ClusterDatabase.class);
}
if(!this.channel.isConnected()){
this.channel.connect(cluster);
}
return channel;
}
public Database build() throws Exception {
getChannel();
return database;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy