配置Elasticsearch集群读写分离
场景描述
读写分离支持将写入主集群(Leader)的数据自动同步到从集群(Follower),实现主集群承担写入任务,从集群承担查询任务。读写分离可以将读写压力分开,提高查询的性能。当主集群无法提供服务时,可以通过主从切换使用从集群提供写入和查询服务,保证业务可以正常进行。
场景一(图左):主集群写入,从集群查询,分离读写压力。
场景二(图右):主集群故障时,从集群升级,正常提供服务,避免业务中断。
约束限制
- 仅Elasticsearch 7.6.2、Elasticsearch 7.10.2集群支持读写分离。
- 主集群和从集群的版本必须保持一致,否则服务可能异常。
前提条件
已创建两个版本一致的集群,一个作为主集群,另一个作为从集群。从集群必须能访问主集群的REST接口(默认端口为9200)。
连接主从集群
- 登录云搜索服务管理控制台。
- 在“集群管理”页面选择从集群,单击操作列“Kibana”,登录Kibana页面。
- 单击左侧导航栏的“Dev Tools”进入操作页面
- 执行如下命令,在从集群配置主集群的信息。
PUT /_cluster/settings { "persistent" : { "cluster" : { "remote.rest" : { "leader1" : { "seeds" : [ "http://10.0.0.1:9200", "http://10.0.0.2:9200", "http://10.0.0.3:9200" ] , "username": "elastic", "password": "*****" } } } } }
表1 请求体参数说明 参数名
说明
leader1
主集群配置任务的名称,由用户自定义,在后续读写分离配置时会用到该名称。
seeds
主集群的访问地址。当集群开启HTTPS访问时,URL schema需要对应使用https。
username
主集群的用户名,仅主集群是安全集群时才需要配置。
password
主集群的密码,仅主集群是安全集群时才需要配置。
返回示例:
{ "acknowledged" : true, // 是否成功 "persistent" : { "cluster" : { "remote" : { "rest" : { "leader1" : { "seeds" : [ "http://10.0.0.1:9200", "http://10.0.0.2:9200", "http://10.0.0.3:9200" ] , "username": "elastic", "password": "*****" } } } } }, "transient" : { } }
- 配置完成后,在从集群执行如下命令确认从集群和主集群的连接状况。
GET _remote/rest/info
返回示例:
{ "leader1" : { "connected" : true //表示连接正常 } }
索引同步
索引同步有2种方式:指定索引同步和匹配索引同步。
开启索引同步后,从集群的索引会变为只读状态,并且定时与主集群索引同步。同步周期默认30秒,如果需要修改请参见修改同步周期。
- 在从集群执行如下命令,将主集群的单个索引同步到从集群,不修改索引配置。
PUT start_remote_sync { "remote_cluster": "leader1", "remote_index": "data1_leader", "local_index": "data1_follower" }
- 在从集群执行如下命令,将主集群的单个索引同步到从集群,并修改部分索引配置,开启索引配置同步。
PUT start_remote_sync { "remote_cluster": "leader1", "remote_index": "data1_leader", "local_index": "data1_follower", "settings": { "number_of_replicas": 4 }, "settings_sync_enable": true, "settings_sync_patterns": ["*"], "settings_sync_exclude_patterns": ["index.routing.allocation.*"], "alias_sync_enable": true, "state_sync_enable": true }
以下索引配置不支持修改:“number_of_shards”、“version.created”、“uuid”、“creation_date”、“soft_deletes.enabled”。
参数名 |
说明 |
---|---|
remote_cluster |
主集群配置任务的名称,在连接主从集群时设置,例如本文设置的是“leader1”。 |
remote_index |
主集群待同步索引名称。 |
local_index |
同步到从集群的索引名称。 |
settings |
同步索引的索引设置。 |
settings_sync_enable |
开启主集群索引设置同步,默认为“false”。 |
settings_sync_patterns |
要同步的主集群索引设置前缀,默认为“*”,当“settings_sync_enable”为“true”时生效,“settings”中配置的索引设置不会同步。 |
settings_sync_exclude_patterns |
不需要同步的主集群索引设置前缀,默认为空,“settings_sync_enable”为“true”时生效。 |
alias_sync_enable |
开启主集群索引别名同步,默认为“false”。 |
state_sync_enable |
开启主集群索引状态同步,默认为“false”。 |
- 在从集群执行如下命令,创建匹配模式同步索引,将主集群中匹配的索引同步到从集群。
PUT auto_sync/pattern/${PATTERN} { "remote_cluster": "leader1", "remote_index_patterns": "log*", "local_index_pattern": "{{remote_index}}-sync", "apply_exist_index": true }
- 在从集群执行如下命令,创建匹配模式同步索引,将主集群中匹配的索引同步到从集群,并修改部分索引配置,开启索引配置同步。
PUT auto_sync/pattern/${PATTERN} { "remote_cluster": "leader1", "remote_index_patterns": "log*", "local_index_pattern": "{{remote_index}}-sync", "apply_exist_index": true, "settings": { "number_of_replicas": 4 }, "settings_sync_enable": true, "settings_sync_patterns": ["*"], "settings_sync_exclude_patterns": ["index.routing.allocation.*"], "alias_sync_enable": true, "state_sync_enable": true }
以下索引配置不支持修改:“number_of_shards”、“version.created”、“uuid”、“creation_date”、“soft_deletes.enabled”。
参数名 |
说明 |
---|---|
PATTERN |
同步集群配置的pattern名字,用于区分多个不同的匹配模式。 |
remote_cluster |
主集群配置任务的名称,通过连接主从集群设置,具体值如上文的“leader1”。 |
remote_index_patterns |
主集群待同步索引模式,支持通配符“*”。 |
local_index_pattern |
同步到从集群的索引模式,支持模板替换。例如取值为“{{remote_index}}-sync”时,待同步索引为“log1”,同步过来的索引为“log1-sync”。 |
apply_exist_index |
是否同步主集群上已存在的索引,默认为“true”。 |
settings |
同步索引的索引设置。 |
settings_sync_enable |
开启主集群索引设置同步,默认为“false”。 |
settings_sync_patterns |
要同步的主集群索引设置前缀,默认为“*”,当“settings_sync_enable”为“true”时生效,“settings”中配置的索引设置不会同步。 |
settings_sync_exclude_patterns |
不需要同步的主集群索引设置前缀,默认为空,“settings_sync_enable”为“true”时生效。 |
alias_sync_enable |
开启主集群索引别名同步,默认为“false”。 |
state_sync_enable |
开启主集群索引状态同步,默认为“false”。 |
停止索引同步
在从集群执行如下命令,终止索引名称对应的同步任务,后续主集群对该索引的修改不会被同步到从集群,并且从集群中该索引的只读状态解除,支持新数据的写入。
PUT log*/stop_remote_sync
“log*”表示索引名称,支持指定多个索引(多个索引之间用英文逗号分隔)和使用通配符,此例是停止以“log”开头的索引的同步任务。
查询并删除集群匹配模式
- 在从集群执行如下命令,查询已创建的匹配模式。
- 列表查询
GET auto_sync/pattern
- 指定名称查询
GET auto_sync/pattern/{PATTERN}
接口返回示例如下:
{ "patterns" : [ { "name" : "pattern1", "pattern" : { "remote_cluster" : "leader", "remote_index_patterns" : [ "log*" ], "local_index_pattern" : "{{remote_index}}-sync", "settings" : { } } } ] }
- 列表查询
- 在从集群执行如下命令,指定模式名称删除模式。
DELETE auto_sync/pattern/{PATTERN}
开启强制同步
- 开启强制同步
插件默认根据主集群索引的文档数是否发生变化来决定是否要同步元数据,当主集群只对文档进行更新且文档数不变时,插件不会同步该更新到从集群。支持修改配置,开启后,每个同步周期从集群都会强制同步主集群的索引元数据。
请求示例如下(开启强制同步):
PUT _cluster/settings { "persistent": { "remote_sync.force_synchronize": true } }
修改同步周期
- 修改同步周期
同步周期默认30秒,支持修改。
请求示例如下(修改同步周期为2秒):
PUT {index_name}/_settings { "index.remote_sync.sync_interval": "2s" }
查询同步状态
- 获取自动同步状态
该接口可以获取匹配索引同步的状态。
请求示例如下:
GET auto_sync/stats
接口返回示例如下:
{ "success_count" : 3, "failed_count" : 0, "failed_remote_cluster_state_requests_count" : 0, "last_fail_exception" : { }, "last_fail_remote_cluster_requests_exception" : { } }
- 获取指定索引的自动同步状态
请求示例如下:
GET {index_name}/sync_stats
接口返回示例如下:
{ "indices" : { "data1_follower" : { "shards" : { "0" : [ { "primary" : false, "total_synced_times" : 27, "total_empty_times" : 25, "total_synced_files" : 4, "total_synced_bytes" : 3580, "total_paused_nanos" : 0, "total_paused_times" : 0, "current" : { "files_count" : 0, "finished_files_count" : 0, "bytes" : 0, "finished_bytes" : 0 } }, { "primary" : true, "total_synced_times" : 28, "total_empty_times" : 26, "total_synced_files" : 20, "total_synced_bytes" : 17547, "total_paused_nanos" : 0, "total_paused_times" : 0, "current" : { "files_count" : 0, "finished_files_count" : 0, "bytes" : 0, "finished_bytes" : 0 } } ] } } } }
主从切换
当主集群出现故障时,支持通过主从切换保证业务正常进行。
- 判断主从集群的索引同步方式。查询从集群是否有索引同步的匹配模式,命令参考查询并删除集群匹配模式。
- 删除从集群的索引同步的匹配模式,命令参考查询并删除集群匹配模式。
- 从集群停止索引同步,将读写流量切换到从集群。如果主从集群是匹配索引同步关系,停止索引同步命令使用通配符匹配索引。
- 当主集群恢复后,在主集群配置从集群信息,再次连接主从集群,命令参考连接主从集群。
- 在主集群,通过索引同步将从集群数据向主集群同步,完成主从切换。