簡介
今天我們不講三國,我們講一講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讀寫分離了吧!!!!
如果您覺得我的文章對你有一定的幫助,幫我點個贊偶