更新时间:2024-11-29 GMT+08:00

使用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”。

操作步骤

修改集群配置

  1. 在目标集群增加remote白名单。

    1. 在Manager界面选择“集群 > 待操作集群的名称 > Elasticsearch > 配置”,参数类别选择“全部配置”。
    2. 选择“Elasticsearch > 自定义”,修改“elasticsearch.customized.configs”的值,增加“reindex.remote.whitelist”参数,将源集群的主机列入白名单。

      格式为:源集群各主机的“host:port”组合列表,以逗号分隔。

      例如10.131.112.121:*,10.131.112.122:*,10.131.112.*:*,localhost:*。

  2. 在源集群和目标集群关闭禁用安全传输层TLS低版本协议开关,请完成迁移后还原配置。

    1. 若源集群和目标集群都是普通模式,则请跳过该操作,执行3
    2. 在Manager界面选择“集群 > 待操作集群的名称 > Elasticsearch > 配置”,参数类别选择“全部配置”。
    3. 选择“Elasticsearch > 安全”,修改“DISABLE_TLS_LOW_PROTOCOL”的值“false”。

  3. 在目标集群对认证模式参数reindex.ssl.verification_mode进行配置。

    1. 若源集群和目标集群都是普通模式,则无需配置该参数,直接进入下一步操作。
    2. 否则,选择“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”。

  4. 保存配置后,重启Elasticsearch服务使配置生效。

修改配置文件

  1. 查看源集群和目标集群其中之一是否为安全模式。在Manager界面选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置”,搜索“ELASTICSEARCH_SECURITY_ENABLE”参数,确认该参数是否可以查询到且参数值为“true”(true表示开启了安全模式)。

    • 是,执行6
    • 否,执行7

  2. 根据表2 认证文件存放路径上传用户认证配置文件。若源集群为安全模式,目标集群为普通模式,上传源集群的用户认证配置文件;若源集群为普通模式,目标集群为安全集群,则上传目标集群的用户认证配置文件。

    1. 参考基于用户和角色的鉴权章节,创建角色,例如ES_Role。
    2. 创建用户,初始化密码,修改密码后方可使用。
      1. 在Manager界面选择系统 > 权限 > 用户 > 添加用户
      2. 填写用户名,例如esuser(若源集群和目标集群都为安全模式,需确保源集群和目标集群用户名的名称一致)。将esuser加入用户组“elasticsearch”和“supergroup”,选择“主组”为“supergroup”,并绑定角色“ES_Role”取得权限。
      3. 选择“系统 > 权限 > 用户”,选择新创建用户后的“更多 > 初始化密码”,初始化密码后用户首次使用账号需要修改密码。
    3. 选择“系统 > 权限 > 用户”,选择新创建用户后的“更多 > 下载认证凭据”,选择集群信息后单击“确定”,下载压缩包文件。
    4. 将解压压缩包后得到的“user.keytab”“krb5.conf”文件上传到Reindex迁移工具的指定目录下,参见表2
      表2 认证文件存放路径

      源集群模式

      目标集群模式

      用户认证文件上传目录

      普通模式

      普通模式

      安全模式

      普通模式

      1. 在Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录下创建remote目录。

        例如:

        mkdir /opt/client/Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf/remote

      2. 将源集群的“user.keytab”和“krb5.conf”上传到remote目录。
      3. 创建表3的keytabPath并上传源集群的“user.keytab”和“krb5.conf”。

      普通模式

      安全模式

      将目标集群的“user.keytab”和“krb5.conf”上传到Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录。

      安全模式

      安全模式

      1. 目标集群和源集群配置跨集群互信。
      2. 将目标集群的“user.keytab”和“krb5.conf”上传到Elasticsearch客户端的Elasticsearch/tools/elasticsearch-data2es/es2es_reindex/conf目录。
      • 第三方的Elasticsearch集群均为普通模式。
      • 目标集群是安全模式,如果其他用户需要读写迁移的索引数据,需要赋予相应的权限。详细权限信息请参考基于用户和角色的鉴权章节。

  3. 修改工具包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”上传到此路径。

    说明:
    1. 从安全模式的ES导数据到普通模式的ES时才需要配置。
    2. 目标集群esServerHost涉及的服务端均需要创建此目录并上传源集群用户的“user.keytab”和“krb5.conf”。

    集群的域名可以通过集群界面进行查看,登录Manager,选择“系统 > 权限 > 域和互信”,查看“本端域”参数的值。

  4. 修改工具包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:
    表4 migrateIndex.yml参数配置说明

    参数

    默认值

    说明

    index

    index1

    迁移索引名称,需要配置Query语句或script语句的指定索引

    query

    Query语句,用于只迁移符合某个查询条件的文档

    script

    script语句,用于更新字段或元数据

