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

使用Solr2ES工具迁移Solr数据

操作场景

该操作指导工程师在Solr和Elasticsearch正常运行时,通过查询Solr索引,将索引数据写入到Elasticsearch集群中。

前提条件

  • Solr和Elasticsearch集群正常运行。
  • 为保证迁移结束后数据一致性,需要上层业务停止对Solr源集群的写操作,读服务可以正常进行,如不停止写操作可能会导致数据最终不一致。迁移完毕后,上游业务再切换到Elasticsearch目标集群进行读写。
  • 已安装Solr和Elasticsearch客户端,Solr和Elasticsearch版本需保持一致,且客户端节点与Solr、Elasticsearch集群互通。例如安装目录为“/opt/client”。
  • 分别在源集群和目标集群创建一个人机用户例如test,并加入“solr”、“elasticsearch”、“supergroup”用户组,“主组”设置为“supergroup”,并绑定“Manager_administrator”角色。

操作步骤

修改配置文件

  1. 确认Solr和Elasticsearch服务是否都处于普通模式。

    1. 确认Solr是否处于普通模式。

      使用test用户登录Manager(首次登录需修改密码),选择“集群 > 服务 > Solr”单击Solr WebUI后的超链接进入Solr Admin UI界面,在Dashboard中查看是否包含solr.hdfs.security.kerberos.enabled=true,若包含则是安全模式;否则是普通模式。

    2. 确认Elasticsearch是否处于普通模式。

      在Manager界面选择“集群 > 服务 > Elasticsearch > 配置”,搜索“ELASTICSEARCH_SECURITY_ENABLE”参数,确认该参数是否可以查询到且参数值为“true”(true表示开启了安全模式)。

    • 是,若Solr和Elasticsearch均处于普通模式,则执行4
    • 否,执行2

  2. 在目标集群选择“系统 > 权限 > 用户”,选择新创建用户test后的“更多 > 下载认证凭据”,选择集群信息后单击“确定”,下载文件。
  3. 将解压压缩包后得到的“user.keytab”“krb5.conf”文件上传到Elasticsearch客户端的“Elasticsearch/tools/elasticsearch-data2es/solr2es/conf”目录下。
  4. root用户登录Elasticsearch客户端所在节点。
  5. 通过以下命令进入Solr2ES工具的配置文件目录。

    cd /opt/client/Elasticsearch/tools/elasticsearch-data2es/solr2es/conf

  6. 在修改相应配置文件之前,请先阅读如下配置文件一览表。

    配置文件

    文件说明

    user.keytab

    krb5.conf

    迁移任务所使用的用户的认证文件,可参考23下载得到。当Solr或Elasticsearch处于安全模式时,才需要下载。

    solr2es.jaas.conf

    鉴权所需的JAAS配置。若Solr为安全模式,则需要配置Client模块的认证信息;若Elasticsearch处于安全模式,则需要配置EsClient模块的认证信息。

    solr2es.properties

    配置迁移任务的通用参数,对本次迁移任务的索引都生效。

    migrateIndex.properties

    配置索引迁移信息文件。

    solrCursorMark.properties

    索引迁移任务在执行中,如遇异常情况,会自动更新当前迁移索引的Solr Cursor Mark到配置文件solrCursorMark.properties中,并作为下一次Solr Query的查询条件。

    该文件无需用户配置,迁移工具会自动生成其内容。

  7. 配置solr2es.jaas.conf配置文件。

    • 若Solr和Elasticsearch均为普通模式,则跳过此步骤,执行9
    • 若Solr处于安全模式,则需要配置Client模块的认证信息;否则不需要配置Client模块。
    • 若Elasticsearch处于安全模式,则需要配置EsClient模块的认证信息;否则不需要配置EsClient模块。

  8. 配置Client或EsClient模块。

    执行以下命令修改jaas.conf文件中的“keyTab”参数和“principal”参数。其他参数如无特殊要求维持默认即可。

    如下所示,keyTab参数为放置user.keytab文件的路径。test是用户名,principal格式为test@<系统域名>

    vi solr2es.jaas.conf
    Client {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/opt/client/Elasticsearch/tools/elasticsearch-data2es/solr2es/conf/user.keytab"
    principal="test@<系统域名>"
    useTicketCache=false
    storeKey=true
    debug=true;
    };
    EsClient {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/opt/client/Elasticsearch/tools/elasticsearch-data2es/solr2es/conf/user.keytab"
    principal="test@<系统域名>"
    useTicketCache=false
    storeKey=true
    debug=true;
    };

    用户可登录Manager,选择“系统 > 权限 > 域和互信”,查看“本端域”参数,即为当前系统域名。

  9. 执行以下命令修改solr2es.properties参数配置文件:

    vi solr2es.properties

    参考表 solr2es.properties参数配置说明进行配置,配置样例如下:

    ### Solr to ES Configurations ###
    # Await timeout in seconds after migrate service is shutdown.
    awaitTimeout=10
    
    ### ES Client configurations ###
    esServerHost=ip1:port,ip2:port,ip3:port
    principal=test
    isSecureMode=true
    connectTimeout=5000
    socketTimeout=300000
    connectionRequestTimeout=100000
    maxConnPerRoute=100
    maxConnTotal=1000
    
    ### Solr Client Configuration ###
    # Solr is on safe mode: true; otherwise false.
    solrKerberosEnabled=true
    # Please change it with Solr ZK host.
    solrZookeeperHost=ip1:port,ip2:port,ip3:port/solr
    
    ### Zookeeper Client Configuration ###
    # Zookeeper server principal.
    zookeeperServerPrincipal=zookeeper/HADOOP.HADOOP.COM
    # solr client socket timeout.
    socketTimeoutMillis=180000
    # Zookeeper connect timeout.
    zookeeperConnectTimeout=30000
    # Zookeeper client is safe mode
    zookeeperIsSecureMode=true
    表1 solr2es.properties参数配置说明

    参数

    默认值

    说明

    awaitTimeout

    10

    索引迁移任务完成后,到完全关闭调度线程池的等待时间,单位为秒。

    esServerHost

    ip1:port1,ip2:port2,ip3:port3

    数据导入到Elasticsearch中的实例配置。便于负载均衡,该参数配置了多组IP及端口号,格式为“IP:端口”,多组配置之间以英文逗号分隔。

    IP和端口查看方法如下:登录FusionInsight Manager,选择“集群 > 服务 > Elasticsearch > 配置 > 全部配置 > EsNode1 > 实例列表”,查看参数“INSTANCE_SERVER_PORT_LIST”的值获取。

    principal

    test

    Elasticsearch鉴权用户名,当Elasticsearch处于安全模式时才需要配置,且需要与EsClient中的principal保持一致。

    isSecureMode

    true

    Elasticsearch集群是否是安全模式。true表示安全模式,false表示普通模式。

    connectTimeout

    5000

    建立HTTP连接的超时时间,单位为毫秒。

    socketTimeout

    300000

    等待HTTP连接响应的超时时间,单位为毫秒。

    connectionRequestTimeout

    100000

    从连接池中获取可用连接最大超时时间,单位为毫秒。

    maxConnPerRoute

    100

    连接同一个route最大的并发数。

    maxConnTotal

    1000

    连接池中的最大连接数。

    solrKerberosEnabled

    true

    Solr是否处于安全模式下,true代表安全模式,false代表普通模式。

    solrZookeeperHost

    ip1:port1,ip2:port2,ip3:port3/solr

    IP地址:Solr服务所使用的ZooKeeper地址,可以在Solr Admin UI界面的Dashboard中查看参数“-DzkHost”的值获取。

    zookeeperServerPrincipal

    zookeeper/HADOOP.<系统域名>

    配置ZooKeeper服务端principal。

    可以在Solr Admin UI界面的Dashboard中查看参数

    “-Dzookeeper.server.principal”的值获取,例如:zookeeper/hadoop.hadoop.com

    socketTimeoutMillis

    180000

    Solr客户端中HTTP对象等待连接响应的超时时间,单位为毫秒。

    zookeeperConnectTimeout

    30000

    创建ZooKeeper连接的超时时间,单位为毫秒。

    zookeeperIsSecureMode

    true

    Zookeeper是否处于安全模式下,true代表安全模式,false代表普通模式。

  10. 配置需要迁移的索引信息。

    具体参数可参考表2,配置样例如下:

    vi migrateIndex.properties

    ### Solr Index1 Configuration ###
    # Solr index name, can be different with esIndexName.
    solrIndex=Collection_1
    # Query shard name in the solr collection. All: indicates that all shards are queried. shard1,shard2: queries data of shard1 and shard2.
    solrShards=ALL
    # Number of concurrent shard threads for querying Solr collection. Default thread number is 3
    queryThreadNumber=3
    # Solr query string.
    solrQueryString=*:*
    # Solr query field.
    solrQueryFields=*
    # Solr result size in one query return.
    solrRowsPerQuery=4000
    # Solr cursor mark: sort clauses must include the uniqueKey field (either asc or desc). If any other sort is needed, please separate by comma and then add it behind uniqueKey sort, "solrSort=id asc,title desc" for example.
    solrSort=id asc
    # Solr primary key. After the configuration, it is used as the _id of the ES.
    solrUniqueKey=
    
    ### ES Index Configurations ###
    # ES index name, can be different with Solr index name.
    esIndex=collection_1
    # If ES index contains different types, please assgin a correct one, for example, _doc.
    esType=
    # ES batch docs size in one bulk. Proper bulk size will improve index performance.
    esBulkSize=1000
    # Concurrent thread number to migrate each index from Solr to ES. Default thread number is 8.
    migrateThreadNumber=8
    # If the index to be migrated does not exist in the ES, run this statement to create it. The field type in the ES must match the field type in the Solr collection.
    esIndexMappings={"mappings":{"properties":{"id":{"type":"keyword"},"name":{"type":"text"},"features":{"type":"text"},"title":{"type":"text"},"description":{"type":"text"},"comments":{"type":"text"},"keywords":{"type":"text"},"price":{"type":"double"},"price_c":{"type":"keyword"},"weight":{"type":"double"},"popularity":{"type":"long"},"subject":{"type":"text"},"author":{"type":"keyword"},"author_s":{"type":"text"},"category":{"type":"text"},"age":{"type":"text"},"last_modified":{"type":"date"}}},"settings":{"number_of_shards":"3","number_of_replicas":"1"}}
    表2 migrateIndex.properties参数配置说明

    参数

    默认值

    说明

    solrIndex

    Collection_1

    Solr中索引的名称,请传入实际所需迁移的Solr索引。

    solrShards

    ALL

    Solr分片名称,默认为“ALL”,表示迁移Solr所有分片;也可以配置为待迁移的分片名,分片名之间用逗号隔开,例如“shard1,shard2”。

    queryThreadNumber

    3

    Solr查询分片并发线程数,默认为“3”;表示同时查询3个Solr分片数据。

    solrQueryString

    *.*

    Solr查询语句。若无特殊查询条件,则保留默认值*.*即可。

    solrQueryFields

    *

    Solr查询字段。若需要迁移所有字段,则保留默认值*即可。

    solrRowsPerQuery

    4000

    Solr查询每次返回的文档条数,默认为4000条。

    solrSort

    id asc

    由于工具使用了Solr cursor mark进行查询,需要根据uniqueKey进行升序或者降序排列。可根据需要引入其他字段进行排序,例如"id asc,title desc"。

    solrUniqueKey

    -

    Solr索引uniqueKey,默认为空,填写后将用该值作为ES的_id字段。

    esIndex

    collection_1

    Elasticsearch目的索引的名称,若索引不存在,将会自动创建。

    esType

    -

    Elasticsearch索引中使用的type,默认为空,可根据需要进行修改。

    esBulkSize

    1000

    Elasticsearch Bulk的大小,若源文档较小,可以适当调大该参数以增加Elasticsearch写入性能;Bulk单批次大小控制在5-10MB。

    migrateThreadNumber

    8

    Elasticsearch写入数据的并发线程数。默认线程数为“8”

    esIndexMapping

    (请参见参考样例)

    如果待迁移的索引在Elasticsearch中不存在,程序将用该语句自动创建索引。Elasticsearch索引中的字段类型必须与Solr索引中的字段类型匹配。

    • 单个任务只能迁移单个索引,索引中各个分片并发迁移。如果有多个索引需要迁移,可以配置多个任务并发迁移,具体并发数请根据机器性能和集群空闲状态酌情增减。
    • 各索引的迁移请参考上述说明依次配置,可以适当调试solrRowsPerQuery,queryThreadNumber,migrateThreadNumber和esBulkSize等参数,并在测试环境验证迁移性能。

迁移Solr数据到Elasticsearch中

  1. 执行索引迁移任务。

    cd /opt/client

    source bigdata_env

    kinit test

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

    java -cp ./conf/:../lib/* com.*.fusioninsight.elasticsearch.solr2es.Solr2ES

  2. 通过curl命令查看索引,确认数据是否导入,例如:

    • 安全模式:

      curl -XGET --tlsv1.2 --negotiate -k -u :"https://ip:port/esIndex/_search?pretty"

    • 普通模式:

      curl -XGET "http://ip:port/esIndex/_search?pretty"

    • ip:Elasticsearch集群中任意EsNode节点的IP。
    • port:登录FusionInsight Manager,选择“集群 > 服务 > Elasticsearch > 配置 > 全部配置”,搜索参数“SERVER_PORT”获取EsNodeX实例的端口。

  3. 通过curl命令查看索引,确认数据量是否正确,例如:

    • 安全模式:

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

    • 普通模式:

      curl -XGET https://ip:port/_cat/indices?v

    curl命令的使用请参考Linux下curl命令的使用