配置Elasticsearch集群读写分离
随着业务规模扩大,数据量和访问量呈指数级增长,单一集群同时处理数据写入和查询请求的“读写一体”架构逐渐暴露出资源争抢、集群负载过载等问题。为了解决这些问题,CSS服务提供了Elasticsearch读写分离功能。
Elasticsearch读写分离架构通过主集群和从集群的协作实现。具备如下特点与优势:
- 解耦读写压力:主集群专注写入,提升写入效率;从集群专注查询。支持高并发查询扩展。消除资源争抢,降低峰值负载。
- 弹性扩展能力:独立横向扩展,读/写集群可单独扩容。支持跨地域部署能力。
- 数据一致性保障:低时延的实时同步机制。支持仅同步增量数据。
场景描述
Elasticsearch读写分离的核心业务流程:
- 业务数据写入。用户请求写入数据,主集群处理写入操作。
- 数据同步。
- 查询处理。用户输入查询请求,从集群处理查询,返回结果。
如图1所示,介绍了读写分离特性的应用场景。
- 日常读写分离(图左):主集群承担写入任务,从集群承担查询任务,分离读写压力。
- 故障主从切换(图右):主集群故障时,从集群升级为新的主集群,提供写入和查询服务,避免业务中断。操作流程请参见主从切换。
约束限制
- 仅Elasticsearch 7.6.2、Elasticsearch 7.10.2集群支持读写分离。
- 主集群和从集群的版本必须保持一致,否则服务可能异常。
前提条件
已创建两个版本一致的集群,一个作为主集群,另一个作为从集群。从集群必须能访问主集群的REST接口(默认端口为9200)。
登录Kibana
登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录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”。 当业务场景涉及主从集群切换时,本参数值请配置为“{{remote_index}}”,以确保主从集群使用相同的索引名称。 |
|
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"
}
修改同步速率
通过集群级别的配置可以调节主从集群之间的同步速率。
请求示例如下(修改块大小为2MB,块数量为20,最大同步流量为100MB):
PUT _cluster/settings
{
"persistent": {
"remote_sync.chunk_size": "2MB",
"remote_sync.max_concurrent_file_chunks": 20,
"remote_sync.max_bytes_per_sec": "100MB"
}
}
|
参数名 |
说明 |
|---|---|
|
remote_sync.chunk_size |
每次同步索引的块大小。 默认值:1MB 格式:字符串 |
|
remote_sync.max_concurrent_file_chunks |
并发同步索引的块数量。 默认值:10 格式:数值 |
|
remote_sync.max_bytes_per_sec |
每秒最大的同步流量。 默认值:40MB 格式:字符串 |
查询同步状态
获取指定索引的自动同步状态。
请求示例如下:
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 // 当前正在同步的已完成文件个数
}
}
]
}
}
}
}
主从切换
当主集群出现故障时,支持通过主从切换保证业务正常进行。
如果主集群和从集群的索引名称未完全一致,则不支持主从切换。
- 判断主从集群的索引同步方式。查询从集群是否有索引同步的匹配模式,命令参考查询并删除集群匹配模式。
- 删除从集群的索引同步的匹配模式,命令参考查询并删除集群匹配模式。
- 从集群停止索引同步,将读写流量切换到从集群。如果主从集群是匹配索引同步关系,停止索引同步命令使用通配符匹配索引。
- 当主集群恢复后,在主集群配置从集群信息,再次连接主从集群,命令参考连接主从集群。
- 在主集群,通过索引同步将从集群数据向主集群同步,完成主从切换。
