1. 程式人生 > >elasticsearch 備份與恢復

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服務開機啟動,然後才可以正常掛載