Elasticsearch 5.6.5 docker部署

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

修改系统配置

  1. 修改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
复制代码
复制代码
  1. 修改sysctl.conf配置:/etc/sysctl.conf
   ## 新增或修改成,运行sysctl -p 生效
   vm.max_map_count=262144 # 大于等于262144
复制代码
复制代码
  1. 修改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集群

  1. 在任意一台集群服务器上运行如下命令 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
复制代码
复制代码
  1. 检查集群的健康状态 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


可能碰到的问题

  1. 修改limit.conf参数后, 可以通过ulimit -a检查, 如果未生效, 打开新的会话窗口, 或者重启sshd服务(service sshd restart)
  2. 修改limit.conf并生效后, 启动elasticsearch容器仍然失败, 容器日志显示max file descriptors[4096] for elasticsearch process is to low , increase to at least[65536], 尝试重启docker服务
  3. 如果上述两种方法均不生效, 可以尝试在启动elasticsearch容器时添加参数 --ulimit nofile=65536:65536 --ulimit nproc=2048:4096 --ulimit memlock=unlimited:unlimited

猜你喜欢

转载自juejin.im/post/7084964583013613581