简介
今天我们不讲三国,我们讲一讲elasticsearch(以下简称ES)读写分离,这是个好东西,全文索引的时候使用它贼得劲,对elasticsearch索引原理不太清楚的,请自行查找相关的文章
这里不做阐述,最近我在网上找了好多,可是关于elasticsearch读写分离的文章确实少之又少,因为es不想MySQL那样的数据库有主从复制的机制,使用mycat等第三方的插件
也可以实现读写分离的效果;所以我们要根据es的分片的机制去实现读写分离,具体的原理如下图所示:
图画的比较丑,我这里再详细说明一下
1、首先我们需要配置es集群的配置文件,让es集群分为hot和cool两个区
2、然后我们在导入数据到es集群之前,首先需要创建settings,在创建settings的时候,我们需要指定分片全部分到hot区、副本数为0(增加导入数据的速度),
3、导入数据到es,这样我们导入数据的时候就是在hot区进行的
4、调整副本数为1,这样是为了后面的操作
5、修改settings,指定分区为cool区,这样数据就会复制到cool区
6、读取数据,这样我们读取数据的时候就会从cool区去读取了
ES集群环境
IP地址 |
端口 |
Es版本号 |
分区 |
10.122.33.103 |
9202/9302 |
6.4.2 |
Hot |
10.122.33.104 |
9202/9302 |
6.4.2 |
hot |
10.122.33.96 |
9202/9302 |
6.4.2 |
Cool |
10.122.33.97 |
9202/9302 |
6.4.2 |
Cool |
10.122.33.97 |
9202/9302 |
6.4.2 |
Cool |
#######################################
配置流程
Elasticsearch配置文件:
首先我们需要配置es集群的配置文件(以下只列出了读写分离所需要的配置):
#指定node的属性标签名(也就是上面说的分区名)
node.attr.rack: hot
#强制使分片与副本分离。若只有hot标签的节点,索引只有分片可以写入,副本无法分配;若有hot、cool两种标签节点,相同分片与其副本绝不在相同标签节点上
cluster.routing.allocation.awareness.force.rack.values: hot,cool
cluster.routing.allocation.awareness.attributes: rack
指定分片分到hot区
#创建索引setting,指定分片在那个分区上(index_test1为索引名)
curl -H "Content-Type: application/json" -XPUT 'http://10.122.33.103:9202/ dm_transaction_service_sum /' -d '{
"settings" : {
"index.routing.allocation.require.rack": "hot",
"number_of_replicas" : 0
}
}'
#查看分片的情况(从查看分片的信息我们可以看到,默认的五个分片都在hot区)
导入数据到hot区
#插入数据到es
按照上面分片的结果,可以知道所有的写操作都在103和104两台机器上
更改副本数
#更改副本数为1
curl -H "Content-Type: application/json" -XPUT 'http://10.122.33.103:9202/ dm_transaction_service_sum_v20190114_new /_settings' -d '{
"number_of_replicas" : 1
}'
指定分片分区为cool
#把分片都挪到cool分区上,供后续索引查询使用
curl -H "Content-Type: application/json" -XPUT 'http://10.122.33.103:9202/ dm_transaction_service_sum_v20190114_new /_settings' -d '{
"index.routing.allocation.require.rack": "cool",
"number_of_replicas" : 0
}'
#查看集群分片的情况(现在所有的分片都在cool分区上)
怎么样,看到这里,应该明白了es读写分离了吧!!!!
如果您觉得我的文章对你有一定的帮助,帮我点个赞偶