# Introduction to replication for percolate indexes

从 2.8.2 版本开始，一个新的主要功能可用 - percolate 索引的复制功能。

复制功能基于 Galera 库（同样被 Percona 的 MySQL 分支和 MariaDB 使用）。我们考虑使用一个经过验证且成熟的现有解决方案会比从零开始发明轮子更优，这将花费更长时间。


为什么只针对 percolate 索引？percolate 索引是一种修改后的实时索引，更容易操作，因此是初始测试的更好候选对象。但请继续关注，下一步将是为实时索引添加复制支持！

如果我不想使用复制功能，这对我有什么影响？复制功能是官方包内置的，但如果你不打算使用它，没有什么会阻止你升级到最新的 Manticore 版本。如果你自己编译 Manticore，编译要求已发生变化。请查阅文档了解变更内容。
**复制集群是基于索引的**。一旦定义了集群，你可以将 percolate 索引添加到其中。
**复制是多主节点且同步的**。这意味着你可以向任何节点写入，更改会立即传播到集群中的所有节点。

[![img](./introduction-to-replication-for-percolate-indexes/manticore-replication.png)](manticore-replication.png)

### 复制设置


要求：

 - - API [监听](https://docs.manticoresearch.com/latest/html/conf_options_reference/searchd_program_configuration_options.html#listen) 端口必须在专用接口上打开（不是 0.0.0.0）。
    
     - 用于复制的专用接口上打开一组端口。建议每个集群至少使用 2 个端口。
    
     - 打开 SphinxQL 端口以执行配置节点的命令。
    
     - 必须在 searchd 配置中设置 [data_dir](https://docs.manticoresearch.com/latest/html/conf_options_reference/searchd_program_configuration_options.html#data-dir)。这是临时复制数据所需的。



可选：

 - [server_id](https://docs.manticoresearch.com/latest/html/conf_options_reference/searchd_program_configuration_options.html#server-id) - 每个节点的唯一编号，用于 UUID 初始化，如果未指定，守护进程将基于 MAC 地址生成一个



searchd 配置应如下所示：

```bash
searchd {
listen = 9306:mysql41
listen = my_ip1:9312
listen = my_ip1:9350-9459:replication
...
data_dir = /var/lib/manticore/data_dir
server_id = 1
...
}

```

在第一个节点上，我们通过 SphinxQL 连接到它并创建集群：

```bash
mysql> CREATE CLUSTER test;

```

或者，你也可以指定将连接到新集群的节点。除了 IP 地址外，还需要指定 API 端口。

```bash
mysql> CREATE CLUSTER test  'my_ip1:9312,my_ip2:9312,my_ip3:9312' as nodes;

```

定义的节点列表在集群重启时使用。如果在创建时未定义节点或添加了更多节点，必须运行命令 `ALTER CLUSTER cluster_name UPDATE nodes` 来更新所有活动节点的列表，否则在重启时，列表中未包含的节点必须手动重新加入集群。

接下来，我们连接到其他节点，并通过将其与现有节点（使用其 IP 和 API 端口）链接来加入集群：

```bash
mysql> JOIN CLUSTER test AT 'my_ip1:9312';

```

此时，我们已经定义了一个集群，下一步是将索引（或多个索引）添加到其中。这可以从任何节点完成：

```bash
mysql> ALTER CLUSTER test ADD pq1;

```

要向索引 `pq1` 添加新的存储查询，我们通常的 INSERT 查询需要一个小的更改：需要在索引名称前加上集群名称：

```bash
mysql> INSERT INTO test:pq1 VALUES('samsung');

```

集群前缀仅在写入语句（INSERT、REPLACE、DELETE TRUNCATE）中需要。读取语句（CALL PQ、SELECT 和 DESCRIBE）可以使用常规的索引名称。
  
  
### 接下来是什么？


有关所有复制选项的更多信息，请查看 [文档](https://docs.manticoresearch.com/latest/html/replication.html)。

在我们的在线课程中，你可以找到 [复制简介](https://play.manticoresearch.com/replication/) 课程以及一个简单的 [故障转移恢复](https://play.manticoresearch.com/replicationfail/) 课程。

在撰写本文时，实时索引的复制功能正在开发中。
