-
Notifications
You must be signed in to change notification settings - Fork 65
2.连接ES集群
codingPao edited this page Dec 28, 2020
·
1 revision
为了保证高ES集群的高可用,同时支持对集群的负载均衡,ebatis
没有直接使用elasticsearch
提供的RestClient
和RestHighLevelClient
接口来访问集群,而是抽象出一个Cluster
。一个Cluster
代表一个ES集群,如果系统需要连接多个集群,则通过ClusterRouter
和ClusterLoadBalancer
来实现,多集群的路由和负载均衡。
Cluster
代表一个ES集群实例,ebatis
内建了两个实现:SimpleCluster
,FixWeightedCluster
和SimpleFederalCluster
。
SimpleCluster
和FixedWeightedCluster
的区别在于,后者是带固定权值的值,在对集群做负载均衡的时候,可以通过权值来控制负载的比例。SimpleFederalCluster
的特殊地方在于,在一批集群上做批量操作,同步一批集群,一般用于一批集群数据的增删改,不适用于查。
创建
Cluster
实例
Cluster cluster = Cluster.simple("127.0.0.1", 9200);
int weight = 10
WeightedCluster cluster = Cluster.weighted(weight, "127.0.0.1", 9200);
Cluster cluster = FederalCluster.of(Cluster.simple("127.0.0.1", 9200),Cluster.simple("127.0.0.1", 9300));
如果需要自己实现集群的定义,可以通过继承AbstractCuster
来实现,也可以你直接实现Cluster
接口。
ClusterRouter
用于路由出一个可以访问Cluster
,内部是通过负载均衡器ClusterLoadBalancer
,来同一组集群中,选中一个集群的。根据不同的负载均衡器,ebatis
内建了多个对应的路由器:
序号 | 路由器 | 负载均衡器 | 备注 |
---|---|---|---|
1 | RandomClusterRouter |
RandomClusterLoadBalancer |
随机负载均衡 |
2 | RoundRobinClusterRouter |
RoundRoubinClusterLoadBalancer |
轮询负载均衡 |
3 | SingleClusterRouter |
SingleClusterLoaderBalancer |
只有一个集群 |
4 | WeightedClusterRouter |
WeightedClusterLoadBalancer |
权重负载均衡 |
创建 ClusterRouter实例
Cluster[] clusters = {Cluster.simple("127.0.0.1", 9200), Cluster.simple("127.0.0.2", 9200)};
// 随机路由器
ClusterRouter router = ClusterRouter.random(clusters);
// 轮询路由器
ClusterRouter router = ClusterRouter.roundRobbin(cluster);
// 带权重的路由器,带权重的集群必须实现Weighted接口
int weight 10;
FixedWeightedCluster[] clusters = {Cluster.weighted(weight, "127.0.0.1", 9200)}
ClusterRouter router = ClusterRouter.weighted(clusters);
// 单集群路由
Cluster cluster = Cluster.simple("127.0.0.1", 9200);
ClusterRouter router = ClusterRouter.single(cluster);
集群的加载通过SPI方式。
@AutoService(ClusterRouterProvider.class)
public class SampleClusterRouterProvider implements ClusterRouterProvider {
public static final String SAMPLE_CLUSTER_NAME = "sampleCluster";
@Override
public ClusterRouter getClusterRouter(String name) {
if (SAMPLE_CLUSTER_NAME.equalsIgnoreCase(name)) {
Cluster cluster = Cluster.simple("127.0.0.1", 9200, Credentials.basic("admin", "123456"));
ClusterRouter clusterRouter = ClusterRouter.single(cluster);
return clusterRouter;
} else {
return null;
}
}
}