Elasticsearch 7.17 集群搭建
Elasticsearch 部署文档
搭建NFS server
目的:为集群snapshot备份提供共享文件系统。
服务端设置
- 安装server软件:
apt install nfs-kernel-server
,安装后服务会自动启动 - 默认配置文件:
/etc/default/nfs-kernel-server
和/etc/default/nfs-common
- 设置挂载目录(由于NFSv4使用了一个全局根目录,要想共享全局根目录以外的目录需要将其挂载至根目录)
mount -bind /opt/backups /srv/nfs4/backups
- 添加至
/etc/fstab
开机启动:/opt/backups /srv/nfs4/backups none bind 0 0
- 设置访问权限:
vim /etc/exports
man exports
查看详细的权限设置- 常见设置:
- rw 允许读写
- sync 同步写入
- fsid=0 表示为全局根目录
- root_squash/no_root_squash 是否将root视为匿名用户
- all_squash 是否所有用户是为匿名用户
nobody/nogroup
- 生效配置:
exportfs -ar
- 查看配置:
exportfs -v
当用户以匿名身份写入时,请确保挂载目录支持匿名身份写入!
客户端设置
- 安装客户端软件:
apt install nfs-common
- 挂载文件:
mount -t nfs -o vers=4 172.16.60.11:/ /mnt/data/nfs
- 设置开机挂载
man nfs
查看具体挂载参数172.16.60.11:/ /mnt/data/nfs nfs defaults,timeo=900,retrans=5,_netdev 0 0
架构设计
graph LR
H1[172.16.60.10]
H2[172.16.60.11]
H3[172.16.60.12]
S[(NFS Server)]
S --/mnt/data/nfs--> H2
H1 -./mnt/nfs > 172.16.60.11:/ .-> S
H2 -./mnt/nfs > 172.16.60.11:/ .-> S
H3 -./mnt/nfs > 172.16.60.11:/ .-> S
- 172.16.60.11是NFS 服务主机,提供
/mnt/data/nfs
用于服务根目录 /mnt/nfs
为三台主机对NFS访问的统一入口- 172.16.60.10-12通过NFS挂载至
/mnt/nfs
- 172.16.60.10-12通过NFS挂载至
Elasticsearch集群
- 官方教程
- 配置Elasticsearch
- 重要的Elasticsearch配置
- 重要的系统配置
- Elasticsearch安全设置
- 启用Elasticsearch节点之间的TLS传输
- Elasticsearch设置密码
- Docker安装kibana
- 启用reindex功能
graph LR
N1[Node 172.16.60.10 从节点]
N2[Node 172.16.60.11 从节点]
N3[Node 172.16.60.12 主节点]
C[Cluster]
subgraph Elasticsearch Cluster
C -.-> N1
C -.-> N2
C -.-> N3
end
HTTP --> C
官方部署流程
- 修改
/etc/sysctl.conf
值vm.max_map_count=262144
- 设置目录权限,保证
elasticsearch
用户可以读写- mkdir esdatadir
- chmod g+rwx esdatadir
- chgrp 0 esdatadir
- docker run 添加
--group-add 0
确保docker里面elasticsearch用户组为0
- 检查
ulimits
限制- docker run --rm docker.elastic.co/elasticsearch/elasticsearch:{version} /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'
- 关闭交换分区
- 系统层面关闭
- swapoff -a # 关闭所有交换分区
- 修改
/etc/sysctl.conf
的vm.swappiness=1
减少内核的切换倾向 - 修改es配置,打开
bootstrap.memory_lock: true
,锁定使用内存,可以使用GET _nodes?filter_path=**.mlockall
查看设置情况
- 仅设置docker关闭
- bootstrap.memory_lock: true #锁住内存,避免交换
- memlock
- true(docker daemon)
-e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1
- 系统层面关闭
- 随机端口:
--publish-all
建议生产环境 - 手动设置堆大小:默认自动设置,无须手动干预
- 指定部署的镜像版本
- 总是绑定数据卷:/usr/share/elasticsearch/data
- docker
storage-driver: devicemapper
避免使用loop-lvm
模式 - 集中化输出日志
- 配置文件管理
- 绑定配置文件
-v /path/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- 设置环境变量
- 直接设置配置文件设置名
- 转换配置文件设置名
- 通过docker run 镜像命令行传递
- 绑定配置文件
- 修改系统设置
- TCP重传超时: net.ipv4.tcp_retries2
- 确保JNA临时目录允许执行文件
- 线程数量
- 虚拟内存,es使用mmapfs存储索引
- 文件描述符数量调整
GET _nodes/stats/process?filter_path=**.max_file_descriptors
检查文件描述符数量
本机实际部署
系统调整
- 关闭交换分区: swapoff -a,禁用
/etc/fstab
交换分区挂载 - 调整系统设置
/etc/sysctl.conf
- vm.max_map_count=262144
- net.ipv4.tcp_retries2=5
- 创建es目录(配置、数据等),修改目录组权限为:
rwx
,组id为0
- /mnt/data/es es数据目录
- /mnt/nfs/es_snapshot es快照目录
- /home/tszh/code/ics_backup/elasticsearch
Elasticsearch配置
- 创建配置文件目录
- 复制配置文件
elasticsearch.yaml
- 启用密码
- 打开
xpack.security.enabled: true
开关,表示启用安全加密 7.17
版本要求启用密码后,节点传输需要开启TLS加密- 生成TLS证书
- 任一es节点,使用
./bin/elasticsearch-certutil ca
命令生成CA - 利用CA生成证书,使用
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
生成证书 - 拷贝生成的证书至
ES_PATH_CONF
环境变量指定的目录 - 如果生成CA期间使用了密码,需要更新
keystore
- ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
- ./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
- 任一es节点,使用
- elasticsearch.yml配置项
- xpack.security.transport.ssl.enabled: true
- xpack.security.transport.ssl.verification_mode: certificate
- xpack.security.transport.ssl.client_authentication: required
- xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
- xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
- 生成TLS证书
- 设置es集群密码
- 准备工作
- 确保集群已正常工作,设置密码其实是通过调用
http
接口完成的 - 确保命令行可以正确地读取elasticsearch的配置,建议使用运行状态下集群bin目录下的命令执行
- 确保集群已正常工作,设置密码其实是通过调用
bin/elasticsearch-setup-passwords auto | interactive
生成密码- auto是自动为保留的每个用户(用户名:apm,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user,elastic),自动生成密码并输出
- interactive是手动为每个用户设置密码
- 测试验证集群密码设置是否成功
- 准备工作
- 打开
- 启用reindex功能,方便从其它集群复制index数据(可选)
- 添加
reindex.remote.whitelist: [172.16.60.12:9200]
设置
- 添加
Docker运行
-
Elasticsearch
docker run -d --name es_11 -p 9200:9200 -p 9300:9300 --group-add 0 -v /mnt/data/es:/usr/share/elasticsearch/data -v /mnt/nfs/es_snapshot:/mnt/nfs/es_snapshot -v /home/tszh/code/ics_backup/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/tszh/code/ics_backup/elasticsearch/config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 docker.elastic.co/elasticsearch/elasticsearch:7.17.0
-p
指定运行端口--group-add
添加到root
用户组0-v
挂载目录- 数据目录
- 快照目录
- 配置目录
-
Kibana
docker run -d --name kibana -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elastic:xxx@172.16.60.12:9200" docker.elastic.co/kibana/kibana:7.17.1
-e
指定连接elasticsearch的信息,包括账号和密码
配置示例
- Elasticsearch
# All configs: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/important-settings.html
cluster.name: es_cluster
node.name: es-11
# node.roles: ["master", "data"]
network.host: 0.0.0.0
network.publish_host: 172.16.60.11
http.port: 9200
transport.port: 9300
# Cluster Settings
# Cluster other hosts
discovery.seed_hosts:
- 172.16.60.10:9300
- 172.16.60.12:9300
cluster.initial_master_nodes:
- es-10
- es-11
- es-12
path.repo:
- /mnt/nfs/es_snapshot
# Reindex
reindex.remote.whitelist:
- 172.16.60.10:9200
- 172.16.60.11:9200
- 172.16.60.12:9200
- 172.16.60.130:9200
- 172.16.60.131:9200
- 172.16.60.133:9200
# Xpack
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
- /etc/sysctl.conf
# Max vm map count
vm.max_map_count=262144
# TCP retry count
net.ipv4.tcp_retries2=5
- /mnt/fstab
# Mount NFS
172.16.60.11:/ /mnt/nfs nfs defaults,timeo=900,retrans=5,_netdev 0 0
注意事项
- 由于挂载目录的权限仅限
root和root组
进行访问,所以确保docker elasticsearch用户加入root用户组
- completed handshake with [{es-11}{VXoHusQ9SuCFuYvGx77IcA}{blYzn_I0Qu2qLsc2YnR9qw}{172.17.0.2}{172.17.0.2:9300}{cdfhilmrstw}{ml.machine_memory=67381354496, ml.max_open_jobs=512, xpack.installed=true, ml.max_jvm_size=33285996544, transform.node=true}] but followup connection failed"
- docker部署时,需要指定
network.publish_host: xxx
,xxx
为当前主机IP地址,否则会造成无法找到节点ip
的问题
- docker部署时,需要指定