# 将索引迁移到版本3

Manticore Search 3 首次引入了索引兼容性的破坏性变更，无法加载使用 2.x 创建的现有索引。这意味着在升级 searchd 到 3.x 之前，必须准备好索引。

要使索引使用新格式，有两种选择：
1. 完全重建索引。如果索引不是很大且不是实时索引，这是最简单的方法。
2. 使用转换工具，可以自动将任何类型的索引（普通、percolate、实时）从 Manticore 2 / Sphinx 2 格式转换为新格式。

在开始迁移之前，有几项需要注意：
- 文档 ID 现在是正的有符号大整数，之前是无符号大整数
- 索引使用 kill-lists 的机制发生了重大变化
- 在开始转换实时索引之前，RAM chunk 必须为空。如果包含数据，应使用 FLUSH RAMCHUNK 将其写入磁盘。**此操作必须在现有 2.x 上执行，升级之前。**
- v3 不再限制每个索引的字符串 / json 属性为 4GB。过去某些情况下，索引必须拆分到多个 chunk 以适应数据。在 v3 中，此类索引可以减少到单个 chunk 或更少的 chunk（如果需要保留多线程搜索）。4GB 限制也适用于 RT 索引。这意味着如果达到 4GB 阈值，OPTIMIZE 无法将 RT chunk 减少到一个。在转换受影响的 RT 索引后，新索引可以应用 OPTIMIZE 以实现单 chunk RT 索引。

Manticore Search 3 提供了一个配套工具，可以将索引从 2.x 格式转换为 3.x 格式。该工具包含在一个名为 `manticore-converter` 的独立包中。此包不会以任何方式干扰或影响现有的 Manticore 安装，因此可以并行安装。

使用 `index_converter` 工具，您可以创建 3.x 版本的索引，当所有索引都完成转换后，再开始升级 Manticore 包。

如果您只有一台服务器：
- 安装 `manticore-converter` 包
- 使用 `index_converter` 在不同于现有数据文件夹的文件夹中创建索引的新版本（使用 --output-dir 选项）
- 停止现有 Manticore，升级到 3.0，将新索引移动到数据文件夹，启动 Manticore

为了实现最小停机时间，您可以将 2.x 索引、配置（您需要在此处编辑索引、日志和不同端口的路径）和二进制文件复制到单独的位置，并在单独的端口上启动，然后将应用程序指向它。
在升级到 3.0 并启动新守护进程后，可以将应用程序重新指向正常端口。如果一切正常，停止 2.x 副本并删除文件以释放空间。

如果您有一台备用服务器（如测试或预发布服务器），可以先在此处进行索引升级，甚至安装 Manticore 3 进行多项测试，如果一切正常，将新索引文件复制到生产服务器。

如果您有多台服务器可以从生产环境中移除，请逐个进行并升级每台服务器。对于分布式设置，2.x searchd 可以作为主节点与 3.x 节点一起工作，因此可以先升级数据节点，最后升级主节点。

转换工具可以一次迁移一个索引（使用 `--index`），从给定配置文件迁移所有索引（使用 `--all`）或从文件夹迁移所有索引（由 `--path` 定义）。由于转换器会创建现有索引的新版本，因此需要考虑额外的空间需求。如果空间是问题，应逐个转换索引。

如果不使用 kill-lists，使用转换器的最简单方法是直接转换所有内容：

```bash
$ index_converter --config /home/myuser/sphinx.conf --all
```

默认情况下，v3 索引写入同一文件夹，旧索引的文件名会带有 `.old`。使用 --output-dir 选项也可以将新索引保存在不同文件夹中。

```bash
$ index_converter --config /home/myuser/sphinx.conf --index myrtindex --output-dir /new/location
```

请注意，hitlists 文件 (.spp) 仅简单地移动到新版本（因为它未发生任何变化），并且不包含在旧版本的备份中。一旦完成版本 3 的测试且没有问题，可以删除旧索引版本的备份。

对于增量索引，转换前应在配置中设置新选项 killlist_target。转换器也可以使用 --killlist-target 设置目标：

```bash
$ index_converter --config /home/myuser/sphinx.conf --index deltaindex --killlist-target mainindex:kl
```

第三种方法是转换增量索引，加载它，使用 ALTER KILLLIST_TARGET 设置目标并（重新）加载目标以应用 kill-lists。

如果您有任何问题、疑问或评论，请随时联系我们：
- 在 [twitter](https://twitter.com/manticoresearch)
- 通过电子邮件发送至 <contact@manticoresearch.com>
- 在我们的 [Forum](https://forum.manticoresearch.com) 发帖
- 在我们的 [Community Slack](http://slack.manticoresearch.com) 与我们聊天
- 通过我们的 [GitHub 上的 bug 跟踪器](https://github.com/manticoresoftware/manticore)
