一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
修改系统配置
- 修改limit.conf配置:/etc/security/limits.conf
新增或修改成
soft nofile 65536 # 大于等于65536
hard nofile 65536 # 大于等于65536
soft nproc 2048 # 大于等于2048
hard nproc 4096 # 大于等于4096
soft memlock unlimited
hard memlock unlimited
复制代码
复制代码
- 修改sysctl.conf配置:/etc/sysctl.conf
## 新增或修改成,运行sysctl -p 生效
vm.max_map_count=262144 # 大于等于262144
复制代码
复制代码
- 修改90-nproc.conf配置:/etc/security/limits.d/90-nproc.conf
## 新增或修改成
* soft nproc 2048 # 大于等于2048
复制代码
复制代码
运行Elasticsearch
拉取镜像:docker pull elasticsearch:5.6.5
运行启动命令:
docker run --name=es-1 --net=host --restart on-failure:10 --log-opt max-size=128m --ulimit nofile=65536:65536 --ulimit nproc=4096:4096 --ulimit memlock=-1:-1 -m 9000m \
-v "$PWD/elasticsearch/esdata":/usr/share/elasticsearch/data \
-v "$PWD/elasticsearch/logs":/usr/share/elasticsearch/logs \
-e ES_JAVA_OPTS="-Xms4000m -Xmx4000m -Xss16m" \
-d elasticsearch:5.6.5 \
-Ediscovery.zen.minimum_master_nodes=1 \
-Ediscovery.zen.ping.unicast.hosts=ip:9300,ip:9300 \
-Ecluster.name=es-log \ ## 集群的名称
-Enetwork.host=内网IP
复制代码
复制代码
注意:这里启动时,限制docker容器可以使用的内存为800m,jvm堆大小,集群最小主节点数,集群节点IP,集群名称,这些都需要根据实际情况设置,而且非常关键。
节点名称,可以不额外设置,默认是当前宿主机的机器名
验证Elasticsearch集群
- 在任意一台集群服务器上运行如下命令
curl 内网IP:9200/_cat/nodes?v
返回当前集群中所有节点信息说明集群已经搭建完成
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
ip1 32 93 1 0.66 0.48 0.45 mdi * node2
ip2 68 92 3 0.72 0.65 0.61 mdi - node1
ip3 35 92 1 0.77 0.72 0.53 mdi - node3
复制代码
复制代码
- 检查集群的健康状态
curl -XGET 内网IP:9200/_cluster/health?pretty
返回类似关键信息
{
"cluster_name" : "es-log",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 10,
"active_shards" : 20,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
复制代码
复制代码
响应信息中最重要的一块就是 status 字段。状态可能是下列三个值之一:
- green 所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
- yellow 所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。
- red 至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
集群创建模板
当集群启动成功后,在任意一台Elasticsearch节点上运行如下命令创建模板。
curl -XPUT '内网IP:9200/_template/test_template' -H 'Content-Type: application/json' -d'
{
"template": "ctu-*",
"settings": {
"index": {
"refresh_interval": "120s",
"number_of_shards": "5",
"max_result_window": "50000",
"number_of_replicas": "1"
}
},
"mappings": {
"engineLog": {
"dynamic_templates": [{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}]
}
},
"aliases": {
"es-log": {}
}
}
'
复制代码
复制代码
template中的max_result_window
表示在es查询时能返回的最大条目, 设置时需注意实际内存情况不可过大
查看某个index 的setting信息, 执行curl ip:9200/indexName/_settings?pretty
可能碰到的问题
- 修改limit.conf参数后, 可以通过
ulimit -a
检查, 如果未生效, 打开新的会话窗口, 或者重启sshd
服务(service sshd restart
) - 修改limit.conf并生效后, 启动elasticsearch容器仍然失败, 容器日志显示
max file descriptors[4096] for elasticsearch process is to low , increase to at least[65536]
, 尝试重启docker服务 - 如果上述两种方法均不生效, 可以尝试在启动elasticsearch容器时添加参数
--ulimit nofile=65536:65536 --ulimit nproc=2048:4096 --ulimit memlock=unlimited:unlimited