elasticsearch 備份與恢復
本地備份
一 建立倉庫
首先需要建立一個倉庫,倉庫的型別支援Shared filesystem, Amazon S3, HDFS和Azure Cloud,暫時只掌握了檔案系統備份
方式一: 通過命令方式建立備份倉庫
a.修改elasticsearch安裝目錄下config/elasticsearch.yml,新增如下配置: path.repo: ["/usr/local/wutongyu/backup"] b.使用JAVA API建立倉庫,其中my_backup為倉庫名:
curl -XPUT http://localhost:9200/_snapshot/my_backup { "type": "fs", "settings": { "location": "/usr/local/wutongyu/backup/my_backup" } }
方式二: 修改配置檔案,呼叫API建立倉庫
a.修改elasticsearch安裝目錄下config/elasticsearch.yml,新增如下配置: path.repo: ["/usr/local/wutongyu/backup"] b.使用JAVA API建立倉庫
//連結es Settings esSettings = Settings.builder().put("transport.type","netty3").put("http.type", "netty3").put("cluster.name", "elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(esSettings); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.212.20"), Integer.parseInt("9300"))); //建立宣告倉庫 try { Settings settings =esSettings.builder().put("location", "/usr/local/wutongyu/backup/my_backup").build(); PutRepositoryRequestBuilder putRepo = new PutRepositoryRequestBuilder(client.admin().cluster(), PutRepositoryAction.INSTANCE); putRepo.setName( "my_backup").setType("fs").setSettings(settings).execute().actionGet(); } catch (Exception e) { e.printStackTrace(); }
二 備份索引
建立完倉庫後,進行備份操作,一個倉庫可以包含多個快照(snapshots),快照可以存所有的索引,部分索引或者一個單獨的索引,可以給索引指定一個唯一的名字,如下,將正在執行的所有索引備份到my_backup倉庫下一個叫mybackup_201807的快照中:
//不等待返回結果 curl -XPUT http://localhost:9200/_snapshot/my_backup/mybackup_201807 //等待返回結果 curl -XPUT http://localhost:9200/_snapshot/my_backup/mybackup_201807?wait_for_completion=true
備份部分索引,linux執行,去掉換行:
curl -XPUT http://localhost:9200/_snapshot/my_backup/mybackup_201807
{
"indices": "index_1,index_2"
}
三 檢視備份資訊
curl -XGET http://localhost:9200/_snapshot/my_backup/mybackup_201807
四 備份恢復
方式一 :命令恢復
恢復快照之前需要先將快照涉及的索引關閉,恢復後,索引會自動開啟,命令如下:
curl -XPOST http://localhost:9200/logstash-index-log-20171127/_close/
關閉索引後進行恢復:
//恢復mybackup_201807整個快照
curl -XPOST http://localhost:9200/_snapshot/my_backup/mybackup_201807/_restore
// 只恢復快照中的logstash-index-log-20171127索引
curl -XPOST http://localhost:9200/_snapshot/my_backup/mybackup_201807/_restore
{
"indices": "logstash-index-log-20171127"
}
方式二:API方式恢復
//連結es同上
List<String> indices = Lists.newArrayList();
try {
GetSnapshotsRequestBuilder builder = new GetSnapshotsRequestBuilder(client.admin().cluster(), GetSnapshotsAction.INSTANCE);
builder.setRepository("my_backup");
builder.setSnapshots("mybackup_201807");
GetSnapshotsResponse getSnapshotsResponse = builder.execute().actionGet();
//檢查索引是否存在,如果是,請關閉它,然後再恢復。
indices = getSnapshotsResponse.getSnapshots().get( 0 ).indices();
CloseIndexRequestBuilder closeIndexRequestBuilder = new CloseIndexRequestBuilder(client.admin().indices(), CloseIndexAction.INSTANCE);
closeIndexRequestBuilder.setIndices(indices.toArray(new String[indices.size()]));
closeIndexRequestBuilder.execute().actionGet();
} catch( Exception e ) {
log.error( "索引不存在,無法關閉!"+ ToStringBuilder.reflectionToString( indices.toArray(new String[indices.size()]) ));
}
// 執行恢復索引操作
RestoreSnapshotRequestBuilder restoreBuilder = new RestoreSnapshotRequestBuilder(client.admin().indices(), RestoreSnapshotAction.INSTANCE);
restoreBuilder.setRepository(repositoryName).setSnapshot(snapshot);
restoreBuilder.execute().actionGet();
遠端備份
一 遠端備份【json方式】
遠端備份有多種方式,當下記錄兩種遠端備份方式,一種是備份成json檔案,另外一種是通過檔案掛載,個人推薦使用json方式進行備份,如果使用檔案掛載,對es瞭解不夠透徹會出現各種坑。
1 安裝必要工具:
(1)因為這種備份方式是用node寫的,故依賴nodejs,linux安裝nodejs:
安裝:
cd /usr/local/wutongyu/tools
tar -xf node-v8.11.3-linux-x64.tar.xz
cd node-v8.11.3-linux-x64
ln -s /usr/local/wutongyu/tools/node-v8.11.3-linux-x64/bin/node /usr/local/bin
ln -s /usr/local/wutongyu/tools/node-v8.11.3-linux-x64/bin/node /usr/local/bin
配置環境變數,在/etc/profile檔案新增:
export NODE_HOME=/usr/local/wutongyu/tools/node-v8.11.3-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
執行如下命令讓環境變數設定生效:
source /etc/profile
(2)安裝 elasticdump:
cd /usr/local/wutongyu/tools
npm install elasticdump -g
2 本地備份,備份成json格式:
elasticdump --type=data --input="http://localhost:9200/MyIndex" --output=myIndex.json --limit 1000 --sourceOnly --ignore-errors
其中:limit為單批執行的記錄數,最大1W
還原:
elasticdump --type=data --input="http://localhost:9200/MyIndex/MyType" --output=myIndexMyType.json --limit 1000 --sourceOnly --ignore-errors
3 叢集內資料備份
# 備份 mapping
elasticdump --input="http://1.1.1.1:9200/MyIndex" --output="http://1.1.1.2:9200/MyIndex" --type=mapping
# 備份資料
elasticdump --input="http://1.1.1.1:9200/MyIndex" --output="http://1.1.1.2:9200/MyIndex" --type=data --limit 1000 --sourceOnly --ignore-errors
4 ftp遠端備份與恢復
根據2中生成的json檔案,進行壓縮,通過JAVA API上傳到ftp伺服器,恢復操作的時候,從ftp伺服器下載備份檔案,解壓後,通過還原命令進行資料還原
二 遠端備份【檔案掛載方式】
可以簡單地理解為建立一個遠端倉庫,最簡單的使用nfs進行遠端掛載,將倉庫的目錄掛在到遠端的伺服器上【轉載:https://www.cnblogs.com/freeweb/p/6593861.html】,nfs是網路檔案系統,允許一個節點通過網路訪問遠端計算機的檔案系統,遠端檔案系統可以被直接掛載到本地,檔案操作和本地沒有區別,如果是區域網的nfs那麼io的效能也可以保證,下面就以CentOS 7.x為例,配置NFS
首先是服務端配置,服務端提供檔案系統供客戶端來掛載使用,配置過程如下:
首先檢查是否缺少基礎環境:
rpm -qa | grep nfs-utils
rpm -qa | grep rpcbind
如果這兩個包存在那麼可以直接使用,一般伺服器安裝的時候都會存在,如果沒有的話執行下面命令安裝:
yum -y install nfs-utils
yum -y install rpcbind
安裝完成之後配置nfs訪問目錄,配置檔案位置/etc/exports,預設是空的這裡新增一行:
/opt/nfs_test 192.168.1.8(rw,no_root_squash,no_all_squash,async)
這個配置表示開放本地儲存目錄/nfs_test 只允許192.168.1.8這個主機有訪問許可權,rw表示允許讀寫;no_root_squash表示root使用者具有完全的管理許可權;no_all_squash表示保留共享檔案的UID和GID,此項是預設不寫也可以;async表示資料可以先暫時在記憶體中,不是直接寫入磁碟,可以提高效能,另外也可以配置sync表示資料直接同步到磁碟;就配置這些就可以,儲存退出
如果想讓另外一臺主機也可以掛載這個目錄,那麼直接在後面追加即可,比如:
/opt/nfs_test 192.168.1.8(rw,no_root_squash,no_all_squash,async) 192.168.1.9(rw,no_root_squash,no_all_squash,async)
多個目錄可以每行配置一個,如果想讓這個網段的主機都可以訪問,假如此時子網掩碼是255.255.255.0,閘道器是192.168.1.0,那麼ip那裡可以寫成192.168.1.0/24表示允許地址段的所有主機訪問
現在配置完這些配置,啟動相關服務:
systemctl start rpcbind.service
systemctl start nfs.service
啟動之後可以通過status來檢視狀態,如果下次修改了配置,可以重啟服務來使配置生效,也可以直接執行如下命令重新整理配置:
exportfs -a
重新整理配置即可生效
現在服務端配置完畢,可以在對應的主機上來配置客戶端了,需要的環境和服務端一樣,要保證安裝nfs-utils和rpcbind
保證環境沒問題和上面一樣啟動rpcbind服務和nfs服務
首先建立掛載點: mkdir /mnt/test1
然後掛載nfs: mount -t nfs 192.168.1.3:/opt/nfs_test /usr/local/suninfo/backup/my_backup
掛載成功之後通過 df -h 可以檢視掛載的情況,nfs可用空間就是服務端/nfs_test目錄所能使用的最大空間
現在就可以往nfs寫入資料了,服務端往/nfs_test讀寫資料和客戶端往/mnt/test1讀寫資料是一樣的,這樣就實現了檔案同步和共享
解除安裝nfs和普通檔案系統一樣,使用: umount /usr/local/suninfo/backup/my_backup
如果需要設定開機掛載,在/etc/fstab新增一行配置即可: 192.168.1.3:/opt/nfs_test /usr/local/suninfo/backup/my_backup nfs defaults 1 1 然後服務端和客戶端都要用enable設定nfs和rpcbind服務開機啟動,然後才可以正常掛載