天天看點

mysql存儲資料到cephfs_采用cephfs實作Elasticsearch資料持久化

一、cephfs

參考了以下文章

在172.20.0.10上搭建了三節點ceph cluster

10.0.169.87         node1.cephfs-cluster (mons at {node1=10.0.169.87:6789/0})

10.0.149.141       node2.cephfs-cluster

10.0.235.158       node3.cephfs-cluster

每節點上挂在了一塊300G資料雲盤(采用lvm建立分區,友善以後擴容),在每個節點上将格式化後的檔案系統挂載到/var/local/osd[123]

[[email protected] ~]# mount -l | grep cephfs

/dev/mapper/vg--for--cephfs-lvm--for--cephfs on /var/local/osd1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

[[email protected] ~]# mount -l | grep cephfs

/dev/mapper/vg--for--cephfs-lvm--for--cephfs on /var/local/osd2 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

[[email protected] ~]# mount -l | grep cephfs

/dev/mapper/vg--for--cephfs-lvm--for--cephfs on /var/local/osd3 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

後續可以參考之前給出的兩篇文章完成cephfs的建立,然後将cephfs挂載到本地

[[email protected] ~]# mount -t ceph :6789:/ /opt -o name=admin,secret=

其中admin-key用如下方式擷取

[[email protected] opt]# ceph auth get client.admin

[[email protected] ~]# mount -l | grep opt

10.0.169.87:6789:/ on /opt type ceph (rw,relatime,name=admin,secret=,acl,wsize=16777216)

然後在cephfs中建立出後續需要的三個目錄

[[email protected] opt]# pwd

/opt

[[email protected] opt]# ll

總用量 0

drwxr-xr-x 1 1000 root 1 8月 1 22:07 elasticsearch_node1

drwxr-xr-x 1 1000 root 1 8月 1 22:07 elasticsearch_node2

drwxr-xr-x 1 1000 root 1 8月 1 22:07 elasticsearch_node3

二、persistent storage

使用簡單,建議使用。

在elasticsearch/persistent_storage目錄下有如下檔案。

drwxr-xr-x. 2 root root 30 7月 31 14:42 cephfs  (包含檔案 -rw-r--r--. 1 root root 173 7月 30 15:20 ceph-secret.yaml)

-rw-r--r--. 1 root root 1115 7月 31 15:50 replicset_elasticsearch_1.yaml

-rw-r--r--. 1 root root 1115 7月 31 15:50 replicset_elasticsearch_2.yaml

-rw-r--r--. 1 root root 1115 7月 31 15:50 replicset_elasticsearch_3.yaml

其中cephfs的secret檔案用于在k8s中建立出secret資源,儲存了通路cephfs的key等資訊。

replicaset_elasticsearch_1.yaml中需要注意以下内容

volumeMounts:

-  name: cephfs

mountPath: /usr/share/elasticsearch/data     #将cephfs中的elsticsearch_node1挂載到pod elasticsearch_node1中的/usr/share/elasticsearch/data目錄下。

volumes:

-  name: cephfs

cephfs:

monitors:

-  10.0.169.87:6789                                   # cephfs的管理節點

path: /elasticsearch_node1                       #之前建立的目錄

secretRef:                                                 #引用通路cephfs的secret

name: ceph-secret

2.persistent storage架構圖

data資料會被永久儲存到cephfs中,除非在elasticsearch中删除相關index;或者将cephfs挂載到本地,然後将elasticsearch_node[123]中的内容删除。

這裡特别要注意的是elasticsearch_node[123]目錄的權限問題,用之前方式建立出來的目錄使用者為root:root,但是在elasticsearch中需要elasticsearch使用者來運作elasticsearch程序,并将資料儲存在data中,在elasticsearch的docker image中,已添加更改目錄所有者操作,将elasticsearch_node[123]的所有者改為elasticsearch:root,對外映射看到的所有者為1000:root。

mysql存儲資料到cephfs_采用cephfs實作Elasticsearch資料持久化

3.為什麼要建立3個replicaset來管理3個elasticsearch pod執行個體,而不是在一個replicaset中将replicas設定為3 ?

在沒有添加cephfs存儲之前,采用的是使用一個replicaset來管理3個elasticsearch pod。

每個elasticsearch需要不同的空間來存儲自己的data資料,不能在replicaset中設定replicas為3,這樣會導緻每個elasticsearch的/usr/share/elasticsearch/data目錄挂載到相同cephfs目錄下。不建議在一個pod中建立建立3個container來挂載不同cephfs的目錄,這樣雖然能工作,但是這些container在同一個worker node上會導緻該node負載過重。

三、persistent volume and persistent volume claim

pv/pvc原理同persistent storage類似,此處僅給出相關原理便于了解。

pv/pvc架構圖

mysql存儲資料到cephfs_采用cephfs實作Elasticsearch資料持久化

需要以下幾點

persitent storage和pv/pvc一樣都是利用cephfs提供的posix接口将cephfs挂載到相應的worker node上後再利用docker volume将該目錄挂載到container中,可在相應worker node上利用docker inspect檢視container的mount資訊。

pv/pvc中聲明的大小可能并非cephfs中的大小(通常不是),具體能存放多少資料取決于cephfs。pv聲明的存儲大小是為了pvc選擇能夠滿足其需求的pv時使用。

pv是一類cluster level級别的資源,不屬于任何namespace,是以可以被任何namespace中pvc使用。

以cephfs為後端存儲的pv,經過驗證,其persistentVolumeReclaimPolicy隻支援Retain,而不支援Delete和Recycle。意味着删除pvc後,pv中的資料(其實是存儲在cephfs檔案系統中的資料)不會被删除,但此時該pv不能再被任何pvc所使用,隻能删除該pv然後重新建立。因為資料存儲在cephfs檔案系統中,是以不用擔心資料會丢失。Delete會将資料删除,Recycle将資料删除後重新建立pv以為其他pvc提供服務。

四、後期優化

cephfs讀寫性能。

需要對cephfs的讀寫性能進行優化,否則elasticsearch在初始化時需要較長時間。如果發現elasticsearch一直無法初始化完成(kubectl get pod 發現ready的數量為0),可能是liveness檢測的initialDelaySeconds時間過短,導緻elasticsearch還未完成初始化就被liveness kill掉然後重新開機了相關pod,可以将這個值設定得更長一些。