从零开始搭建 3 主 ES 8 集群

发布于:6/21/2024, 4:58:14 PM @孙博
技术分享 | ElasticSearch,ES
许可协议:署名-非商业性使用(by-nc)

ES 是一个强大的搜索引擎,在保存海量数据的同时还能提供无与伦比的分词搜索能力。

由于我的 MySQL 集群压力已经越来越大,有几个业务的数据条数也达到了千万级,为了提高搜索效率并真正支持模糊检索,故计划设置一个三主含数据节点的 ES 集群,并归纳整理安装过程以便后续查用。

事先已经在裸机(虚机)预装了最小化的 CentOS 7.9,并将 /data 目录专门用做数据存储,机器信息如下:

host ip
es-01 172.16.11.136
es-02 172.16.11.137
es-03 172.16.11.138

请注意:ES 集群中至少需要两个可用做 master 的节点才能正常启动,为保证冗余,最好设置三个或更多的可作为 master 的节点。

以下先从第一台负载开始进行安装。

为了防止出现 max_map_count 等报错,提前将参数设置为更大的值,如果这一步之前有做过则可以跳过。

echo "vm.max_map_count = 262144" >> /etc/sysctl.conf && sysctl -p

# 注意!以下操作需重新登陆,也可直接重启(reboot)。
cat > /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF
# reboot

安装之前首先将包下载到本地。

curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.1-linux-x86_64.tar.gz

随后解压缩到 /opt/elasticsearch

tar -zxf elasticsearch-8.14.1-linux-x86_64.tar.gz -C /opt
mv /opt/elasticsearch-8.14.1 /opt/elasticsearch

ES 的配置文件地址为 /opt/elasticsearch/config/elasticsearch.yml,原来的默认配置都是注释,感兴趣可以保存一份,节省时间可直接修改为如下内容,记得将涉及到 host 与 ip 之类的参数改为自己实际的值。

cat > /opt/elasticsearch/config/elasticsearch.yml << EOF
cluster.name: es-cluster
node.name: es-01
node.roles: [master,data]
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.initial_master_nodes: ["es-01", "es-02", "es-03"]
action.destructive_requires_name: false
discovery.seed_hosts: ["172.16.11.136:9300", "172.16.11.137:9300", "172.16.11.138:9300"]
EOF

上述配置中,我们需要指定数据与日志存放在什么目录,如果指定的目录不存在,需要提前创建。

mkdir -p /data/elasticsearch/{data,logs}

为了保证安全性,现在的 ES 需要 https 及证书来保证传输安全,我们在 第一个主节点 中利用自带的工具来创建证书。

先创建根证书,期间会要求你分别输入输出的文件名和密码,可以直接按两次 Enter 回车使用默认值。

/opt/elasticsearch/bin/elasticsearch-certutil ca

接着利用根证书签发一个节点证书,这里需要按三次 Enter 回车使用默认值来输入参数,第一个参数为根证书的密码,然后是节点证书名与节点证书密码。

/opt/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

这两步操作完成后,会在 /opt/elasticsearch/ 目录中生成 elastic-stack-ca.p12elastic-certificates.p12 文件,我们把它们移动到 /opt/elasticsearch/config 目录并配置到 /opt/elasticsearch/config/elasticsearch.yml 中。

mv /opt/elasticsearch/elastic-stack-ca.p12 /opt/elasticsearch/config/
mv /opt/elasticsearch/elastic-certificates.p12 /opt/elasticsearch/config/
cat >> /opt/elasticsearch/config/elasticsearch.yml << EOF
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: none
xpack.security.transport.ssl.keystore.path: /opt/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /opt/elasticsearch/config/elastic-certificates.p12
ingest.geoip.downloader.enabled: false
EOF

考虑到我的读者基本都是需要更好的中文支持的,我们再额外安装一个中文分词器插件 —— Analysis IK,请留意,插件的版本需要与 ES 的版本兼容,所以示例里我们同样使用 8.14.1 版本的插件。(不需要可跳过此步骤)

curl -O https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.14.1.zip

将其解压并拷贝至 /opt/elasticsearch/plugins/analysis-ik/

unzip -d /opt/elasticsearch/plugins/analysis-ik/ elasticsearch-analysis-ik-8.14.1.zip

最后,由于 ElasicSearch 不允许使用 root 用户身份启动,所以需要创建新用户,并为其赋予 ES 相关目录的权限。

groupadd -r elastic
useradd -M -r -g elastic elastic
chown -R elastic:elastic /data/elasticsearch
chown -R elastic:elastic /opt/elasticsearch

第一台主节点安装完毕后先不要急着启动,按照同样的步骤重新在其他节点上执行一遍,不过要注意的是:

  1. 不需要再生成新的证书,只需要从第一个节点拷入即可;
  2. 千万不要忘记修改 /opt/elasticsearch/config/elasticsearch.yml 文件中的 node.name;
  3. 可选替代方案:可直接把 /opt/elasticsearch 拷到其他节点,记得设置同样的 /data 目录与 elastic 用户权限。

以下为拷出的方法,先做压缩。

tar -czf elasticsearch-8.14.1.tar.gz -C /opt/elasticsearch .

在其他节点拿到这个文件后,解压缩。

mkdir -p /opt/elasticsearch/
tar -zxf elasticsearch-8.14.1.tar.gz -C /opt/elasticsearch/

千万别忘记修改 /opt/elasticsearch/config/elasticsearch.yml

# 根据你自己的实际情况更改节点名,不可重复。
# sed -i 's/node.name: .*/node.name: es-02/g' /opt/elasticsearch/config/elasticsearch.yml
# sed -i 's/node.name: .*/node.name: es-03/g' /opt/elasticsearch/config/elasticsearch.yml

然后配置数据与日志目录

mkdir -p /data/elasticsearch/{data,logs}

最后,创建新用户,并为其赋权。

groupadd -r elastic
useradd -M -r -g elastic elastic
chown -R elastic:elastic /data/elasticsearch
chown -R elastic:elastic /opt/elasticsearch

执行完以上全部操作后,分别登陆到三台机器上,切换到 elastic 用户就可以启动 ES 集群了。

su -c "/opt/elasticsearch/bin/elasticsearch -d" elastic

如果没有报异常(ERROR)的话,可以尝试访问 127.0.0.1:9200,但不出意外的话应该会报 401 错误,因为我们还需要为它设置密码。

这次只需要随便找一个主节点就好,执行 elasticsearch-setup-passwords interactive 手动设置帐号密码。

/opt/elasticsearch/bin/elasticsearch-setup-passwords interactive

当冗长的密码设置完毕后,我们带上用户信息再次访问

[root@es-01 ~]# curl -u elastic:xxxxxx 127.0.0.1:9200
{
  "name" : "es-01",
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "Bxxxxx-xxxxxxxxxxuA",
  "version" : {
    "number" : "8.14.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "93a57a1a76f556d8aee6a90d1a95b06187501310",
    "build_date" : "2024-06-10T23:35:17.114581191Z",
    "build_snapshot" : false,
    "lucene_version" : "9.10.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
[root@es-01 ~]# curl -u elastic:xxxxxx 127.0.0.1:9200/_cat/nodes?v
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.16.11.137           12          64   0    0.02    0.04     0.06 dm        -      es-02
172.16.11.136           20          64   1    0.12    0.06     0.09 dm        *      es-01
172.16.11.138           14          63   1    0.01    0.06     0.12 dm        -      es-03

至此,就算是非常简单的就完成了一个三主节点的集群设置。

等后续计划迁入数据时再接入 Kibana 并加入自定义用户,请待后续更新。