Javashop電商系統的商品索引是使用的elasticsearch,對於高可用的要求有兩個重要的考量:java
一、集羣化node
二、可擴容git
三、冗災shell
冗災就要實現es的持久化,要考慮到es宕機的狀況,當es因不可抗因素掛掉了,當咱們再恢復了es的運行後,商品索引也要隨之 一塊兒恢復。vim
本文着重討論elasticsearch的持久化部署方案,固然提供在方案也支持了集羣及擴容。 api
一、數據的存儲服務器
在k8s中的持久化部署不可避免的要用到持久卷,咱們採用nfs方式的持久捲來存儲es數據。elasticsearch
持久卷的詳細介紹請見這裏:測試
二、節點規劃
默認啓動5個節點,3主2數據。
根據es官方推薦每一個節點的智能要分離,所以maseter節點不存儲數據,只用來協調。
三、多節點的權限問題
es的數據目錄默認只容許一個節點訪問,但在k8s上採用了持久卷,全部節點的數據都存儲在這個捲上,這會致使es的訪問權限問題。
報錯以下:
java.io.IOException: failed to obtain lock on /usr/share/elasticsearch/data/nodes/0",
固然能夠經過更改es的配置max_local_storage_nodes來容許多個節點訪問同一個數據目錄,但es官方不推薦這樣作。
因此咱們的方案是更改每一個節點的數據存儲目錄來解決
ps:指定es配置項path.data來實現
舉例說明:
節點名 | 存儲目錄 |
es-data-1 | /usr/share/elasticsearch/data/es-data-1 |
es-data-2 | /usr/share/elasticsearch/data/es-data-2 |
先要創建nfs服務器
對於持久卷的結構規劃以下:
目錄 | 內容 |
---|---|
/nfs/data/esmaster | es master節點的數據 |
/nfs/data/esdata | es 數據節點的數據 |
關於索引的磁盤佔用:
請根據業務的數據量狀況來規劃持久卷硬件的狀況
根據咱們實際測算1000個商品大約須要1MB/每節點
默認狀況
在默認的規劃中,咱們使用使用k8s的master節點做爲nfs服務器,爲上述卷準備了10G的空間,請確保k8s master node 很多於10G的空閒磁盤。
請根據您的具體業務狀況選擇nfs服務器,若是條件容許最好是獨立的nfs服務器。
根據如上規劃創建nfs服務:
#master節點安裝nfs
yum -y install nfs-utils #建立nfs目錄 mkdir -p /nfs/data/{mqdata,esmaster,esdata} #修改權限 chmod -R 777 /nfs/data/ #編輯export文件 vim /etc/exports 粘貼以下內容: /nfs/data/esmaster *(rw,no_root_squash,sync) /nfs/data/esdata *(rw,no_root_squash,sync) #配置生效 exportfs -r #查看生效 exportfs #啓動rpcbind、nfs服務 systemctl restart rpcbind && systemctl enable rpcbind systemctl restart nfs && systemctl enable nfs #查看 RPC 服務的註冊情況 rpcinfo -p localhost #showmount測試,這裏的ip輸入master節點的局域網ip showmount -e <your ip>
若是成功能夠看到可被掛載的目錄:
# showmount -e 172.17.14.73
Export list for 172.17.14.73: /nfs/data/esmaster * /nfs/data/mqdata *
接下來,要在每個節點上安裝nfs服務以便使k8s能夠掛載nfs目錄
#全部node節點安裝客戶端
yum -y install nfs-utils systemctl start nfs && systemctl enable nfs
這樣就爲k8s的持久卷作好了準備。
有了nfs的準備,我就能夠創建持久捲了:
咱們分享了javashop內部使用的yaml倉庫供你們參考:
https://gitee.com/enation/elasticsearch-on-k8s
在您的k8s maseter節點服務器上 clone咱們準備好的yaml文件
git clone https://gitee.com/enation/elasticsearch-on-k8s.git
修改yaml目錄中的pv.yaml
修改其中的server配置爲nfs服務器的IP:
nfs:
server: 192.168.1.100 #這裏請寫nfs服務器的ip
在k8s master節點上執行下面的命令建立namespace:
kubectl create namespace ns-elasticsearch
經過下面的命令創建持久卷:
kubectl create -f pv.yaml
經過如下命令查看持久卷是否創建成功:
kubectl get pv
執行下面的命令建立es集羣
kubectl create -f elasticsearch.yaml
經過以上部署咱們創建了一個ns-elasticsearch的namespace,並在其中建立了相應的pvc、角色帳號,有狀態副本集以及服務。
有狀態副本集:
服務:
使用的是javashop本身基於es:6作的,加入了ik分詞插件,其餘沒有變化。
咱們默認開啓了對外nodeport端口,對應關係:
32000->9200
32100->9300
k8s內部能夠經過下面的服務名稱訪問:
elasticsearch-api-service.ns-elasticsearch:9300
elasticsearch-service.ns-elasticsearch:9200
等待容器都啓動成功後驗證。
一、生成索引
二、刪除副本集:
kubectl delete -f elasticsearch.yaml
三、創建副本集
kubectl create -f elasticsearch.yaml
四、查看以前的索引是否恢復
一、集羣發現:
- name: "discovery.zen.ping.unicast.hosts"
value: "elasticsearch-discovery"
創建了elasticsearch-discovery服務
二、映射持久卷
映射到:/usr/share/elasticsearch/data/
三、自定義數據目錄
- name: "path.data"
value: "/usr/share/elasticsearch/data/$(MY_POD_NAME)"
其中MY_POD_NAME是讀取的容器名稱,經過有狀態副本集保證惟一性的綁定:
- name: MY_POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
歡迎關注Javashop技術分享公衆號,觀看更多的視頻講解: