学习OpenSearch的第一步,就是先给自己搭建一个分布式多节点环境。OpenSearch官网已经提供了比较详细的部署文档。官网地址在:https://opensearch.org/

年初的时候,我曾经在Synology NAS上安装并启动过一个双节点的OpenSearch集群。这次我打算在MacOS上通过Orbstack来部署双节点OpenSearch和OpenSearch Dashboards。如果你使用的是其他操作系统,也可以直接通过Docker来完成安装。

官方提供了Docker Compose示例,我这里选择的是3.x版本进行安装。需要特别注意的是,从OpenSearch 2.12开始,必须通过OPENSEARCH_INITIAL_ADMIN_PASSWORD这个环境变量来指定初始管理员密码。
OpenSearch对密码复杂度有一定要求,如果密码策略不满足要求,容器启动后会直接报错退出。这个问题一开始比较容易忽略,因为表面上看只是容器起不来,实际上需要去查看日志才能定位原因。
Password OS_Admin#Conf2026! failed validation: "Password is similar to user name".这个报错的原因是:OpenSearch的安全插件不仅会检查密码是否包含大小写字母、数字和特殊字符,还会检查密码与用户名的相似度。
这里失败的原因在于密码里包含了Admin这个词,而默认用户名正是admin。系统会因此认定该密码过于接近用户名,属于弱密码,最终直接拒绝启动并退出进程。
如果你的网络环境不太稳定,也可以提前把相关Docker镜像拉取到本地:
docker pull opensearchproject/opensearch-dashboards:3docker pull opensearchproject/opensearch:3接下来,在docker-compose.yml所在的同级目录下,创建一个名为.env的文件,内容如下:
# .env 文件内容OPENSEARCH_INITIAL_ADMIN_PASSWORD=Kube_Master_789!#另外,OpenSearch运行依赖Linux宿主机的vm.max_map_count参数,该值至少需要设置为262144。如果你是在Linux环境中部署,需要先在宿主机执行下面这条命令,否则容器启动时可能会直接报错:
sudo sysctl -w vm.max_map_count=262144下面是本次使用的docker-compose.yml配置:
services: opensearch-node1: image: opensearchproject/opensearch:3 container_name: opensearch-node1 environment: - cluster.name=opensearch-cluster - node.name=opensearch-node1 - discovery.seed_hosts=opensearch-node1,opensearch-node2 - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 - bootstrap.memory_lock=true # along with the memlock settings below, disables swapping - OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m # minimum and maximum Java heap size, recommend setting both to 50% of system RAM - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD} # Sets the demo admin user password when using demo configuration, required for OpenSearch 2.12 and higher ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 # maximum number of open files for the OpenSearch user, set to at least 65536 on modern systems hard: 65536 volumes: - opensearch-data1:/usr/share/opensearch/data ports: - 9200:9200 - 9600:9600 # required for Performance Analyzer networks: - opensearch-net opensearch-node2: image: opensearchproject/opensearch:3 container_name: opensearch-node2 environment: - cluster.name=opensearch-cluster - node.name=opensearch-node2 - discovery.seed_hosts=opensearch-node1,opensearch-node2 - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 - bootstrap.memory_lock=true - OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD} ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 volumes: - opensearch-data2:/usr/share/opensearch/data networks: - opensearch-net opensearch-dashboards: image: opensearchproject/opensearch-dashboards:3 container_name: opensearch-dashboards ports: - 5601:5601 expose: - '5601' environment: OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]' networks: - opensearch-netvolumes: opensearch-data1: opensearch-data2:networks: opensearch-net:配置完成后,执行下面的命令启动服务。如果需要排查问题,可以通过docker logs查看容器日志。
docker compose up -d启动成功后,就可以通过curl访问OpenSearch的API了。下面这条命令可以用来查看集群健康状态。
OPENSEARCH_INITIAL_ADMIN_PASSWORD='Kube_Master_789!#'(base) ➜ ~ curl -XGET "https://localhost:9200/_cat/health?v" -u "admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD}" -kepoch timestamp cluster status node.total node.data discovered_cluster_manager shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent1774110432 16:27:12 opensearch-cluster green 2 2 true 12 6 0 0 0 0 - 100.0%从返回结果来看,我这里能够看到集群中一共有两个节点,集群状态为绿色,说明整体启动成功,当前处于健康状态。
随后,我们也可以通过http://127.0.0.1:5601/访问OpenSearch Dashboards。
不过这里还有一个小细节:有时候浏览器会自动把地址重定向到HTTPS,导致看起来像是服务访问异常。这个时候可以通过docker ps和curl -I来确认实际监听的端口和协议是否正确。

登录之后,就可以直接在Dev Tools里查看OpenSearch的状态和索引信息了。可以看到,OpenSearch默认的主分片数和副本分片数都是1,这一点和托管版OpenSearch服务的默认行为并不完全一样。

好了,MacOS安装OpenSearch 双节点的探索就到此结束了,后面还会探索OpenSearch的生命周期,以及和各种登录组件的集成,敬请期待~