OpenSearch 项目是一个从 Elasticsearch 7.10.2 和 Kibana 7.10.2 分化出来的开源项目,该项目所有代码均以 Apache Licence 2.0 发布,该项目主要包含了一系列的组件,其中最核心的两个组件是:
除了这两个核心组件之外,OpenSearch 项目也提供了大量实用的组件,这些组件大多以 OpenSearch 或 Dashboards 的插件形式存在,例如提供企业级安全特性的 Security 插件、SQL 查询、异常检测、索引生命周期管理等。
OpenSearch 是一个分布式搜索和分析引擎,集群的部署模式比较灵活,当前火山引擎 LAS 提供的部署模式如下图所示:
节点之间的信息可以在 LAS 集群详情里进行查看:
其中 Dashboards 节点提供类似于 Kibana 的服务,CORE 实例节点提供 REST API 服务。 此外,LAS OpenSearch 集群所有信道均开启 TLS 加密传输,包括 Dashboards、Transport layer 和 REST layer。
OpenSearch 集群在初始化的时候会在 OpenLDAP 中创建一个名为opensearch的 OpenSearch 集群管理员账号,该账号具有 OpenSearch 集群所有的权限,包括集群管理、所有索引数据访问、用户访问权限控制等,该账号的具体密码信息可以在 LAS 控制台的 OpenLDAP 服务上获取,如下图所示:
OpenSearch 的安全机制,提供了丰富的用户管理机制,最简单的是内置的内部(internal)用户管理,由 OpenSearch 自身对用户进行增删改查,通过这个机制创建的用户不会同步到诸如 OpenLDAP 之类的外部用户管理系统中。
默认只有 OpenSearch 集群管理员 opensearch有权限对内部用户进行管理,管理员可以登录 Dashboards,单击左边侧边导航栏的Security插件里,在Internal user功能页上进行内部用户的管理。
除了内部用户管理功能之外,OpenSearch 也支持外部用户管理系统,例如 OpenLDAP,LAS OpenSearch 集群默认使用 OpenLDAP 作为集群内用户管理方案,这样做的好处是可以和 EMR 其他集群采用相同的账号体系,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 和用户关联,LAS OpenSearch 集群默认设置了两条访问规则:
opensearch 拥有所有权限。demo 只能对名字 demo 的用户拥有访问权限。在当前版本中普通用户的权限尚不支持 OpenLDAP 集成,所以相关权限都需要管理员在 Dashboards 上通过创建 ROLE 和关联用户来完成权限分配。
Mapped users 子页面单击 Manage mappings 按钮,在Users输入框中输入OpenLDAP用户的uid即可(不要输入dn)Dashbaords 提供类似 Kibana 的可视化交互功能,服务采用 HTTPS 通信,监听端口为5061,用户可以在 LAS 服务详情页上获取 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 | |
Python | |
Golang | |
JavaScript | |
PHP | |
.NET | |
Rust | |
Ruby |
除了 OpenSearch 的 SDK,部分 Elasticsearch SDK 也能正常工作。在使用过程中,我们建议优先使用 OpenSearch 官方维护的 SDK。倘若因特殊原因必须使用 Elasticsearch SDK,那么请务必留意版本兼容性问题,因为部分 Elasticsearch SDK 无法访问 OpenSearch 服务。以下是推荐的 Elasticsearch SDK 版本,尽量避免使用比下表所列版本更新的版本。
SDK | 推荐版本 |
|---|---|
7.13.4 | |
7.13.4 | |
7.13.4 | |
7.13.0 | |
7.13.0 |
查看日志会有如下错误:
偶现问题,原因在于所有 OpenSearch 节点未在 30秒 内完全启动,导致安全设置脚本过程中出现了节点数量返回不一致问题中止,再次尝试重启即可解决。
该问题本质在于目前 LAS 集群还未实现 OpenSearch 集群的滚动重启功能,导致无法保证所有节点启动后再进行安全设置,后续版本会提供完善的滚动重启功能。
目前如需重启 OpenSearch 集群,建议手动逐个节点重启,并要求待当前节点启动成功后再进行下一个节点的操作。