设置复制

使用 Manticore,写事务(例如 INSERTREPLACEDELETETRUNCATEUPDATECOMMIT)可以在当前节点完全应用事务之前复制到其他集群节点。目前,复制支持 Linux 和 macOS 下的 percolatertdistributed 表。

Manticore 的 原生 Windows 二进制文件 不支持复制。我们推荐通过 WSL(Windows 子系统 Linux)安装 Manticore。

macOS 上,复制支持有限,仅建议用于开发目的。

Manticore 的复制由 Galera 库 提供支持,具有以下卓越功能:

  • 真正的多主:随时可读取及写入任何节点。
  • 几乎同步复制,无从属延迟及节点崩溃后无数据丢失。
  • 热备份:切换时无停机(因为不存在故障转移)。
  • 紧密耦合:所有节点保持相同状态,不允许节点间数据分歧。
  • 自动节点配置:无需手动备份数据库并恢复到新节点。
  • 易于使用和部署。
  • 不可靠节点的检测及自动剔除。
  • 基于认证的复制。

要在 Manticore Search 中设置复制:

  • 配置文件中 "searchd" 部分必须设置 data_dir 选项。纯模式不支持复制。
  • 必须指定一个包含其他节点可访问 IP 地址的 listen 指令,或一个有可访问 IP 的 node_address
  • 可以选择在每个集群节点上为 server_id 设置唯一值。如果未设置该值,节点将尝试使用 MAC 地址或随机数生成 server_id

如果没有设置 replication 类型的 listen 指令,Manticore 将在默认协议监听端口之后的 200 端口范围内为每个创建的集群使用前两个空闲端口。若要手动设置复制端口,必须定义 listen 指令(类型为 replication)的端口范围,且同一服务器不同节点的地址/端口范围不能交叉。通常,端口范围应为每个集群指定至少两个端口。当定义带端口范围的复制监听器(例如 listen = 192.168.0.1:9320-9328:replication)时,Manticore 不会立即在这些端口监听。它仅在开始使用复制时,从指定范围内随机选取空闲端口。

复制集群

复制集群是一组节点,其中写事务被复制。复制是按表设置的,即一张表只能属于一个集群。集群中表的数量没有限制。属于集群的任何 percolate 或实时表上的所有事务如 INSERTREPLACEDELETETRUNCATE 都会复制到该集群的所有其他节点。分布式 表也可以参与复制过程。复制是多主的,因此对任何节点或多个节点同时写入均可正常工作。

创建集群通常使用命令 create cluster,命令格式是 CREATE CLUSTER <cluster name>,加入集群可以使用 join cluster,命令格式是 JOIN CLUSTER <cluster name> at 'host:port'。但在某些罕见情况下,可能需要微调 CREATE/JOIN CLUSTER 的行为。可用选项包括:

name

该选项指定集群的名称。应在所有集群中唯一。

注意: JOIN 命令允许的最大主机名长度为 253 字符,超出此限制将导致 searchd 报错。

path

该选项指定用于写集缓存复制和从其他节点接收表的数据目录。此路径应在所有集群中唯一,且以相对于 data_dir 目录的相对路径给出。默认值为 data_dir 的值。

nodes

nodes 选项是集群所有节点的地址和端口对列表,以逗号分隔。该列表应通过节点的 API 接口获取,可以包含当前节点地址。用于加入集群以及重启后重新加入。

options

options 选项允许直接传递额外参数给 Galera 复制插件,详情请参见 Galera 文档参数

写语句

在使用复制集群时,所有修改集群表内容的写语句,如 INSERTREPLACEDELETETRUNCATEUPDATE,必须使用 cluster_name:table_name 表达式替代表名。这样可以确保变更传播到集群中的所有副本。如果不使用正确表达式,将触发错误。

在JSON接口中,所有写入集群表的语句都必须设置cluster属性以及table名称。如果没有设置cluster属性,将会导致错误。

集群中表的Auto ID 只要server_id正确配置,就是有效的。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
INSERT INTO posts:weekly_index VALUES ( 'iphone case' )
TRUNCATE RTINDEX click_query:weekly_index
UPDATE INTO posts:rt_tags SET tags=(101, 302, 304) WHERE MATCH ('use') AND id IN (1,101,201)
DELETE FROM clicks:rt WHERE MATCH ('dumy') AND gid>206

读取语句

读取语句如SELECTCALL PQDESCRIBE可以使用不带集群名称的常规表名,或者使用cluster_name:table_name格式。如果使用后者,cluster_name部分会被忽略。

如果使用HTTP端点json/search,可以指定cluster属性,也可以省略。

‹›
  • SQL
  • JSON
📋
SELECT * FROM weekly_index
CALL PQ('posts:weekly_index', 'document is here')

集群参数

可以使用SET语句调整复制插件选项。

可以在Galera 文档参数 中找到可用选项的列表。

‹›
  • SQL
  • JSON
📋
SET CLUSTER click_query GLOBAL 'pc.bootstrap' = 1

分离节点的集群

复制节点可能会彼此分离,导致所有节点都被标记为non-primary状态。这可能是由于节点之间的网络分裂、集群崩溃或复制插件在确定primary component时发生异常。在这种情况下,需要选择一个节点并将其提升为primary component角色。

要确定需要提升的节点,应该比较所有节点上的last_committed集群状态变量值。如果所有服务器当前都在运行,无需重启集群。相反,可以使用SET语句将具有最高last_committed值的节点提升为primary component(如示例所示)。

其他节点将重新连接到主节点并根据该节点重新同步其数据。

‹›
  • SQL
  • JSON
📋
SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1

复制和集群

要使用复制,需要在配置文件中为SphinxAPI协议定义一个listen端口,并为复制地址和端口范围定义一个listen。还需要指定数据目录以接收传入的表。

‹›
  • ini
ini
📋
searchd {
  listen   = 9312
  listen   = 192.168.1.101:9360-9370:replication
  data_dir = /var/lib/manticore/
  ...
 }

要复制表,必须在具有要复制的本地表的服务器上创建一个集群。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
CREATE CLUSTER posts

将这些本地表添加到集群中

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
ALTER CLUSTER posts ADD pq_title
ALTER CLUSTER posts ADD pq_clicks

所有希望接收集群表副本的其他节点应按照以下方式加入集群:

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
JOIN CLUSTER posts AT '192.168.1.101:9312'

运行查询时,将表名前缀为集群名称posts:或在HTTP请求对象中使用cluster属性。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • Javascript
  • Java
  • C#
  • Rust
📋
INSERT INTO posts:pq_title VALUES ( 3, 'test me' )

集群中所有修改表的查询现在都会复制到集群中的所有节点。

Last modified: August 28, 2025