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 集群,建议手动逐个节点重启,并要求待当前节点启动成功后再进行下一个节点的操作。