本篇主要聊聊ES生产环境的一些规划,以及ES的集群搭建。
注意:RAID0 可以提高性能。RAID 是可选的,因为 Elastic 默认为 N + 1 分片复制策略。
为了追求硬件级别的高可用性,可以接受标准性能的 RAID 配置(例如 RA1/10/50 等)。不建议,副本机制已经保证了高可用
存储有关集群索引、分片、段和 fielddata 数据。
建议:可用 RAM 的 50%,最多最大 30GB RAM,以避免垃圾回收。
官方文档最大指 32 GB:
https://www.elastic.co/guide/en/elasticsearch/guide/master/heap-sizing.html
Elasticsearch 将使用剩余的可用内存来缓存数据(Lucene 使用), 通过避免在全文检索、文档聚合和排序环节的磁盘读取,极大地提高了性能。
大多数 Elasticsearch 部署往往对 CPU 要求不高。因此,相对其它资源,具体配置多少个(CPU)不是那么关键。你应该选择具有多个内核的现代处理器,常见的集群使用两到八个核的机器。
如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。
快速可靠的网络显然对分布式系统的性能是很重要的。 低延时能帮助确保节点间能容易的通讯,大带宽能帮助分片移动和恢复。现代数据中心网络(1 GbE, 10 GbE)对绝大多数集群都是足够的。
即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。
Elasticsearch 假定所有节点都是平等的—并不会因为有一半的节点在150ms 外的另一数据中心而有所不同。更大的延时会加重分布式系统中的问题而且使得调试和排错更困难。
和 NAS 的争论类似,每个人都声称他们的数据中心间的线路都是健壮和低延时的。这是真的—直到它不是时(网络失败终究是会发生的,你可以相信它)。 从我们的经验来看,处理跨数据中心集群的麻烦事是根本不值得的。
容量规划——预估集群中每个节点的分片数、内存及存储资源。
吞吐量规划——以预期的延迟和吞吐量估算处理预期操作所需的内存,计算和网络资源。
第一,问自己几个问题:
第二,预留存储以备错误。(Elastic 官方推荐经验值)
第三,容量预估计算方法如下:
Tips:腾讯云 在 2019 4 月的 meetup 分享中建议:磁盘容量大小 = 原始数据大小 * 3.38。
第一,问自己几个问题:
第二,经验值(Elastic 官方推荐)
Tips:
第三,分片预估方法如下:
搜索用例场景除了考虑搜索容量外,还要考虑如下目标:
这些目标可能需要更多的内存和计算资源。
第一:问自己几个问题
第二:方法论 与其确定资源将如何影响搜索速度,不如通过在计划的固定硬件上进行测量
,可以将搜索速度作为一个常数,
然后确定集群中要处理峰值搜索吞吐量需要多少个核。
最终目标是防止线程池排队的增长速度超过了 CPU 的处理能力。
如果计算资源不足,搜索请求可能会被拒绝掉。
第三:吞吐量预估方法
Elasticsearch 可以使用分片分配感知(shard allocation awareness)在特定硬件上分配分片。
索引密集型业务场景通常使用它在热节点、暖节点和冷(Frozen)节点上存储索引,
然后根据业务需要进行数据迁移(热节点->暖节点->冷节点),以完成数据的删除和存档需要。
这是优化集群性能的最经济方法之一,在容量规划期间,先确定每一类节点的数据规模,然后进行组合。
冷热集群架构推荐:
节点类型 |
存储目标 |
建议磁盘类型 |
内存/磁盘比率 |
热节点 |
搜索优化 |
SSD DAS / SAN(> 200Gb / s) |
1:30 |
暖节点 |
存储优化 |
HDD DAS / SAN(〜100Gb / s) |
1:160 |
冷节点 |
归档优化 |
最便宜的 DAS / SAN(<100Gb / s) |
1:1000+ |
Elasticsearch 节点执行一个或多个角色。通常,当集群规模大时,每个节点分配一个具体角色很有意义。
您可以针对每个角色优化硬件,并防止节点争夺资源。
角色 |
描述 |
存储 |
内存 |
计算 |
网络 |
数据节点 |
存储和检索数据 |
极高 |
高 |
高 |
中 |
主节点 |
管理集群状态 |
低 |
低 |
低 |
低 |
Ingest 节点 |
转换输入数据 |
低 |
中 |
高 |
中 |
机器学习节点 |
机器学习 |
低 |
极高 |
极高 |
中 |
协调节点 |
请求转发和合并检索结果 |
低 |
中 |
中 |
中 |
cd /docker/elasticsearch
for number in `seq 1 3`; do \
mkdir -p ./es${number}/logs \
&& mkdir -p ./es${number}/data; \
done
#es的用户id为1000,授权给所有人
sudo chmod 777 es* -R
#拉取镜像
docker pull elasticsearch:7.7.0
#拉取镜像
docker pull kibana:7.7.0
主要是两步,1:创建配置文件参考官网提供,2:运行实例获取证书
network.host: 0.0.0.0
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.type: PKCS12
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.type: PKCS12
xpack.security.audit.enabled: true
#启动一个实例
docker run -dit --name=es elasticsearch:7.7.0 /bin/bash
#进入容器
docker exec -it es /bin/bash
#生成ca: elastic-stack-ca.p12
./bin/elasticsearch-certutil ca
#生成cert: elastic-certificates.p12
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
#拷贝证书到宿主机,后面使用
cd /docker/elasticsearch
docker cp es:/usr/share/elasticsearch/elastic-certificates.p12 .
es提供了生成证书的工具elasticsearch-certutil
,我们可以在docker实例中生成它,然后复制出来,后面统一使用
server.name: kibana
server.host: "0"
# elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: kibana
#这里的密码是我们启动集群初始化的密码
elasticsearch.password: hNNuuKBnE1r7xqtIN79B
i18n.locale: zh-CN
version: '3'
services:
es01:
image: elasticsearch:7.7.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es01/data:/usr/share/elasticsearch/data
- ./es01/logs:/usr/share/elasticsearch/logs
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12
ports:
- 9200:9200
restart: always
networks:
my-net:
ipv4_address: 172.30.0.2
es02:
image: elasticsearch:7.7.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es02/data:/usr/share/elasticsearch/data
- ./es02/logs:/usr/share/elasticsearch/logs
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12
ports:
- 9201:9200
restart: always
networks:
my-net:
ipv4_address: 172.30.0.3
es03:
image: elasticsearch:7.7.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es03/data:/usr/share/elasticsearch/data
- ./es03/logs:/usr/share/elasticsearch/logs
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12
ports:
- 9202:9200
restart: always
networks:
my-net:
ipv4_address: 172.30.0.4
kib01:
depends_on:
- es01
image: kibana:7.7.0
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://172.30.0.2:9200
ELASTICSEARCH_HOSTS: http://172.30.0.2:9200
volumes:
- ./kibana.yml:/usr/share/kibana/config/kibana.yml
restart: always
networks:
my-net:
ipv4_address: 172.30.0.5
networks:
my-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.30.0.1/24
# 编排文件
docker-compose up
# 进入容器设置密码
docker exec -it es01 /bin/bash
#初始化密码,这个需要手工设置比较麻烦
./bin/elasticsearch-setup-passwords interactive
# 查看帮助提示
./bin/elasticsearch-setup-passwords -h
#根据提示我们使用自动生成密码策略
./bin/elasticsearch-setup-passwords auto
#生成密码
Changed password for user apm_system
PASSWORD apm_system = XlCcRjHuAz04wIiPsqZJ
Changed password for user kibana
PASSWORD kibana = hNNuuKBnE1r7xqtIN79B
Changed password for user logstash_system
PASSWORD logstash_system = 16fgx7D0gpdQEtizmSYk
Changed password for user beats_system
PASSWORD beats_system = AIHin0qm9hbQGv0yfNeg
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = dLnsltnaCHoMyZS4jOGo
Changed password for user elastic
PASSWORD elastic = csb94dDWqa22mg7m1qEK
# 批量暂停容器,并移除容器
docker ps -a | grep kibana | awk '{print $1 }' | xargs docker container stop
docker ps -a | grep kibana | awk '{print $1 }' | xargs docker container rm
# 批量暂停容器,并移除容器
docker ps -a | grep elasticsearch | awk '{print $1 }' | xargs docker container stop
docker ps -a | grep elasticsearch | awk '{print $1 }' | xargs docker container rm
# 添加路由网卡
sudo route -n add -net 172.30.0.1/24 -netmask 255.255.254.0 192.168.64.200
#进入机器
docker exec -it es01 /bin/bash
#创建一个临时的超级用户
./bin/elasticsearch-users useradd xxx -r superuser
#用这个用户去修改elastic的密码
curl -XPUT -u xxx[这个是用户名]:xxx[密码] http://localhost:9200/_xpack/security/user/elastic/_password -H "Content-Type: application/json" -d '
{
"password": "q5f2qNfUJQyvZPIz57MZ"
}'
可以进入机器去修改
使用elastic用户登录