1. Elasticsearch 資料備份
Elasticsearch 可以通過快照命令對索引或者整個叢集進行快照和恢復,第一個快照會是一個資料的完整拷貝,但是所有後續的快照只儲存已存快照和新資料之間的差異。這意味著後續備份會相當快速,因為它們只傳輸很小的資料量。
快照和恢復模組允許建立單個索引或者整個叢集的快照到各種各樣的後臺倉庫,本文主要介紹將快照儲存到共享檔案系統
。
在共享檔案系統上建立快照需要執行以下步驟:
- 建立叢集的共享目錄;
- 修改ES配置,新增對共享目錄的設定;
- 建立備份倉庫;
- 建立快照;
- 檢視快照狀態;
- 必要時從快照恢復資料。
2. 通過 NFS 設定共享目錄
NFS 檔案共享能解決在叢集環境下圖片、附件等檔案共享的問題,這裡主要用於建立搜尋叢集的快照共享資料夾。
2.1 角色分配
主機名 | IP | 角色 |
---|---|---|
zk-master01 | 192.168.1.190 | NFS服務端 |
zk-slaver01 | 192.168.1.224 | NFS客戶端 |
zk-slaver02 | 192.168.1.48 | NFS客戶端 |
2.2 配置 NFS 服務端
以下操作只在
zk-master01(192.168.1.190)
上執行。
2.2.1 檢查安裝 NFS 服務
rpm -qa|grep nfs
rpm -qa|grep rpcbind
複製程式碼
如果元件沒有安裝,請執行下面的命令進行安裝:
yum install nfs-utils rpcbind
複製程式碼
2.2.2 設定開機自動啟動
CentOS 6 可以通過下面的命令設定開機啟動服務:
chkconfig nfs on
chkconfig rpcbind on
複製程式碼
CentOS 7 可以通過下面命令設定開機自動啟動:
systemctl enable rpcbind.service
systemctl enable nfs-server.service
複製程式碼
2.2.3 啟動服務
CentOS 6 執行下面命令:
service rpcbind start
service nfs start
複製程式碼
CentOS 7 執行下面命令:
systemctl start rpcbind.service
systemctl start nfs-server.service
複製程式碼
2.2.4 建立共享目錄
mkdir /data/elastic/bak/backup_es
# 由於備份程式是ES程式進行建立,因此設定目錄的擁有者為啟動ES程式的使用者
chown -R luculent /data/elastic/bak/backup_es
複製程式碼
2.2.5 修改配置檔案
vi /etc/exports
# 新增下面語句
/data/elastic/bak/backup_es *(rw,sync,no_root_squash,no_subtree_check)
複製程式碼
*
:允許所有的網段訪問rw
:讀寫許可權sync
:資料同步寫入內在和硬碟no_root_squash
:nfs客戶端共享目錄使用者許可權
更多配置詳情如下所示:
ro 只讀訪問
rw 讀寫訪問sync 所有資料在請求時寫入共享
async nfs 在寫入資料前可以響應請求
secure nfs 通過1024以下的安全TCP/IP埠傳送
insecure nfs 通過1024以上的埠傳送
wdelay 如果多個使用者要寫入nfs目錄,則歸組寫入(預設)
no_wdelay 如果多個使用者要寫入nfs目錄,則立即寫入,當使用async時,無需此設定。
hide 在nfs共享目錄中不共享其子目錄
no_hide 共享nfs目錄的子目錄
subtree_check 如果共享/usr/bin之類的子目錄時,強制nfs檢查父目錄的許可權(預設)
no_subtree_check 和上面相對,不檢查父目錄許可權
all_squash 共享檔案的UID和GID對映匿名使用者anonymous,適合公用目錄。
no_all_squash 保留共享檔案的UID和GID(預設)
root_squash root使用者的所有請求對映成如anonymous使用者一樣的許可權(預設)
no_root_squas root使用者具有根目錄的完全管理訪問許可權
anonuid=xxx 指定nfs伺服器/etc/passwd檔案中匿名使用者的UID
anongid=xxx 指定nfs伺服器/etc/passwd檔案中匿名使用者的GID
複製程式碼
2.2.6 重新整理配置立即生效
# 重新整理配置使得修改立刻生效
exportfs -a
# 檢視可掛載目錄
showmount -e 192.168.1.190
複製程式碼
2.3 配置客戶端
以下指令在
zk-slaver01(192.168.1.224)和zk-slaver02(192.168.1.48)
上執行。
請執行配置服務端的 1-4
步驟;NFS 安裝部署完成後,啟動 NFS,建立備份資料夾。
2.3.5 掛載目錄
# 檢視可掛載目錄
showmount -e 192.168.1.190
# 掛載
mount -t nfs 192.168.1.190:/data/elastic/bak/backup_es /data/elastic/bak/backup_es
複製程式碼
2.3.6 設定開機自動掛載
# 檢視當前掛載
df -h
# 設定開機自動掛載
vi /etc/fstab
192.168.1.190:/data/elastic/bak/backup_es /data/elastic/bak/backup_es nfs defaults 0 0
複製程式碼
3. 修改 ES 配置
配置完共享目錄後,需要修改 ES 配置,並重啟 ES 使其生效。
# 在 elasticsearch.yml 中新增下面配置來設定備份倉庫路徑
path.repo: ["/data/elastic/bak/backup_es"]
複製程式碼
4. 建立備份倉庫
4.1 開啟快照管理介面
ES 外掛 kopf 提供了圖形化的介面來建立管理快照,安裝 kopf 外掛的叢集直接訪問:http://es-ip:9200/_plugin/kopf/#!/snapshot
即可進入快照管理介面。
當然也可以通過點選選單進入介面。
4.2 建立備份倉庫
在快照介面左側的文字框新增備份倉庫資訊後點選create
按鈕即可完成建立,各個文字框欄位的作用:
repository name
:倉庫名稱type
:請務必選擇fs
location
:請填寫共享目錄名/data/elastic/bak/backup_es
max_restore_bytes_per_sec
:資料恢復時速度限制,預設(40m/s)max_snapshot_bytes_per_sec
:建立備份復時速度限制,預設(40m/s)chunk_size
:分片大小,預設不限制compress
:是否啟用壓縮
當然也可以通過 REST 客戶端執行下面請求來建立備份倉庫。
POST _snapshot/es_bak_20180710
{
"type": "fs",
"settings": {
"location": "/data/elastic/bak/backup_es",
"max_restore_bytes_per_sec": "50mb",
"max_snapshot_bytes_per_sec": "50mb",
"compress": true
}
}
複製程式碼
5. 建立快照
5.1 建立快照
在快照介面右側的snapshot name
文字框填寫快照名稱,repository
選擇剛才建立的倉庫es_bak_20180710
;ignore_unavailable
勾選true
;include_global_state
勾選false
;最後選擇需要參與備份的索引(不選擇表示全部索引,按住ctrl
鍵可以進行多選),點選create
按鈕即可建立快照。
當然也可以通過 REST 客戶端執行下面請求來建立快照。
POST _snapshot/es_bak_20180710/ss_2018_07_10
{
"indices": "img_face,lk_other",
"include_global_state": false,
"ignore_unavailable": true
}
複製程式碼
5.2 檢視快照
直接在位址列訪問下面的地址即可檢視ss_2018_07_10
快照的資訊。
http://es-ip:9200/_snapshot/es_bak_20180710/ss_2018_07_10
複製程式碼
等待一段時間重新訪問,提示建立成功。
6. 從快照恢復
# 全部恢復
POST /_snapshot/my_backup/snapshot_1/_restore
# 恢復指定的索引
POST /_snapshot/my_backup/snapshot_1/_restore
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": false,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1",
"index_settings": {
"index.number_of_replicas": 0
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
複製程式碼
Any Code,Code Any!
掃碼關注『AnyCode』,程式設計路上,一起前行。