使用Reindex工具迁移数据
操作场景
Reindex跨集群数据拷贝工具包的原理是通过利用reindex API,完成多个index的数据迁移。该工具包适用于两个Elasticsearch集群间数据的拷贝和迁移,实现数据的便捷复用和安全管理。
- 支持开源Elasticsearch 7.0.0~7.10.2版本数据迁移到Elasticsearch集群。
- MRS Elasticsearch基于开源7.10.2版本,支持Elasticsearch数据在7.10.2内核版本Elasticsearch之间迁移。
- 如果MRS源集群和目标集群版本不同,需要两个集群支持type的方式相同,比如都支持type或者都不支持type。6.7.1内核及以前版本默认支持type,7.10.2内核版本默认不支持type。
前提条件
- Elasticsearch目标集群已安装。
- Elasticsearch源集群索引已建立。
- Elasticsearch源集群和目标集群端口和网络互通。
- 为保证数据迁移结束后一致性,需要上游业务停止源集群的写操作,读服务可以正常进行。迁移完毕后,直接切换到新集群进行读写。如不停止写操作可能会存在数据最终的不一致。
- 若目标集群和源集群都是安全模式,需要配置跨集群互信。
- 已安装Elasticsearch客户端,例如安装目录为“/opt/client”。
操作步骤
修改集群配置
- 在目标集群增加remote白名单。
- 在源集群和目标集群关闭禁用安全传输层TLS低版本协议开关,请完成迁移后还原配置。
- 若源集群和目标集群都是普通模式,则请跳过该操作,执行3。
- 在Manager界面选择“集群 > 待操作集群的名称 > Elasticsearch > 配置”,参数类别选择“全部配置”。
- 选择“Elasticsearch > 安全”,修改“DISABLE_TLS_LOW_PROTOCOL”的值“false”。
- 在目标集群对认证模式参数reindex.ssl.verification_mode进行配置。
- 若源集群和目标集群都是普通模式,则无需配置该参数,直接进入下一步操作。
- 否则,选择“Elasticsearch > 自定义”,修改“elasticsearch.customized.configs”的值,增加“reindex.ssl.verification_mode”参数,并按照下表设置该参数的值。请完成迁移后还原配置。
表1 认证模式配置 源集群模式
目标集群模式
认证模式配置
普通模式
普通模式
无需增加参数“reindex.ssl.verification_mode”
安全模式
普通模式
将参数“reindex.ssl.verification_mode”的值设置为“none”。
普通模式
安全模式
将参数“reindex.ssl.verification_mode”的值设置为“none”。
安全模式
安全模式
将参数“reindex.ssl.verification_mode”的值设置为“none”。
- 保存配置后,重启Elasticsearch服务使配置生效。
修改配置文件
- 查看源集群和目标集群其中之一是否为安全模式。在Manager界面选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置”,搜索“ELASTICSEARCH_SECURITY_ENABLE”参数,确认该参数是否可以查询到且参数值为“true”(true表示开启了安全模式)。
- 根据表2 认证文件存放路径上传用户认证配置文件。若源集群为安全模式,目标集群为普通模式,上传源集群的用户认证配置文件;若源集群为普通模式,目标集群为安全集群,则上传目标集群的用户认证配置文件。
- 参考基于用户和角色的鉴权章节,创建角色,例如ES_Role。
- 创建用户,初始化密码,修改密码后方可使用。
- 在Manager界面选择 。
- 填写用户名,例如esuser(若源集群和目标集群都为安全模式,需确保源集群和目标集群用户名的名称一致)。将esuser加入用户组“elasticsearch”和“supergroup”,选择“主组”为“supergroup”,并绑定角色“ES_Role”取得权限。
- 选择“系统 > 权限 > 用户”,选择新创建用户后的“更多 > 初始化密码”,初始化密码后用户首次使用账号需要修改密码。
- 选择“系统 > 权限 > 用户”,选择新创建用户后的“更多 > 下载认证凭据”,选择集群信息后单击“确定”,下载压缩包文件。
- 将解压压缩包后得到的“user.keytab”和“krb5.conf”文件上传到Reindex迁移工具的指定目录下,参见表2。
表2 认证文件存放路径 源集群模式
目标集群模式
用户认证文件上传目录
普通模式
普通模式
无
安全模式
普通模式
- 在Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录下创建remote目录。
mkdir /opt/client/Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf/remote
- 将源集群的“user.keytab”和“krb5.conf”上传到remote目录。
- 创建表3的keytabPath并上传源集群的“user.keytab”和“krb5.conf”。
普通模式
安全模式
将目标集群的“user.keytab”和“krb5.conf”上传到Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录。
安全模式
安全模式
- 目标集群和源集群配置跨集群互信。
- 将目标集群的“user.keytab”和“krb5.conf”上传到Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录。
- 第三方的Elasticsearch集群均为普通模式。
- 目标集群是安全模式,如果其他用户需要读写迁移的索引数据,需要赋予相应的权限。详细权限信息请参考基于用户和角色的鉴权章节。
- 在Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录下创建remote目录。
- 修改工具包conf目录下的espara.properties参数配置文件。命令如下:
cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf
vi espara.properties
配置参考表3,配置样例如下:
#################### destination: FusionInsight Elasticsearch ############################# esServerHost=ip1:port1,ip2:port2,ip3:port3 # unit:s socketTimeout=30 connectTimeout=30 connectRequestTimeout=30 # Whether FusionInsight Elasticsearch cluster is in secure mode. true: secure, false: normal isSecureMode=true # FI ES cluster authentication user principal=esuser@<系统域名> ###################### source: old cluster ##################################### # Old cluster host must be '[scheme]://[host]:[port]', e.g. 'http://10.10.10.10:9200' oldClusterHost=http://ip:port # Whether old cluster is FusionInsight Elasticsearch secure mode. true: secure, false: normal. NOTE: Third-party Elasticsearch is false isOldSecureMode=false # Old cluster authentication user, configured only when isOldSecureMode is true oldPrincipal= # Old cluster needs Basic Authentication oldClusterUser= oldClusterPass= # unit:s oldCluster_socketTimeout=30 oldCluster_connectTimeout=30 oldCluster_connectRequestTimeout=30 ###################### other config ###################################### # Reindexing from a remote server uses an on-heap buffer that defaults to a maximum size of 100mb. # If the remote index includes very large documents you’ll need to use a smaller batch size. batchSize=1000 # indices support all and specified index # all: all indexes of old cluster in open state # specified index: support batches, separated by commas. e.g. index1,index2,index3 indices=index1,index2,index3 # Whether to create an index automatically. # true: create an index automatically, copy settings and mapping of the old cluster index. # false: need to create an index in advance and specify settings and mapping copySettingAndMapping=true # Whether exists type isTypeExist=false # Query parameters, connect with &, wait_for_completion defaults to false. # e.g. refresh&require_alias=false queryParameters=refresh # Number of indexes for batch data migration threadNum=24 # time field of indices. timeField= beginTime= endTime= # secure keytab path. only config when source is Elasticsearch secure mode and target is Elasticsearch normal. # need to put the keytab files in target Elasticsearch (esServerHost) server. keytabPath=/home/omm/conf
表3 espara.properties参数配置说明 参数
默认值
说明
esServerHost
ip1:port1,ip2:port2,ip3:port3
目标集群Elasticsearch中的实例配置。便于负载均衡,该参数配置了多组IP及端口号,格式为“IP:端口”,多组配置之间以英文逗号分隔。IP为Elasticsearch集群任意数据节点业务平面IP地址,端口号为该节点对外http(s)端口号。
实例配置查看方法如下:登录Manager后依次选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置”,搜索“INSTANCE_SERVER_PORT_LIST”参数。
说明:不要配置EsMaster的实例列表。
socketTimeout
30
目标集群socket超时时间,单位:秒。
connectTimeout
30
目标集群连接超时时间,单位:秒。
connectRequestTimeout
30
目标集群请求连接超时时间,单位:秒。
isSecureMode
false
目标Elasticsearch集群是否是安全模式。true表示安全模式,false表示普通模式。
principal
无
目标Elasticsearch集群鉴权用户名,isSecureMode为true时配置。格式为用户名@目标集群域名。
oldClusterHost
http://ip1:port1
源集群Elasticsearch的实例配置。格式为“[scheme]://[host]:[port]”。host为Elasticsearch源集群任意数据节点业务平面IP地址,端口号为该节点对外http(s)端口号。例如,http://10.10.10.10:9200。
isOldSecureMode
false
源集群是否是Elasticsearch安全模式,是:true;否:false。第三方的Elasticsearch均为false。
oldPrincipal
无
源集群鉴权用户,isOldSecureMode为true时配置。格式为用户名@源集群域名。
oldClusterUser
无
Basic认证用户名,源集群需要Basic认证时配置。
oldClusterPass
无
Basic认证用户密码,源集群需要Basic认证时配置。
oldCluster_socketTimeout
30
源集群socket超时时间,单位:秒。
oldCluster_connectTimeout
30
源集群连接超时时间,单位:秒。
oldCluster_connectRequestTimeout
30
源集群请求连接超时时间,单位:秒。
batchSize
1000
来自源集群的重新索引使用默认为最大大小为100MB的堆栈缓冲区。如果源集群索引包含非常大的文档,则需要使用较小的批量大小。单位:条。
indices
index1,index2
迁移索引名称,配置为指定索引,建议对索引进行逐个迁移。支持批量索引迁移,以英文逗号分隔。例如“index1,index2,index3”。
copySettingAndMapping
true
是否自动创建索引。true:自动创建索引并拷贝源集群索引的setting(拷贝主分片数和analysis,为加速索引副本分片数设为0,刷新时间设为-1)和mapping。
isTypeExist
false
源集群Elasticsearch版本是否存在type。若存在设为true;不存在设为false。
queryParameters
refresh
查询参数,多个参数通过“&”拼接。例如“queryParameters=refresh&require_alias=false”。
说明:“wait_for_completion”参数默认为false,无需在配置文件中填写。
threadNum
24
线程池大小,表示同时进行数据迁移的索引个数。
timeField
无
索引中的时间字段,只迁移从startTime到endTime这段时间内的数据,时间范围为[startTime,endTime)。若不配置此字段,则迁移索引的所有数据。
说明:时间字段起止时间的格式必须和索引中此字段的实际格式相同,否则迁移失败。
若配置多个索引,则所有索引都要有此时间字段且时间格式相同,否则迁移失败。
beginTime
无
迁移索引时间字段的开始时间。
endTime
无
迁移索引时间字段的结束时间。
keytabPath
/home/omm/conf
认证文件路径。需要以omm用户将源集群用户的“user.keytab”和“krb5.conf”上传到此路径。
说明:- 从安全模式的ES导数据到普通模式的ES时才需要配置。
- 目标集群esServerHost涉及的服务端均需要创建此目录并上传源集群用户的“user.keytab”和“krb5.conf”。
集群的域名可以通过集群界面进行查看,登录Manager,选择“系统 > 权限 > 域和互信”,查看“本端域”参数的值。
- 修改工具包conf目录下的migrateIndex.yml参数配置文件(可选)。命令如下:
cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf
vi migrateIndex.yml
配置参考表4,配置样例如下:
!!com.*.fusioninsight.es.tool.reindex.util.MigrateIndex conf: - index: index_test1 query: '{"match": { "company": "cat"}}' script: - index: index_test2 query: script:
将源集群数据导入到目标集群
- 执行以下命令配置环境变量:
source /opt/client/bigdata_env
- 执行数据迁移命令:
cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/es2es_reindex
java -cp ./../lib/*:./conf/ com.*.fusioninsight.es.tool.reindex.ReindexTool
- 通过curl命令查看索引确认数据是否导入,例如:
- 安全模式:
curl -XGET --tlsv1.2 --negotiate -k -u : "https://IP:port/indexname/_search?pretty"
curl -XGET --tlsv1.2 --negotiate -k -u : "https://IP:port/_cat/indices?v"| grep indexname
- 普通模式:
curl -XGET "http://IP:port/indexname/_search?pretty"
curl -XGET "http://IP:port/_cat/indices?v"| grep indexname
curl命令的使用请参考Linux下curl命令的使用。
- 安全模式:
- 如果“docs.count”数据量为“0”,说明索引还未迁移完。可以用以下命令查看迁移状态。
- 安全模式:
curl -XGET --tlsv1.2 --negotiate -k -u : 'https://IP:port/_tasks?detailed=true&actions=*reindex*&pretty'
- 普通模式:
curl -XGET 'http://IP:port/_tasks?detailed=true&actions=*reindex*&pretty'
响应结果为:
{ "nodes" : { …… "tasks" : { "R9QEdSqcQkSdkqGzinrvAA:55049" : { "node" : "R9QEdSqcQkSdkqGzinrvAA", "id" : 55049, "type" : "transport", "action" : "indices:data/write/reindex", "status" : { "total" : 59948183, "updated" : 0, "created" : 8950000, "deleted" : 0, "batches" : 895, "version_conflicts" : 0, "noops" : 0, "retries" : { "bulk" : 0, "search" : 0 }, …… } }
其中“R9QEdSqcQkSdkqGzinrvAA:55049”为“taskID”。
查看索引执行的taskID的方法:
查找日志文件logs/estool.log,检索内容为“索引名称”+空格+“reindex taskID:”。例如: cat estool.log | grep 'index1 reindex taskID:'。
结果为“index1 reindex taskID: R9QEdSqcQkSdkqGzinrvAA:68993”,其中,R9QEdSqcQkSdkqGzinrvAA:68993即为taskID。
- 安全模式:
- 查询具体taskID,可以执行如下命令:
响应结果:
{ "completed" : true, "task" : { "node" : "R9QEdSqcQkSdkqGzinrvAA", "id" : 55049, "type" : "transport", "action" : "indices:data/write/reindex", "status" : { "total" : 59948183, "updated" : 0, "created" : 59948183, "deleted" : 0, "batches" : 5998, "version_conflicts" : 0, "noops" : 0, "retries" : { "bulk" : 0, "search" : 0 }, "throttled_millis" : 0, "requests_per_second" : -1.0, "throttled_until_millis" : 0 }, "description" : "reindex from [host=10.6.6.1 port=9200 query={\n \"match_all\" : { }\n}][test1][order_list] to [test1]", "start_time_in_millis" : 1546078390223, "running_time_in_nanos" : 2252468434895, "cancellable" : true }, …… }
“completed”为“true”说明索引已经迁移完成。
- total:索引总doc条数。
- created:索引已创建doc条数。
- running_time_in_nanos:迁移用时,单位ns。
Elasticsearch客户端Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/logs目录,可以查看导入过程的日志信息。
- 取消任务,可以执行如下命令:
- 当新集群索引数据量和源集群索引数据量相同时,说明索引已经迁移完,需手动设置下副本数和刷新时间。
例如:重置索引副本数为1,刷新时间60s。
- 安全模式:
curl -XPUT --tlsv1.2 --negotiate -k -u 'https://IP:port/indexName/_settings' -H 'Content-Type: application/json' -d' { "number_of_replicas" : 1, "refresh_interval" : "60s" }'
- 普通模式:
curl -XPUT 'http://IP:port/indexName/_settings' -H 'Content-Type: application/json' -d' { "number_of_replicas" : 1, "refresh_interval" : "60s" }'
- 安全模式:
- 查看新集群索引状态,当所有索引状态都是green时说明同步副本数据完成。
- 安全模式:
curl -XGET --negotiate -k -u : 'https://ip:port/_cat/indices?v'
- 普通模式:curl -XGET 'http://ip:port/_cat/indices?v'
- 安全模式:
- “.task”索引可以用来查看索引迁移任务的详细内容。确认集群数据迁移无误后,删除该索引。
- 数据全部迁移完成后,在目标集群移除reindex.ssl.verification_mode配置。
- 若源集群和目标集群都是普通模式,则无需移除该参数配置,直接进入下一步操作。
- 在Manager界面选择“集群 > Elasticsearch > 配置”,参数类别选择“全部配置”。
- 选择“Elasticsearch > 自定义”,在“elasticsearch.customized.configs”的值中,删除“reindex.ssl.verification_mode”参数。
- 保存配置后,重启源集群和目标集群的Elasticsearch服务使配置生效。
- 数据全部迁移完成后,在源集群和目标集群打开禁用安全传输层TLS低版本协议开关。
- 若源集群和目标集群都是普通模式,则无需打开禁用安全传输层TLS低版本协议开关,跳过本步操作。
- 在Manager界面选择“集群 > 待操作集群的名称 > Elasticsearch > 配置”,参数类别选择“全部配置”。
- 选择“Elasticsearch > 安全”,修改“DISABLE_TLS_LOW_PROTOCOL”的值“true”。
- 保存配置后,重启Elasticsearch服务使配置生效。