OpenSearch 项目是一个从 Elasticsearch 7.10.2 和 Kibana 7.10.2 分化出来的开源项目,该项目所有代码均以 Apache Licence 2.0 发布,该项目主要包含了一系列的组件,其中最核心的两个组件是:
OpenSearch: 基于 Apache Luncen 的分布式搜索和分析引擎,提供类似 Elasticsearch 的功能。
Dashboards: OpenSearch 引擎的可视化工具,提供类似 Kibana 的功能。
除了这两个核心组件之外,OpenSearch 项目也提供了大量实用的组件,这些组件大多以 OpenSearch 或 Dashboards 的插件形式存在,例如提供企业级安全特性的 security 插件、SQL 查询、异常检测、索引生命周期管理等。
OpenSearch 是一个分布式搜索和分析引擎,集群的部署模式比较灵活,当前火山引擎 E-MapReduce(EMR)提供的部署模式如下图所示:
Master 类型的节点部署在 Master 实例上,通过3个实例提供高可用。
Dashboards 和 Master 节点混部,部署在其中一个 Master 节点上。
剩下的节点类型都部署在 CORE 实例上。
节点之间的信息可以在 EMR 集群详情里进行查看:
其中 Dashboards 节点提供类似于 Kibana 的服务,CORE 实例节点提供 REST API 服务。 此外,EMR OpenSearch 集群所有信道均开启 TLS 加密传输,包括 Dashboards、Transport layer 和REST layer。
OpenSearch 集群在初始化的时候会在 OpenLDAP 中创建一个名为opensearch的 OpenSearch 集群管理员账号,该账号具有 OpenSearch 集群所有的权限,包括集群管理、所有索引数据访问、用户访问权限控制等,该账号的具体密码信息可以在 EMR 控制台的 OpenLDAP 服务上获取,如下图所示:
OpenSearch 的安全机制,提供了丰富的用户管理机制,最简单的是内置的内部(internal)用户管理,由 OpenSearch 自身对用户进行增删改查,通过这个机制创建的用户不会同步到诸如 OpenLDAP 之类的外部用户管理系统中。
默认只有 OpenSearch 集群管理员 opensearch有权限对内部用户进行管理,管理员可以登录 Dashboards,单击左边侧边导航栏的Security插件里,在Internal user功能页上进行内部用户的管理。
除了内部用户管理功能之外,OpenSearch 也支持外部用户管理系统,例如 OpenLDAP,EMR OpenSearch 集群默认使用 OpenLDAP 作为集群内用户管理方案,这样做的好处是可以和 EMR 其他集群采用相同的账号体系,OpenLDAP 用户管理指南详见 OpenLDAP 使用说明。
OpenSearch 默认使用 OpenLDAP 作为用户的管理方案,OpenLDAP 用户在进行登录验证时提供的账号是uid字段,而非完整的dn。例如对于dn为uid=demo,cn=emr,ou=ldap,dc=compute,dc=com的用户,其凭证就是 demo:${OPENLDAP_PASSWORD},无论是从 Dashbaords 登录,还是从命令行访问 OpenSearch,用的都是相同的凭证。
OpenSearch 提供 RBAC 的访问控制模型,通过 role 定义权限,再把 role 和用户关联,EMR OpenSearch 集群默认设置了两条访问规则:
OpenSearch 集群管理员 opensearch 拥有所有权限。
其它所有用户仅拥有对用户名一样的索引有权限,例如用户 demo 只能对名字 demo 的用户拥有访问权限。
在当前版本中普通用户的权限尚不支持 OpenLDAP 集成,所以相关权限都需要管理员在 Dashboards 上通过创建 role 和关联用户来完成权限分配。
在 Dashboards 上创建相关的角色
把用户关联到角色上,在角色列表中单击相关的角色,进入角色的配置页面,在 Mapped users 子页面单击 Manage mappings 按钮,在Users输入框中输入OpenLDAP用户的uid即可(不要输入dn)
Dashbaords 提供类似 Kibana 的可视化交互功能,服务采用 HTTPS 通信,监听端口为5061,用户可以在 EMR 服务详情页上获取 Dashboards 的 ip 后,在浏览器上使用 OpenLDAP 里的 uid 和密码登录。
OpenSearch 提供了一个用 golang 写的多平台命令行工具 opensearch-cli(opensearch 安装包里 bin 目录下有一个同名的 opensearch-cli 脚本,不是这里描述的 cli 工具) 可在这里下载。 使用 opensearch-cli 之前需要创建一下 opensearch 集群的 profile,不同的用户或集群可以保存为不同的 profile,使用时指定不同的 profile 即可。
opensearch-cli profile create --auth-type basic --endpoint https://localhost:9200 --name docker-local plaintext
创建过程中用户再输入用户名和密码, profile 包含集群 API 的入口、用户登录凭证,保存在文件 ~/.opensearch-cli/config.yaml中。 使用例子
./opensearch-cli --profile docker-local curl get --path _cluster/health | python -m json.tool plaintext
尽管 OpenSearch 兼容 Elasticsearch 7.10.2 生态,但是严格意义上,OpenSearch 是另外一个不同的产品,因此 OpenSearch 项目也维护了相关的 SDK版本,当前的 SDK 版本包括:
| SDK | 语言 |
|---|---|
| Java high-level REST client | Java |
| opensearch-py | Python |
| opensearch-go | Golang |
| opensearch-js | JavaScript |
| opensearch-php | PHP |
| opensearch-net | .NET |
| opensearch-rs | Rust |
| opensearch-ruby | Ruby |
除了 OpenSearch 的 SDK,部分 Elasticsearch SDK 也可以工作,在使用中,我们推荐使用 OpenSearch 官方维护的 SDK,如因特别原因导致需要使用 Elasticsearch SDK,需要注意版本兼容性问题,部分 Elasticsearch SDK 无法访问 OpenSearch 服务,下表是推荐的 Elasticsearch SDK 版本,尽量避开使用比下表所列版本更新的版本。
| SDK | 推荐版本 |
|---|---|
| Java low-level REST client | 7.13.4 |
| Java high-level REST client | 7.13.4 |
| Python Elasticsearch client | 7.13.4 |
| Elasticsearch Node.js client | 7.13.0 |
| Ruby Elasticsearch client | 7.13.0 |
查看日志会有如下错误:

偶现问题,原因在于所有 opensearch 节点未在 30秒 内完全启动,导致安全设置脚本过程中出现了节点数量返回不一致问题中止,再次尝试重启即可解决。
该问题本质在于目前 EMR 还未实现 OpenSearch 集群的滚动重启功能,导致无法保证所有节点启动后再进行安全设置,后续版本会提供完善的滚动重启功能。
目前如需重启 OpenSearch 集群,建议手动逐个节点重启,并要求待当前节点启动成功后再进行下一个节点的操作。