配置OpenSearch集群读写分离
读写分离通过将写入任务分配给主集群(Leader),查询任务分配给从集群(Follower),实现读写压力分离。该特性支持主集群故障时,从集群自动升级为写入集群,保障业务连续性。适用于需要高可用性和高性能查询的场景。
原理介绍
读写分离通过以下机制实现:
- 数据同步机制:主集群通过REST接口将数据变更同步到从集群,支持以下两种同步方式。
- 指定索引同步:单个索引的精确同步。
- 匹配索引同步:基于通配符的批量索引同步。
- 主从切换机制:当主集群不可用时,从集群可通过配置升级为写入集群,自动接管写入和查询任务。

- 日常读写分离(图左):主集群承担写入任务,从集群承担查询任务,分离读写压力。
- 故障自动切换(图右):主集群故障时,从集群升级为新的主集群,提供写入和查询服务,避免业务中断。
约束限制
- OpenSearch集群仅2.19.0版本支持读写分离功能。
- 主集群和从集群的版本必须保持一致,否则可能导致服务异常。
前提条件
已创建两个版本一致的集群,一个作为主集群,另一个作为从集群。从集群必须能访问主集群的REST接口(默认端口为9200)。
登录OpenSearch Dashboards
登录OpenSearch Dashboards进入命令执行页面。OpenSearch集群支持多种客户端访问,本文仅以CSS服务集成的OpenSearch Dashboards为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > OpenSearch”。
- 在集群列表,选择目标集群,单击操作列的“Dashboards”,登录OpenSearch Dashboards。
- 在OpenSearch Dashboards左侧导航栏选择“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秒,如果需要修改请参见修改同步周期。

以下索引配置不支持修改:“number_of_shards”、“version.created”、“uuid”、“creation_date”、“soft_deletes.enabled”。
停止索引同步
在从集群执行如下命令,终止索引名称对应的同步任务,后续主集群对该索引的修改不会被同步到从集群,并且从集群中该索引的只读状态解除,支持新数据的写入。
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 } } ] } } } }
主从切换
当主集群出现故障时,支持通过主从切换保证业务正常进行。
- 判断主从集群的索引同步方式。查询从集群是否有索引同步的匹配模式,命令参考查询并删除集群匹配模式。
- 删除从集群的索引同步的匹配模式,命令参考查询并删除集群匹配模式。
- 从集群停止索引同步,将读写流量切换到从集群。如果主从集群是匹配索引同步关系,停止索引同步命令使用通配符匹配索引。
- 当主集群恢复后,在主集群配置从集群信息,再次连接主从集群,命令参考连接主从集群。
- 在主集群,通过索引同步将从集群数据向主集群同步,完成主从切换。