Elasticsearch 使用 NFS 进行数据备份

3,199 阅读5分钟

1. Elasticsearch 数据备份

Elasticsearch 可以通过快照命令对索引或者整个集群进行快照和恢复,第一个快照会是一个数据的完整拷贝,但是所有后续的快照只存储已存快照和新数据之间的差异。这意味着后续备份会相当快速,因为它们只传输很小的数据量。

快照和恢复模块允许创建单个索引或者整个集群的快照到各种各样的后台仓库,本文主要介绍将快照存储到共享文件系统

在共享文件系统上创建快照需要执行以下步骤:

  1. 创建集群的共享目录;
  2. 修改ES配置,添加对共享目录的设置;
  3. 创建备份仓库;
  4. 创建快照;
  5. 查看快照状态;
  6. 必要时从快照恢复数据。

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_20180710ignore_unavailable勾选trueinclude_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』,编程路上,一起前行。