使用快照迁移Elasticsearch数据
操作场景
使用HDFS作为快照存储仓库,将源端集群Elasticsearch数据迁移到目的端集群Elasticsearch。
为提升迁移速度,推荐将HDFS服务所在集群安装为普通模式。
支持开源Elasticsearch 6.8.0及其以上版本数据迁移到当前版本集群。
支持FusionInsight 6.5.1迁移到当前版本集群。
前提条件
- HDFS组件已安装,如果HDFS组件与Elasticsearch集群都是安全模式且非同一集群则需要配置跨集群互信。
- 源端和目的端集群Elasticsearch服务正常运行。
HDFS组件可以与源端或目的端Elasticsearch组件安装在同一个集群,也可以安装在其他集群。
操作步骤
- 检查源端和目的端Elasticsearch是否为安全模式。
在Manager首页,选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch”,进入Elasticsearch概述页面,单击“配置”进入配置页面。在配置页面右上方搜索框输入“ELASTICSEARCH_SECURITY_ENABLE”,确认该参数是否可以查询到且参数值为“true”。
- 配置安全模式下使用curl命令。参考Linux下curl命令的使用中的“环境准备”。
- 以root用户登录任意已安装Elasticsearch客户端的EsNode节点。
- 在HDFS组件的Manager首页,选择“集群 > 待操作集群的名称 > 集群属性”,进入集群属性页面,查看认证模式是否为安全模式。
- 创建访问HDFS服务的机机用户。
在HDFS组件的Manager界面选择“系统 > 权限 > 用户 > 添加用户”。填写“用户名”,例如test,“用户类型”为“机机”,加入用户组“supergroup”,选择“主组”为“supergroup”。
- 准备安全认证文件。
在HDFS组件的Manager界面选择“系统 > 权限 > 用户”,在用户名中选择机机用户test,选择“更多 > 下载认证凭据”,保存后解压得到用户的“user.keytab”文件,并重命名为“krb5.keytab”。
- 使用WinSCP工具以omm用户登录源端和目的端集群主OMS节点,上传“krb5.keytab”到指定路径下。例如:“/home/omm”。
- 在源端集群和目的端Elasticsearch服务的每个实例配置路径“elasticsearch.install.path/cluster/实例目录/config/repository-hdfs”上传“krb5.keytab”文件。
例如:
在实例目录中上传krb5.keytab文件,例如:
./clusterscp.sh put /home/omm/krb5.keytab elasticsearch.install.path/cluster/EsMaster/config/repository-hdfs
./clusterscp.sh put /home/omm/krb5.keytab elasticsearch.install.path/cluster/EsNode1/config/repository-hdfs
- elasticsearch.install.path:Elasticsearch组件安装目录。
- 如果部署了EsNode2-9实例,请对所有实例执行上述命令。
- 准备HDFS客户端配置文件。
- 在HDFS组件的Manager首页,选择“集群 > 待操作集群的名称 > 服务 > HDFS”,在右上方选择“更多 > 下载客户端”,选择客户端类型为“仅配置文件”,单击“确定”下载配置文件压缩包。
- 解压配置文件压缩包,获取以下配置文件用于10。
core-site.xml
hdfs-site.xml
- 登录源端集群Elasticsearch客户端所在EsNode节点,使用curl命令创建快照仓库。
curl -XPUT --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup" -H 'Content-Type: application/json' -d' { "type": "hdfs", "settings": { "uri": "hdfs://hacluster/", //core-site.xml fs.defaultFS "path": "/test/backup", //HDFS存放路径,不用提前创建 "security.principal": "test@HADOOP.COM", //HDFS组件的机机用户,仅在HDFS组件为安全模式时配置 "hadoop.security.authentication":"kerberos", //需要指定认证为kerberos,仅在HDFS组件为安全模式时配置 "load_defaults": true, "concurrent_streams": 5, "compress": "true", "conf.hadoop.rpc.protection":"privacy", "conf.dfs.nameservices":"hacluster", //参照hdfs-site.xml中dfs.nameservices进行配置 "conf.dfs.ha.namenodes.hacluster": "19,20",//参照hdfs-site.xml中dfs.ha.namenodes.hacluster进行配置 "conf.dfs.namenode.rpc-address.hacluster.19":"192.168.168.11:8020",//参照hdfs-site.xml中dfs.namenode.rpc-address.hacluster.19进行配置,并将主机名替换为对应的IP "conf.dfs.namenode.rpc-address.hacluster.20":"192.168.168.22:8020",//参照hdfs-site.xml中dfs.namenode.rpc-address.hacluster.20进行配置,并将主机名替换为对应的IP "conf.dfs.client.failover.proxy.provider.hacluster":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider", "max_snapshot_bytes_per_sec":"500mb", //每个节点的快照速率限制。默认为40mb每秒 "max_restore_bytes_per_sec":"500mb" //每个节点的恢复速率限制。默认为40mb每秒 } }'
返回结果为:
{"acknowledged":true}
- “conf.dfs.namenode.rpc-address.hacluster.19”和“conf.dfs.namenode.rpc-address.hacluster.20”参数名称中的19和20需要根据“dfs.ha.namenodes.hacluster”的实际值来配置。
- 当HDFS集群为非安全模式时请删除参数"security.principal"和"hadoop.security.authentication"。
- “--tlsv1.2”表示tlsv协议使用1.2版本,执行该curl命令时该参数可省略。如使用该参数时提示tlsv1.2不可用,则可能因为所使用的curl客户端不支持tlsv1.2版本。可通过curl --help命令查询对应的tlsv版本号,如tlsv1,参数应写为“--tlsv1”。
快照存储仓库创建好后,可使用下面的命令来查询仓库信息:
curl -XGET --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup?pretty"
- 创建快照。一个仓库可以包含相同集群的多个快照。一个快照在需要仓库内标记成一个唯一的名称。
- 创建快照,并开始备份数据。
- 使用以下命令在“my_backup”的仓库中创建一个名为“snapshot_1”的快照指令,并备份指定索引的数据。
curl -XPUT --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup/snapshot_1?wait_for_completion=true&pretty" -H 'Content-Type: application/json' -d' { "indices": "index_1,index_2" }'
返回结果为:
{ "snapshot" : { "snapshot" : "snapshot_1", "uuid" : "_02NT1ZJTLCrSJ5uJwqOsA", "version_id" : 6070199, "version" : "7.10.2", "indices" : [ "index_1", "index_2" ], "include_global_state" : true, "state" : "SUCCESS", "start_time" : "2020-03-10T07:32:21.458Z", "start_time_in_millis" : 1583825541458, "end_time" : "2020-03-10T07:32:25.283Z", "end_time_in_millis" : 1583825545283, "duration_in_millis" : 3825, "failures" : [ ], "shards" : { "total" : 20, "failed" : 0, "successful" : 20 } } }
“wait_for_completion”:标识此请求是否需要等待快照创建完成。默认立即返回,不等待快照创建结束。
- 使用以下命令在“my_backup”的仓库中创建一个名为“snapshot_1”的快照指令,并备份指定索引的数据。
- 执行成功后,使用以下查询命令可以看到已经备份的数据。
curl -XGET --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup/snapshot_1?pretty"
使用以下命令可以看到所有备份的数据:
curl -XGET --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup/_all?pretty"
- 创建快照,并开始备份数据。
- 在目的端集群Elasticsearch创建快照仓库。具体操作请参考10。
- 在目的端集群Elasticsearch关闭已存在的待还原索引。
例如,索引index_1在目的集群已存在并且是开启状态,需要先将索引index_1关闭。
curl -XPOST --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/index_1/_close?pretty"
返回结果为:
{ "acknowledged" : true, "shards_acknowledged" : true, "indices" : { "index_1" : { "closed" : true } } }
- 在目的端集群Elasticsearch还原快照即可还原已备份的索引。
curl -XPOST --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup/snapshot_1/_restore"
返回结果为:
{ "snapshot" : { "snapshot" : "snapshot_1", "indices" : [ "index_1", "index_2" ], "shards" : { "total" : 20, "failed" : 0, "successful" : 20 } } }
- 重复11到14直到源端集群所有索引数据迁移到目的端集群。
- 目的端集群Elasticsearch是否为安全模式。
- 登录目的端集群Manager界面,选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 更多”,查看是否“启用Ranger鉴权”。
- 是,参考源端集群Elasticsearch的Ranger策略,在目的端集群Elasticsearch集群创建Ranger策略。创建Ranger策略操作具体参考添加Elasticsearch的Ranger访问权限策略。
- 否,手动恢复索引权限信息,具体操作步骤参考同步索引属组信息。
- 完成Elasticsearch数据迁移后删除快照。
curl -XDELETE --tlsv1.2 --negotiate -k -u : "https://10.131.112.121:24100/_snapshot/my_backup/snapshot_1?pretty"
- 快照和还原机制只允许在同一个时间点运行一个快照和还原任务。
- 当前正在运行的快照可以使用删除快照操作来终止,删除操作将停止该快照并从仓库中删除之前的快照数据。