t3g / elasticorn
基于 elastica 的 elasticsearch 管理器
Requires
- php: ^7.4 || ^8.0
- consolidation/self-update: ^1.2
- ruflin/elastica: ^7.1
- sebastian/diff: ^4.0
- symfony/console: ^5.0
- symfony/dependency-injection: ^5.0
- symfony/yaml: ^5.0
- vlucas/phpdotenv: ^2.3
Requires (Dev)
- behat/behat: ^3.1
- friendsofphp/php-cs-fixer: ^2.16
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.3
- roave/security-advisories: dev-master
README
Elasticorn 是一个基于 elastica 的 elasticsearch 管理器。其主要功能是数据重映射的零停机时间。兼容性
- 1.x 版本的发布与 elasticsearch 2.x 兼容。
- 5.x 版本的发布与 elasticsearch 5.x 兼容。
- 7.x 版本的发布与 elasticsearch 7.x 兼容。
特性
- 索引的零停机时间重映射(包括数据传输)
- 基于配置文件初始化索引
- 显示和比较映射配置
零停机时间重映射 - 工作原理
Elasticorn 使用别名来允许索引的零停机时间重映射。对于每个配置的索引,Elasticorn 创建一个 index_a 和 index_b,并使用别名指向当前活动索引。在应用新映射时,当前不活动的索引将被删除并使用新映射重新创建。然后,数据从旧索引复制到新索引。数据传输成功完成后,别名指向新索引。
步骤分解
- 您应用程序的索引名称与您的配置不同。
- 您应用程序的索引实际上有两个独立的索引,您配置的索引名称只是指向当前活动索引的别名。我们称另一个索引为“备用索引”。
- 当更改索引的映射时,该索引的所有数据都必须被删除,因为您的映射可能会影响之前分析数据的方式。
- Elasticorn 将确定在运行之间您的映射是否已更改
- Elasticorn 将确定当前活动索引并切换到备用索引
- Elasticorn 然后将新映射应用到备用索引上
- Elasticorn 将从活动索引复制所有数据到(新映射的)备用索引。这将按预期再次分析您的数据。
- 完成后,Elasticorn 将将别名从“旧”活动索引更改为“旧”备用索引。这样,备用索引就成为了新的活动索引。
- Elasticorn 将删除“旧”活动索引中的所有数据以释放资源。
- 由于切换别名是一个原子操作,您的用户将不会经历任何停机时间。
- 享受为您的用户提供出色的服务。
安装
基于 Composer
composer require t3g/elasticorn
Elasticsearch 客户端配置
Elasticorn 假设默认连接参数用于建立与 elasticsearch 的连接。如果您使用的是非默认设置,您可以在 .env 文件中配置这些连接设置。有关详细信息,请参阅以下内容。
索引和映射配置
为了使 Elasticorn 的工作,您的配置需要以下结构和定义 yaml。
- MAIN configuration directory
- Elasticorn.yaml*
- IndexName directory
- IndexConfiguration.yaml (Containing index settings)
- Mapping.yaml (Containing mapping configuration)
* 可选
示例
project
│ README.md
└───Elasticorn
└── t3_forger_issue
├── Mapping.yaml
└── IndexConfiguration.yaml
└── t3_forger_review
├── Mapping.yaml
└── IndexConfiguration.yaml
└── t3_forger_user
├── Mapping.yaml
└── IndexConfiguration.yaml
在我们的案例中,Elasticorn 包含有关我们索引的所有信息。可以通过创建新文件夹来管理多个索引。
IndexConfiguration.yaml 文件指定索引的配置参数(例如分片或副本。)
名为 Mapping.yaml 的文件包含我们的类型映射。
语法是相当直接的 yaml 语法,然后将其解析为数组。
我们将在这里查看 Mapping.yaml
id:
type: integer
username:
type: string
index: not_analyzed
store: true
fullname:
type: string
index: not_analyzed
store: true
email:
type: integer
index: not_analyzed
store: true
avatar:
type: string
有关配置应如何查看的示例,请参阅此项目 Tests/Fixtures/Configuration 文件夹。有关可用配置选项的列表,请参阅 elastica 文档。
您可以使用 .env
文件、命令行参数或交互式控制台来指定您的配置目录。
.env 配置
您可以在 .env/.env.dist 文件中指定您的配置目录以及特定的连接参数,这些文件应放置在 Elasticorn 运行的文件夹中。以下变量可以进行配置
configurationPath=
ELASTICA_HOST=
ELASTICA_PORT=
ELASTICA_PATH=
ELASTICA_URL=
ELASTICA_TRANSPORT=
ELASTICA_PERSISTENT=
ELASTICA_TIMEOUT=
ELASTICA_USERNAME=
ELASTICA_PASSWORD=
配置语言
如果您的设置符合以下基本条件,Elasticorn 可以自动为每种语言生成索引
- 每种语言一个索引
- 在您的配置中为每个字段配置了默认语言分析器
- 文档只包含一种语言
如果这些条件匹配,请在每个索引目录中添加一个名为 "Elasticorn.yaml" 的配置文件,例如,使用以下配置
languages:
- english
- german
- french
语言名称必须是 Elasticsearch 中可用的分析器的名称。在索引初始化时,将创建以下索引和别名
Indices:
- indexname_english_a
- indexname_english_b
- indexname_german_a
- indexname_german_b
- indexname_french_a
- indexname_french_b
Aliases:
- indexname_english
- indexname_german
- indexname_french
- indexname (pointing to first configured language)
初始化后,您可以调用 index:remap 添加更多语言
用法
基于 composer 的使用命令
./elasticorn.php -h
phar 使用命令
./elasticorn.phar -h
命令
index:init
- 初始化所有配置的索引index:remap
- 将新的映射配置应用到现有索引index:cornify
- 将传统索引转换为 Elasticorn 索引mapping:compare
- 允许比较当前应用的映射和配置的映射mapping:show
- 显示当前应用的映射
贡献和问题
欢迎所有贡献。如果您发现任何错误,有问题或只是想请求新功能,请随时将其添加到问题跟踪器。
如果您想从代码方面进行贡献,请fork 存储库并创建一个 pull request。
运行测试
Elasticorn 附带单元测试和验收测试。
单元测试
您可以使用 bin/phpunit -c build/phpunit.xml
运行单元测试套件。
验收测试
注意:验收测试需要一个干净的本机 elasticsearch 实例(localhost:9200)- 如果您配置了其他索引并且还需要,请不要执行这些测试。这些测试在多个位置删除 所有 索引。您可以通过设置
ELASTICA_HOST
和ELASTICA_PORT
环境变量来配置测试中使用的宿主和端口。要快速启动一个新的 elasticsearch 实例,请使用 docker:docker run --rm -p 9200:9200 elasticsearch:5.6-alpine
您可以使用 bin/behat -c build/behat.yml
运行验收测试套件。
构建 phar
- 使用 https://github.com/box-project/box2
- 运行
box compile