目录
配置
环境变量
系统配置
文件描述符
虚拟内存
内存设置
Elasticsearch配置
路径
集群名称
节点名称
配置风格
索引配置
日志
elasticsearch可以以下面这种方式启动:
bin/elasticsearch
在linux系统,这个命令将在前台启动进程。
我们也可以在后台运行,以守护进程的方式,加上-d参数
bin/elasticsearch -d
在启动的时候可以指定es 进程pid写入的文件,这样可以方便的kill进程
bin/elasticsearch -d -p pid pid是文件
kill `cat pid` 杀死指定文件中pid的 es进程
Elasticsearch用内建的JAVA_OPTS传递给启动的JVM。最重要的设置是控制进程最大内存-Xmx和控制进程最小分配内存的-Xms(通常分配给进程越多内存越好)
大多数的时候,最好保持默认的JAVA_OPTS不变,使用ES_JAVA_OPTS环境变量去设置、更改JVM的设置或者参数。
ES_HEAP_SIZE环境变量允许设置分配给elasticsearch进程的堆内存大小。它将为min 和max 分配相同的值,虽然min和max可以被明确的分配的(不建议)通过设置ES_MIN_MEM(默认256m)和ES_MAX_MEM(默认1g)。
推荐设置最小和最大的内存为相同的值,开启mlockall。
确保增加所在机器打开的文件描述符数量(或者针对运行es的用户)。推荐设置32k甚至64k。
为了测试进程可以打开多少文件,启动的时候设置-Des.max-open-files为true。这将打印这个进程可以打开的文件数量。
你也可以通过Nodes info api获取到每个节点的max_file_descriptors,下面是例子
curl localhost:9200/_nodes/stats/process?pretty
响应结果
{
"cluster_name" : "elasticsearch",
"nodes" : {
"GAnTNSqBT8qBp6tL5WH6XQ" : {
"timestamp" : 1542425189988,
"name" : "Korvus",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : [ "127.0.0.1:9300", "NONE" ],
"process" : {
"timestamp" : 1542425189988,
"open_file_descriptors" : 651,
"max_file_descriptors" : 1048576,
"cpu" : {
"percent" : 0,
"total_in_millis" : 1218430
},
"mem" : {
"total_virtual_in_bytes" : 21505761280
}
}
}
}
}
Elasticsearch默认使用hybrid mmapfs / niofs
目录去存储indices。默认操作系统对mmap计数的限制可能太低,这将导致内存溢出。在Linux操作系统,你可以用root的身份执行以下命令去增加这个限制:
sysctl -w vm.max_map_count=262144
如果想永久的设置这个值,去更新/etc/sysctl.conf文件里vm.max_map_count配置。
大多数操作系统都试图使用尽可能多的内存进行文件系统缓存,并急切地交换未使用的应用程序内存,这就可能倒是es进程被交换出去。交换对性能以及节点的稳定性非常不利,所以无论如何都要避免。
有三个选项:
最简单的选项就是完全禁用交换。通常情况下,es是唯一运行在服务器上的服务,es的内存使用是被环境变量ES_HEAP_SIZE控制的。没必要开启交换。
在Linux操作系统上,你可以临时禁用交换通过执行命令sudo swapoff -a。如果想永久禁用交换,你需要编辑文件/etc/fstab,然后注释掉所有带关键字swap的行。
在Windows操作系统,你可以禁用paging file通过 System Properties → Advanced → Performance → Advanced → Virtual memory
.
swappiness
第二个选项是保证 sysctl value vm.swappiness 被设置成0。这减少了内核交换的趋势,在正常情况下不应该导致交换,同时仍然允许整个系统在紧急情况下交换。
NOTE:从内核版本3.5-rc1和更高版本开始,0的swappiness将导致OOM以至于会杀死进程,而不是允许交换。您需要将swappiness设置为1,以便在紧急情况下仍然可以进行交换。
mlockall
第三个参数是在Linux/Unix 使用mlockall,或者在windows系统使用 VirtualLock,试图将进程地址空间锁定到RAM中,以防止任何Elasticsearch内存被交换出去。这个是可以做到的,通过在config/elasticsearch.yml文件中增加以下行:
bootstrap.mlockall: true
Elasticsearch启动后,你可以核实这个配置是否配置成功通过核实以下命令的输出中的mlockall的值:
curl http://localhost:9200/_nodes/process?pretty
如果你看到mlockall是false,那么意味着mlockall请求失败。最可能的原因,在Linux/Unix 系统,是运行elasticsearch的用户没有权限锁定内存。这可以通过在启动Elasticsearch之前以root身份运行ulimit -l unlimited来授权。
mlockall失败的另一个可能原因是临时目录(通过是/tmp)使用了noexec选项进行了挂载。这个可以通过指定一个新的临时目录来解决,通过以下方式启动es
./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir
warning:mlockall可能会导致JVM或shell会话退出,如果它试图分配超过可用内存的内存!
可以在ES_HOME/config文件夹下找到elasticsearch配置文件。这个文件夹有两个文件,elasticsearch.yml配置Elasticsearch不同模块,logging.yml配置Elasticsearch日志记录。
配置格式是YAML。下面是一个更改地址的例子,所有基于网络的模块将用于绑定和发布:
network :
host : 10.0.0.4
在生产环境中,您几乎肯定希望更改数据和日志文件的路径:
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
另外,不要忘记给您的生产集群一个名称,它用于发现和自动加入其他节点:
cluster:
name:
确保不要在不同的环境中重用相同的集群名称,否则可能会导致节点加入错误的集群。例如,您可以使用logging-dev、logging-stage和logging-prod作为开发、staging和生产集群。
您可能还想将每个节点的默认节点名更改为类似于显示主机名的内容。默认情况下,当您的节点启动时,Elasticsearch会从大约3000个名字的列表中随机选择一个Marvel角色的名字:
node:
name:
机器的主机名保存在环境变量HOSTNAME中。如果在你的机器上你的集群只有一个es 节点,你可以设置节点名字为主机名通过使用${...}语法
node:
name: ${HOSTNAME}
在内部,所有配置都折叠成命名空间的格式。例如,上面的会折叠上node.name.这就意味着es很容易支持其他的配置格式,比如JSON。如果json是配置文件格式,仅仅需要重命名elasticsearch.yml为elasticsearch.json,配置格式如下
{
"network" : {
"host" : "10.0.0.4"
}
}
这也意味着在外部很简单的添加配置通过使用ES_JAVA_OPT或者作为参数传递给es 命令,比如:
elasticsearch -Des.network.host=10.0.0.4
另一个选项是去设置es.default. 前缀 而不是es.前缀,这就意味着如果没有明确的配置相关选项,将会使用默认配置。
另一个配置是${...},这将被解析为相关的环境设置,比如
{
"network" : {
"host" : "${ES_NET_HOST}"
}
}
此外,你可能不想把配置存储在配置文件中,你可以使用值${prompt.text}
或者 ${prompt.secret},在前台启动elasticsearch。
${prompt.secret}输入的值不会显示在终端,${prompt.text}
允许你看到输入的值,例如
node: name: ${prompt.text}
在执行es命令的时候,将提示你输入真实的值,就像下面这样
Enter value for [node.name]:
在集群中创建的索引可以提供它们自己的设置,例如,下面创建的索引刷新间隔为5秒,而不是默认的刷新间隔(格式可以是YAML或JSON):
$ curl -XPUT http://localhost:9200/kimchy/ -d \ ' index: refresh_interval: 5s '
索引级别设置也可以在节点级别设置,例如,在elasticsearch,yml文件,可设置如下:
index : refresh_interval: 5s
这意味着,在使用上述配置开始的特定节点上创建的每个索引都将使用5秒的刷新间隔,除非索引显式地设置它。
换句话说,任何索引级别设置都会覆盖节点配置中设置的内容。当然,以上也可以设置为“折叠”设置,例如:
elasticsearch -Des.index.refresh_interval=5s