将源集群数据导入到目标集群

  1. 执行以下命令配置环境变量:

    source /opt/client/bigdata_env

  2. 执行数据迁移命令:

    cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/es2es_reindex

    java -cp ./../lib/*:./conf/ com.*.fusioninsight.es.tool.reindex.ReindexTool

  3. 通过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命令的使用

  4. 如果“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。

  5. 查询具体taskID,可以执行如下命令:

    • 安全模式:

      curl -XGET --tlsv1.2 --negotiate -k -u : 'https://IP:port/_tasks/tastID?pretty'

    • 普通模式:

      curl -XGET 'http://IP:port/_tasks/tastID?pretty'

    响应结果:

    {
    "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目录,可以查看导入过程的日志信息。

  6. 取消任务,可以执行如下命令:

    • 安全模式:

      curl -XPOST --tlsv1.2 --negotiate -k -u : 'https://IP:port/_tasks/tastID/_cancel?pretty'

    • 普通模式:

      curl -XPOST 'http://IP:port/_tasks/tastID/_cancel?pretty'

  7. 当新集群索引数据量和源集群索引数据量相同时,说明索引已经迁移完,需手动设置下副本数和刷新时间。

    例如:重置索引副本数为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"
      }'

  8. 查看新集群索引状态,当所有索引状态都是green时说明同步副本数据完成。

    • 安全模式

      curl -XGET --negotiate -k -u : 'https://ip:port/_cat/indices?v'

    • 普通模式:curl -XGET 'http://ip:port/_cat/indices?v'

  9. “.task”索引可以用来查看索引迁移任务的详细内容。确认集群数据迁移无误后,删除该索引。

    • 安全模式

      curl -XDELETE --negotiate -k -u : 'https://ip:port/.tasks?pretty'

    • 普通模式:

      curl -XDELETE 'http://ip:port/.tasks?pretty'

      请不要误操作,避免删除其他索引。

  10. 数据全部迁移完成后,在目标集群移除reindex.ssl.verification_mode配置。

    1. 若源集群和目标集群都是普通模式,则无需移除该参数配置,直接进入下一步操作。
    2. 在Manager界面选择“集群 > Elasticsearch > 配置”,参数类别选择“全部配置”。
    3. 选择“Elasticsearch > 自定义”,在“elasticsearch.customized.configs”的值中,删除“reindex.ssl.verification_mode”参数。
    4. 保存配置后,重启源集群和目标集群的Elasticsearch服务使配置生效。

  11. 数据全部迁移完成后,在源集群和目标集群打开禁用安全传输层TLS低版本协议开关。

    1. 若源集群和目标集群都是普通模式,则无需打开禁用安全传输层TLS低版本协议开关,跳过本步操作。
    2. 在Manager界面选择“集群 > 待操作集群的名称 > Elasticsearch > 配置”,参数类别选择“全部配置”。
    3. 选择“Elasticsearch > 安全”,修改“DISABLE_TLS_LOW_PROTOCOL”的值“true”。
    4. 保存配置后,重启Elasticsearch服务使配置生效。