Easysearch 跨集群复制实战
yangmf2040 发表了文章 • 1 个评论 • 1814 次浏览 • 2023-08-22 17:28
在之前的文章中,有通过[极限网关实现容灾](http://www.infinilabs.com/blog ... teway/)的案例。今天给大家介绍 Easysearch 的跨集群复制功能。该功能可在集群之间复制数据,应用场景包括但不限于以下举例:
- 灾备同步:将数据同步到灾备中心,灾备中心可对外提供查询服务。
- 读写分离:单一集群读写压力都较大时,为了避免读写互相干扰造成性能降级,可将读压力分流到另外的集群。
- 就近查询:在多地中心之间复制数据,应用只需连接本地 ES 集群读取数据,避免网络延时和干扰。
跨集群复制使用 active-passive 模型,由目标集群主动拉取数据变化到本地,因此对源集群影响很小。
先决条件
- 源集群和目标集群都必须安装 cross-cluster-replication 和 index-management 插件。安装插件参考[这里](https://www.infinilabs.com/doc ... 3%2585)。
- 如果目标集群的 easysearch.yml 文件中覆盖了 node.roles,确保它也包括 remote_cluster_client 角色,默认已启用。
演示环境
- 源集群( leader 集群 ): 192.168.3.45:9200
- 目标集群( follower 集群 ): 192.168.3.39:9200
- 两个集群都已启用 security 功能。
设置集群间证书互信
将两个集群的证书合并到一个文件,将文件放到 config 目录下。
yaml<br /> cat ca-A.crt ca-B.crt > trust-chain.pem<br />
更新 easysearch.yml 文件,变化如下。
```yamlsecurity.ssl.transport.ca_file: ca.crt
security.ssl.transport.ca_file: trust-chain.pem
```
设置跨群集连接
在目标集群建立源集群的连接信息。在 INFINI console 的[开发工具](https://www.infinilabs.com/doc ... tools/)中,选中目标集群,执行以下命令。
yaml<br /> PUT /_cluster/settings?pretty<br /> {<br /> "persistent": {<br /> "cluster": {<br /> "remote": {<br /> "primary": {<br /> "seeds": ["192.168.3.45:9300"]<br /> }<br /> }<br /> }<br /> }<br /> }<br />
开始复制
首先在源集群创建测试索引 test , 并向索引写入数据。如果有测试索引,此步可省略。
yaml<br /> POST /_bulk?pretty<br /> { "index" : { "_index" : "test", "_id" : "1" } }<br /> { "field1" : "value1" }<br /> { "create" : { "_index" : "test", "_id" : "2" } }<br /> { "field2" : "value2" }<br />
然后在目标集群,创建一个名为 follower-test 的索引来复制源集群中 test 索引的内容。follower-test 可更换成自己想要的名字。
yaml<br /> PUT /_replication/follower-test/_start?pretty<br /> {<br /> "leader_alias": "primary",<br /> "leader_index": "test",<br /> "use_roles":{<br /> "leader_cluster_role": "cross_cluster_replication_leader_full_access",<br /> "follower_cluster_role": "cross_cluster_replication_follower_full_access"<br /> }<br /> }<br />
- leader_alias 指定之前创建的连接名称 primary 。
- leader_index 指定想要复制的索引名称 test 。
- use_roles 指定用什么角色访问对应的集群,为了安全使用最小权限,命令中的角色是系统自带的。
命令执行完后,会在目标集群建立名为 follower-test 的索引,其内容来自源集群的 test 索引。 我们可以看到,其内容就是之前插入的两个文档。
![](https://infinilabs.com/img/blo ... /1.png)
确认复制状态
可以看到 follow-test 处于同步的状态会实时同步远端的数据。
yaml<br /> GET /_replication/follower-test/_status?pretty<br />
![](https://infinilabs.com/img/blo ... /2.png)
在源集群再插入数据,看是否会同步。
yaml<br /> POST /_bulk?pretty<br /> { "index" : { "_index" : "test", "_id" : "3" } }<br /> { "field3" : "value3" }<br /> { "create" : { "_index" : "test", "_id" : "4" } }<br /> { "field4" : "value4" }<br />
目标集群查询索引,文档 3 和 4 已同步。
![](https://infinilabs.com/img/blo ... /3.png)
暂停和恢复复制
如果需要停机维护或其他原因想暂停复制功能,可使用暂停和恢复索引复制。
暂停
暂停目标集群上的索引复制。源集群索引再有新的变化,不会进行同步。
yaml<br /> POST /_replication/follower-test/_pause?pretty<br /> {}<br />
暂停后查看索引复制状态为 PAUSED 。
yaml<br /> GET /_replication/follower-test/_status?pretty<br />
![](https://infinilabs.com/img/blo ... /4.png)
恢复
恢复目标集群上的索引复制。
yaml<br /> POST /_replication/follower-test/_resume?pretty<br /> {}<br />
停止复制
为了保证数据的一致性,目标集群上的 follower 索引都是只读的。如果要切换到可读写的状态,需要先停止复制。我们先直接写入数据,会报禁止该操作。
![](https://infinilabs.com/img/blo ... /5.png)
停止复制
执行停止复制命令,索引变为可读写状态,一个独立状态,不再会从源端复制内容。想要删除索引之前,也要先停止复制。
yaml<br /> POST /_replication/follower-test/_stop?pretty<br /> {}<br />
再次写入数据测试,成功。
![](https://infinilabs.com/img/blo ... /6.png)
自动跟随
前面给大家演示了单个索引的复制操作,对于每天自动创建一个索引的场景(日期后缀),这样的操作不免太麻烦了。跨集群复制的自动跟随功能,可以在目标集群建立一个复制模式,如果源集群新建索引名称匹配该模式,目标集群会自动创建一个索引来复制它。
创建复制模式
先在目标集群建立一个复制模式,模式名叫 nginx-index ,会自动复制源集群上 nginx 开头的索引。
yaml<br /> POST /_replication/_autofollow?pretty<br /> {<br /> "leader_alias" : "primary",<br /> "name": "nginx-index",<br /> "pattern": "nginx*",<br /> "use_roles":{<br /> "leader_cluster_role": "cross_cluster_replication_leader_full_access",<br /> "follower_cluster_role": "cross_cluster_replication_follower_full_access"<br /> }<br /> }<br /> <br />
源集群创建 nginx 开头的索引。
yaml<br /> POST /nginx-1/_doc/<br /> {<br /> "test":"test"<br /> }<br /> <br /> POST /nginx-2/_doc/<br /> {<br /> "test":"test2"<br /> }<br />
目标集群查看复制结果。
![](https://infinilabs.com/img/blo ... /7.png)
停止自动跟随
如果不想复制新创建 nginx 开头的索引,可以使用停止跟随。停止自动跟随仅仅停止任何新的自动跟随活动,不会停止现存自动跟随启动的复制。
yaml<br /> DELETE /_replication/_autofollow?pretty<br /> {<br /> "leader_alias" : "primary",<br /> "name": "nginx-index"<br /> }<br /> <br />
上述命令不会影响目标集群上 nginx-1 和 nginx-2 索引的复制。而且 nginx-1 和 nginx-2 索引是只读的,如果要切换到读写状态,先停止复制。
yaml<br /> POST /_replication/nginx-1/_stop?pretty<br /> {}<br />
小结
这次实战主要演示了跨集群复制的操作过程:
- 建立证书互信
- 目标集群创建跨集群连接
- 开始复制:单索引或自动跟随复制
- 管理复制:暂停、查看状态、恢复、停止、删除自动跟随
好的,这次跨集群复制实战就到这里了,更多的内容大家可参考[官方文档](https://www.infinilabs.com/doc ... r_api/)。如遇到问题,可以通过微信群、[Discord](https://discord.com/channels/1 ... 966313) 联系我们。
关于 Easysearch
![about easysearch](https://www.infinilabs.com/img ... er.png)
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。
官网文档:<https://www.infinilabs.com/doc ... gt%3B
下载地址:<https://www.infinilabs.com/download>
- 建立证书互信
使用 Logstash 同步 MySQL 到 Easysearch
yangmf2040 发表了文章 • 0 个评论 • 1497 次浏览 • 2023-08-17 00:49
从 MySQL 同步数据到 ES 有多种方案,这次我们使用 ELK 技术栈中的 Logstash 来将数据从 MySQL 同步到 Easysearch 。
方案前提
- MySQL 表记录必须有主键,比如 id 字段。通过该字段,可将 Easysearch 索引数据与 MySQL 表数据形成一对一映射关系,支持修改。
- MySQL 表记录必须有时间字段,以支持增量同步。
如果上述条件具备,便可使用 logstash 定期同步新写入或修改后的数据到 Easysearch 中。
方案演示
版本信息
MySQL: 5.7
Logstash: 7.10.2
Easysearch: 1.5.0MySQL 设置
创建演示用的表。
yaml<br /> CREATE DATABASE es_db;<br /> USE es_db;<br /> DROP TABLE IF EXISTS es_table;<br /> CREATE TABLE es_table (<br /> id BIGINT(20) UNSIGNED NOT NULL,<br /> PRIMARY KEY (id),<br /> UNIQUE KEY unique_id (id),<br /> client_name VARCHAR(32) NOT NULL,<br /> modification_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,<br /> insertion_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP<br /> );<br />
说明
- id 字段: 主键、唯一键,将作为 Easysearch 索引中的 doc id 字段。
- modification_time 字段: 表记录的插入和修改都会记录在此。
- client_name: 代表用户数据。
- insertion_time: 可省略,用来记录数据插入到 MySQL 数据的时间。
插入数据
yaml<br /> INSERT INTO es_table (id, client_name) VALUES (1, 'test 1');<br /> INSERT INTO es_table (id, client_name) VALUES (2, 'test 2');<br /> INSERT INTO es_table (id, client_name) VALUES (3, 'test 3');<br />
Logstash
配置文件
yaml<br /> input {<br /> jdbc {<br /> jdbc_driver_library => "./mysql-connector-j-8.1.0/mysql-connector-j-8.1.0.jar"<br /> jdbc_driver_class => "com.mysql.jdbc.Driver"<br /> jdbc_connection_string => "jdbc:mysql://192.168.56.3:3306/es_db"<br /> jdbc_user => "root"<br /> jdbc_password => "password"<br /> jdbc_paging_enabled => true<br /> tracking_column => "unix_ts_in_secs"<br /> use_column_value => true<br /> tracking_column_type => "numeric"<br /> last_run_metadata_path => "./.mysql-es_table-sql_last_value.yml"<br /> schedule => "*/5 * * * * *"<br /> statement => "SELECT *, UNIX_TIMESTAMP(modification_time) AS unix_ts_in_secs FROM es_table WHERE (UNIX_TIMESTAMP(modification_time) > :sql_last_value AND modification_time < NOW()) ORDER BY modification_time ASC"<br /> }<br /> jdbc {<br /> jdbc_driver_library => "./mysql-connector-j-8.1.0/mysql-connector-j-8.1.0.jar"<br /> jdbc_driver_class => "com.mysql.jdbc.Driver"<br /> jdbc_connection_string => "jdbc:mysql://192.168.56.3:3306/es_db"<br /> jdbc_user => "root"<br /> jdbc_password => "password"<br /> schedule => "*/5 * * * * *"<br /> statement => "SELECT count(*) AS count,'es_table' AS table_name from es_table"<br /> }<br /> }<br /> filter {<br /> if ![table_name] {<br /> mutate {<br /> copy => { "id" => "[@metadata][_id]"}<br /> remove_field => ["@version", "unix_ts_in_secs","@timestamp"]<br /> add_field => { "[@metadata][target_index]" => "mysql_es_table" } }<br /> } else {<br /> mutate { <br /> add_field => { "[@metadata][target_index]" => "table_counts" } <br /> remove_field => ["@version"]<br /> }<br /> uuid {<br /> target => "[@metadata][_id]"<br /> overwrite => true<br /> }<br /> }<br /> }<br /> output {<br /> elasticsearch {<br /> hosts => ["<a href="https://localhost:9200"" rel="nofollow" target="_blank">https://localhost:9200"</a>]<br /> user => "admin"<br /> password => "f0c6fc61fe5f7b084c00"<br /> ssl_certificate_verification => "false"<br /> index => "%{[@metadata][target_index]}"<br /> manage_template => "false"<br /> document_id => "%{[@metadata][_id]}"<br /> }<br /> }<br />
- 每 5 秒钟同步一次 es_table 表的数据到 mysql_sync_idx 索引。
- 每 5 秒统计一次 es_table 表的记录条数到 table_counts 索引,用于监控。
启动 logstash
yaml<br /> ./bin/logstash -f sync_es_table.conf<br />
查看同步结果, 3 条数据都已同步到索引。
![](https://www.infinilabs.com/img ... /1.png)
Mysql 数据库新增记录
yaml<br /> INSERT INTO es_table (id, client_name) VALUES (4, 'test 4');<br />
Easysearch 确认新增
![](https://www.infinilabs.com/img ... /2.png)
Mysql 数据库修改记录
yaml<br /> UPDATE es_table SET client_name = 'test 0001' WHERE id=1;<br />
Easysearch 确认修改
![](https://www.infinilabs.com/img ... /3.png)
删除数据
Logstash 无法直接删除操作到 ES ,有两个方案:
- id 字段: 主键、唯一键,将作为 Easysearch 索引中的 doc id 字段。
- 在表中增加 is_deleted 字段,实现软删除,可达到同步的目的。查询过滤掉 is_deleted : true 的记录,后续通过脚本等方式定期清理 is_deleted : true 的数据。
- 执行删除操作的程序,删除完 MySQL 中的记录后,继续删除 Easysearch 中的记录。
同步监控
数据已经在 ES 中了,我们可利用 INFINI Console 的数据看板来监控数据是否同步,展示表记录数、索引记录数及其变化。
![](https://www.infinilabs.com/img ... /4.png)
Easysearch 跨版本兼容性测试,还原 Elasticsearch 各版本快照数据
liaosy 发表了文章 • 0 个评论 • 3442 次浏览 • 2023-06-17 12:50
本文主要测试验证 Elasticsearch 各版本快照在 [Easysearch](https://www.infinilabs.com/doc ... erview) 中进行数据恢复。
准备测试数据
索引
![](https://www.infinilabs.com/img ... p1.png)
别名
![](https://www.infinilabs.com/img ... p2.png)
模版
![](https://www.infinilabs.com/img ... p3.png)
生命周期策略
![](https://www.infinilabs.com/img ... p4.png)
创建快照
<br /> PUT /_snapshot/my_backup<br /> {<br /> "type": "fs",<br /> "settings": {<br /> "location": "/infini/test/es_backup"<br /> }<br /> }<br /> <br /> PUT /_snapshot/my_backup/snapshot_1<br /> {<br /> "indices": "*",<br /> "ignore_unavailable": false,<br /> "include_global_state": false<br /> }<br /> <br /> GET /_snapshot/my_backup/snapshot_1<br />
- ignore_unavailable:如果 indices 列表中的索引不存在,则是否忽略该索引而不是使快照失败。默认值为 false 。
- include_global_state:是否在快照中包含集群状态(包括索引模版、生命周期配置、持久化配置等)。默认值为 true ,建议设为 false。
恢复快照
<br /> POST /_snapshot/my_backup/snapshot_1/_restore<br /> {<br /> "indices": "*",<br /> "ignore_unavailable": false,<br /> "include_global_state": false,<br /> "include_aliases": true,<br /> "ignore_index_settings": [<br /> "index.lifecycle.indexing_complete"<br /> ]<br /> }<br />
- ignore_unavailable:如果 indices 列表中的索引不存在,则是否忽略该索引而不是使还原操作失败。默认值为 false 。
- include_global_state:是否还原群集状态。默认值为 false 。
- include_aliases:是否恢复别名及其关联索引。默认值为 true 。
- index.lifecycle.indexing_complete 配置不支持,忽略掉。
数据验证
索引
![](https://www.infinilabs.com/img ... p5.png)
通过 gateway 进行数据比对
```
path.data: data
path.logs: log
show progress bar
progress_bar.enabled: true
elasticsearch:- name: source
enabled: true
endpoints:
- name: target
enabled: true
endpoints:
- https://192.168.3.185:9205
basic_auth:
username: admin
password: admin
pipeline:
- https://192.168.3.185:9205
- name: index_diff_service
auto_start: true
processor:
- dag:
mode: wait_all
parallel:
- dump_hash: #dump es1's doc
sort_document_fields: true
indices: ".infini_activities-000004" ##需要比对的索引名
scroll_time: "10m"
elasticsearch: "source"
query_string: "_id:c8es70pu46lgfdgmja9g-1646117763293610802-2"
fields: "doc_hash"
output_queue: "source_docs"
batch_size: 5000
slice_size: 1hash_func: "xxhash64"
- dump_hash: #dump es2's doc
indices: ".infini_activities-000004"
scroll_time: "10m"
fields: "doc_hash"
query_string: "_id:c8es70pu46lgfdgmja9g-1646117763293610802-2"
batch_size: 5000
slice_size: 1hash_func: "xxhash64"
elasticsearch: "target"
output_queue: "target_docs"
end: - index_diff:
diff_queue: "diff_result"
buffer_size: 10
text_report: true #如果要存 es,这个开关关闭,开启 pipeline 的 diff_result_ingest 任务
source_queue: "source_docs"
target_queue: "target_docs"
pipeline:
- name: diff_result_ingest
processor:
- json_indexing:
index_name: "diff_result"
elasticsearch: "source"
input_queue: "diff_result"
```
./gateway-linux-amd64 -config data_check.yml
![](https://www.infinilabs.com/img ... p6.png)
别名
![](https://www.infinilabs.com/img ... p7.png)
模版
<br /> PUT _template/.infini_activities-rollover<br /> {<br /> "order": 100000,<br /> "index_patterns": [<br /> ".infini_activities*"<br /> ],<br /> "settings": {<br /> "index": {<br /> "format": "7",<br /> "lifecycle": {<br /> "name": "ilm_.infini_metrics-30days-retention",<br /> "rollover_alias": ".infini_activities"<br /> },<br /> "codec": "best_compression",<br /> "number_of_shards": "1",<br /> "translog": {<br /> "durability": "async"<br /> }<br /> }<br /> },<br /> "mappings": {<br /> "dynamic_templates": [<br /> {<br /> "strings": {<br /> "mapping": {<br /> "ignore_above": 256,<br /> "type": "keyword"<br /> },<br /> "match_mapping_type": "string"<br /> }<br /> }<br /> ]<br /> },<br /> "aliases": {}<br /> }<br /> <br /> PUT _template/.infini<br /> {<br /> "order": 0,<br /> "index_patterns": [<br /> ".infini_*"<br /> ],<br /> "settings": {<br /> "index": {<br /> "max_result_window": "10000000",<br /> "mapping": {<br /> "total_fields": {<br /> "limit": "20000"<br /> }<br /> },<br /> "analysis": {<br /> "analyzer": {<br /> "suggest_text_search": {<br /> "filter": [<br /> "word_delimiter"<br /> ],<br /> "tokenizer": "classic"<br /> }<br /> }<br /> },<br /> "number_of_shards": "1"<br /> }<br /> },<br /> "mappings": {<br /> "dynamic_templates": [<br /> {<br /> "strings": {<br /> "mapping": {<br /> "ignore_above": 256,<br /> "type": "keyword"<br /> },<br /> "match_mapping_type": "string"<br /> }<br /> }<br /> ]<br /> },<br /> "aliases": {}<br /> }<br />
生命周期策略
<br /> PUT _ilm/policy/ilm_.infini_metrics-30days-retention<br /> {<br /> "policy": {<br /> "phases": {<br /> "hot": {<br /> "min_age": "0ms",<br /> "actions": {<br /> "rollover": {<br /> "max_size": "50gb",<br /> "max_age": "30d"<br /> },<br /> "set_priority": {<br /> "priority": 100<br /> }<br /> }<br /> },<br /> "delete": {<br /> "min_age": "30d",<br /> "actions": {<br /> "delete": {<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />
注:不支持 "delete_searchable_snapshot": true 配置
测试结果
| 源集群(Elasticsearch) | 目标集群(Easysearch) | 测试结果 |
| ----------------------- | ---------------------- | -------------------------- |
| 7.10.2 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 7.10.1 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 7.10.0 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 7.9.2 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 7.9.0 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 7.8.1 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 7.5.2 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 6.8.12 | 1.0.0 | 索引文档一致,别名恢复成功 |
| 6.5.4 | 1.0.0 | 索引文档一致,别名恢复成功 |
关于 Easysearch
![about easysearch](https://www.infinilabs.com/img ... er.png)
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。 Easysearch 衍生自基于开源协议 Apache 2.0 的 Elasticsearch 7.10 版本。 Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。
详情参见:[官方文档](https://www.infinilabs.com/doc ... erview)
- dump_hash: #dump es1's doc
- dag:
- name: source
极限科技旗下软件产品 INFINI Easysearch 通过统信 UOS 认证
liaosy 发表了文章 • 0 个评论 • 2923 次浏览 • 2023-06-16 17:10
近日,极限数据 (北京) 科技有限公司(以下简称:极限科技)旗下的软件 INFINI Easysearch 搜索引擎软件 V1.0 通过统信 UOS 服务器操作系统 V20 认证。
此次兼容适配基于统信 UOS 服务器操作系统 V20,联合国产 CPU:海光 5000、海光 7000、兆芯 KH-30000、兆芯 KH20000、兆芯 ZX-C+ 等系列处理器,经过共同严格测试表明 INFINI Easysearch 搜索引擎软件 V1.0 整体运行稳定,满足功能及兼容性测试要求,并获得通用软硬件适配认证中心联合认证证书。
![](https://www.infinilabs.com/img ... p1.png)
![](https://www.infinilabs.com/img ... p1.png)
统信软件是以“打造中国操作系统创新生态”为使命的中国基础软件公司。基于国产芯片架构的操作系统产品已经和龙芯、飞腾、申威、鲲鹏、兆芯、海光等芯片厂商开展了广泛和深入的合作,与国内各主流整机厂商及软件厂商展开了全方位的兼容性适配工作。
![](https://www.infinilabs.com/img ... er.png)
极限科技研发的 INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,同时也是一款具备自主可控的分布式近实时搜索型数据库产品,具备高性能、高可用、弹性伸缩、高安全性等特性,具备支持丰富的个性化搜索及聚合分析能力,可部署在物理机、虚拟机、容器、私有云和公有云,能承载 PB 级别的海量业务数据,为金融核心系统、运营商、制造业和政企业务系统提供安全、稳定、可靠的快速检索和实时数据探索分析能力,可满足不同业务场景的各项复杂需求。
此次通过统信 UOS 的兼容适配联合认证,标志着极限科技在支持国产化方面又迈出关键一步。此外,Easysearch 也实现了对麒麟、欧拉等国产操作系统的支持。未来,极限科技将积极参与国产创新技术生态的建设,坚持自主可控安全可靠,深化对国产化软硬件技术栈的支持能力,为用户提供更加优质、稳定、高效、安全的产品与服务。
关于极限科技(INFINI Labs)
![关于极限科技](https://www.infinilabs.com/img ... bs.png)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
详情参见官网:[https://www.infinilabs.com](https://www.infinilabs.com)
让 Easysearch 运行在 Kylin V10 (Lance)-aarch64 上
Hardy 发表了文章 • 0 个评论 • 3248 次浏览 • 2023-06-07 11:08
简介
本文主要介绍在国产操作系统 Kylin V10 (Lance)-aarch64 上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen
系统配置
在安装之前,需要先进行系统参数调整并创建操作用户,以下命令均需要使用 root 用户操作。
```bash
配置nofile和memlock
tee /etc/security/limits.d/21-infini.conf <<-'EOF'
- soft nofile 1048576
- hard nofile 1048576
- soft memlock unlimited
- hard memlock unlimited
root soft nofile 1048576
root hard nofile 1048576
root soft memlock unlimited
root hard memlock unlimited
EOF
关闭THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
grep -i HugePages_Total /proc/meminfo
grep -wq transparent_hugepage /etc/rc.local || cat <<-'EOF' >> /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
chmod 755 /etc/rc.local
内核调优
tee /etc/sysctl.d/70-infini.conf <<-'EOF'
vm.max_map_count = 262145
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 900
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.ip_local_port_range = 1024 65535
EOF
sysctl -p /etc/sysctl.d/70-infini.conf
```
用户配置
```bash创建Easysearch操作用户
groupadd -g 602 es
useradd -u 602 -g es -m -d /home/es -c 'easysearch' -s /bin/bash es
```
配置 JDK
```bash在各个节点上分别操作
wget -N https://release.infinilabs.com ... ar.gz -P /usr/src
mkdir -p /usr/local/jdk
tar -zxf /usr/src/zulu*.tar.gz -C /usr/local/jdk --strip-components 1
tee /etc/profile.d/java.sh <<-'EOF'set java environment
JAVA_HOME=/usr/local/jdk
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME CLASSPATH
EOF
source /etc/profile
java -version
```
Easysearch 部署
部署及密码配置
```bash在线安装
curl -sSL http://get.infini.sh | bash -s -- -p easysearch -d /data/easysearch
初始化证书(若不采用默认证书,如需要调整证书可修改证书生成文件)
cd /data/easysearch
bin/initialize.sh
ll /data/easysearch/config/{.crt,.key,*.pem}
调整默认密码及服务配置文件
export ES_HOME=/data/easysearch
pass=tr -cd 'a-zA-Z0-9!@#$%' </dev/urandom | head -c20
记录密码后,删除该文件
echo $pass > /tmp/pass
hash=$ES_HOME/bin/hash_password.sh -p $pass
echo $hash
更新密码字段
cat <
$ES_HOME/config/security/user.yml
meta:
type: "user"
config_version: 2
Define your internal users here
Admin users
admin:
hash: "$hash"
reserved: true
external_roles:- "admin"
description: "Admin user"
EOF
```
配置文件及 JVM 调整
```bash
cat </data/easysearch/config/easysearch.yml
cluster.name: infinilabs
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]
path.home: /data/easysearch
path.data: /data/easysearch/data
path.logs: /data/easysearch/logs
http.compression: true
security.enabled: true
security.audit.type: noop
security.ssl.transport.cert_file: instance.crt
security.ssl.transport.key_file: instance.key
security.ssl.transport.ca_file: ca.crt
security.ssl.transport.skip_domain_verify: true
security.ssl.http.enabled: true
security.ssl.http.cert_file: instance.crt
security.ssl.http.key_file: instance.key
security.ssl.http.ca_file: ca.crt
security.allow_default_init_securityindex: true
security.nodes_dn: - 'CN=infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'
security.restapi.roles_enabled: [ "superuser", "security_rest_api_access" ]
security.system_indices.enabled: true
security.ssl.http.clientauth_mode: OPTIONAL
security.system_indices.indices: [".infini-*"]
for admin dn
specify admin certs to operate against system indices, basic_auth is not required
curl -k --cert config/admin.crt --key config/admin.key -XDELETE 'https://localhost:9200/.infini-*/'
security.authcz.admin_dn:
- 'CN=admin.infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'
EOF
根据实际机器内存的大小进行配置,推荐配置为机器内存一半,且不超过31G
sed -i "s/1g/4g/g" $ES_HOME/config/jvm.options
```
备份目录及权限调整
```bash创建备份目录
mkdir -p /data/easysearch/backup
更新目录权限
chown -R es.es /data/easysearch
```
环境变量及启动服务
```bash
su - es
grep -wq easysearch ~/.bashrc || cat<> ~/.bashrc
export ES_HOME=/data/easysearch
EOF
source ~/.bashrc
以后台方式启动服务
$ES_HOME/bin/easysearch -d
```
Easysearch 验证
bash<br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200" rel="nofollow" target="_blank">https://127.0.0.1:9200</a><br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200/_cluster/health?pretty" rel="nofollow" target="_blank">https://127.0.0.1:9200/_cluster/health?pretty</a><br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200/_cat/nodes?v" rel="nofollow" target="_blank">https://127.0.0.1:9200/_cat/nodes?v</a><br />
部署 Console
```bash
curl -sSL http://get.infini.sh | bash -s -- -p console
安装服务并启动
cd /opt/console
./console-linux-arm64 -service install
./console-linux-arm64 -service start
验证
systemctl status console
```
部署 Agent
```bash
curl -sSL http://get.infini.sh | bash -s -- -p agent
修改Agent配置文件
cd /opt/agent
sed -i "/ES_ENDPOINT:/ s|(.\: ).|\1$https://localhost:9200|" agent.yml
sed -i "/ES_USER:/ s|(.\: ).|\1admin|" agent.yml
sed -i "/ES_PASS:/ s|(.\: ).|\1$pass|" gateway.yml
sed -i "/API_BINDING:/ s|(.\: ).|\1\"0.0.0.0:8080\"|" agent.yml
head -n 5 agent.yml
安装服务并启动
./agent-linux-arm64 -service install
./agent-linux-arm64 -service start
验证
systemctl status agent
```
部署 Gateway
```bash
curl -sSL http://get.infini.sh | bash -s -- -p gateway
cd /opt/gateway
修改Gateway配置文件
sed -i "/ES_PASS:/ s|(.\: ).|\1$pass|" gateway.yml
head -n 10 gateway.yml
安装服务并启动
./gateway-linux-arm64 -service install
./gateway-linux-arm64 -service start
检查服务
systemctl status gateway
curl -u "admin:$pass" http://127.0.0.1:8000
```
部署 Loadgen
```bash
curl -sSL http://get.infini.sh | bash -s -- -p loadgen
写入数据测试
cd /opt/loadgen
mkdir -p mock
cat <mock/nginx.log
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET / HTTP/1.1" 200 8676 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/bootstrap/css/bootstrap.css HTTP/1.1" 200 17235 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/daterangepicker/daterangepicker.css HTTP/1.1" 200 1700 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fork-awesome/css/v5-compat.css HTTP/1.1" 200 2091 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/font/raleway.css HTTP/1.1" 200 145 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fork-awesome/css/fork-awesome.css HTTP/1.1" 200 8401 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/css/overrides.css HTTP/1.1" 200 2524 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/css/theme.css HTTP/1.1" 200 306 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fancytree/css/ui.fancytree.css HTTP/1.1" 200 3456 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /syncthing/development/logbar.js HTTP/1.1" 200 486 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
EOF
cat <loadgen.yml
env:
ES_USERNAME: admin
ES_PASSWORD: $pass
ES_ENDPOINT: http://localhost:8000
runner:total_rounds: 1
no_warm: false
Whether to log all requests
log_requests: false
Whether to log all requests with the specified response status
log_status_codes:
- 0
- 500
assert_invalid: false
assert_error: false
variables: - name: ip
type: file
path: dict/ip.txt - name: message
type: file
path: mock/nginx.log
replace: # replace special characters in the value
'"': '\"'
'\': '\' - name: user
type: file
path: dict/user.txt - name: id
type: sequence - name: uuid
type: uuid - name: now_local
type: now_local - name: now_utc
type: now_utc - name: now_unix
type: now_unix - name: suffix
type: range
from: 10
to: 13
requests: - request:
method: POST
runtime_variables:
batch_no: uuid
runtime_body_line_variables:
routing_no: uuid
basic_auth:
username: $[[env.ES_USERNAME]]
password: $[[env.ES_PASSWORD]]
url: $[[env.ES_ENDPOINT]]/_bulk
body_repeat_times: 5000
body: |
{ "index" : { "_index" : "test-$[[suffix]]", "_id" : "$[[uuid]]" } }
{ "id" : "$[[uuid]]","routing_no" : "$[[routing_no]]","batch_number" : "$[[batch_no]]","message" : "$[[message]]","random_no" : "$[[suffix]]","ip" : "$[[ip]]","now_local" : "$[[now_local]]","now_unix" : "$[[now_unix]]" }
EOF
执行测试
./loadgen-linux-arm64 -c 6 -d 6 --compress
检查测试索引文档
curl -u "admin:$pass" http://127.0.0.1:8000/_cat/indices/test*?v
```
至此,完成在 Kylin V10 (Lance)-aarch64 上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen。通过浏览器 http://安装机器 IP:9000/ 即可访问 Console,对 Easysearch 进行配置管理。
- "admin"
INFINI Easysearch 完成龙芯架构兼容性认证
liaosy 发表了文章 • 0 个评论 • 2400 次浏览 • 2023-06-06 17:06
近日,极限科技旗下软件产品 INFINI Easysearch 搜索引擎软件 V1.0 在龙芯中科的龙芯 3C5000L 平台上完成兼容性测试,功能与稳定性良好,并获得龙架构兼容互认证书。
![](https://www.infinilabs.com/img ... p1.png)
龙芯是中国自主可控计算机处理器的代表品牌之一。龙芯处理器是由中国科学院计算技术研究所自主研发的一款高性能、低功耗、安全可靠的处理器。龙芯 3C5000L 是龙芯中科专门面向服务器领域的通用处理器。基于龙芯 3A5000 处理器,片上集成共 16 个高性能 LA464 处理器核,采用全新的龙芯自主指令系统(LoongArch®),在提高集成度的同时保持系统和软件与龙芯 3A5000 完全兼容。
极限科技研发的 INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。 同时也是一款具备自主可控的分布式近实时搜索型数据库产品,具备高性能、高可用、弹性伸缩、高安全性等特性,具备支持丰富的个性化搜索及聚合分析能力,可部署在物理机、虚拟机、容器、私有云和公有云,能承载 PB 级别的海量业务数据,为金融核心系统、运营商、制造业和政企业务系统提供安全、稳定、可靠的快速检索和实时数据探索分析能力,可满足不同业务场景的各项复杂需求。
此次通过龙芯架构(LoongArch)的兼容性测试,有效验证了 Easysearch 对于国产化 CPU 的互操作性与可靠性。此外,Easysearch 也实现了对麒麟、统信、欧拉等国产操作系统的支持。未来,极限科技将继续加强与各大厂商的合作,深化对国产化软硬件技术栈的支持能力,为用户提供更加优质、稳定、高效、安全的搜索服务。
关于极限科技(INFINI Labs)
![关于极限科技](https://www.infinilabs.com/img ... bs.png)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
详情参见官网:[https://www.infinilabs.com](https://www.infinilabs.com)