1. Elasticsearch 配置问题
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml
和logging.yml
,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。
这些文件位于config目录,目录的默认位置是 $ES_HOME/config/
。通过Debian和RPM安装的配置文件的目录是 /etc/elasticsearch/
。
可通过以下的命令修改配置文件的位置:
./bin/elasticsearch -Epath.conf=/path/to/my/config/
下面主要讲解下elasticsearch.yml这个文件中可配置的东西。
cluster.name:elasticsearch
# 配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,
# 如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
node.name:"node-1"
# 节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
node.master:true
# 指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
node.data:true
# 指定该节点是否存储索引数据,默认为true。
index.number_of_shards:5
# 设置默认索引分片个数,默认为5片。
index.number_of_replicas:1
# 设置默认索引副本个数,默认为1个副本。
path.conf:/path/to/conf
# 设置配置文件的存储路径,默认是es根目录下的config文件夹。
path.data:/path/to/data
# 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
# 所有的路径都会被用来存储数据(但所有属于同一个分片的文件,都会全部保存到同一个数据路径)
path.data:/path/to/data1,/path/to/data2
path.work:/path/to/work
# 设置临时文件的存储路径,默认是es根目录下的work文件夹。
path.logs:/path/to/logs
# 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins:/path/to/plugins
# 设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.mlockall:true
# 设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,
# 可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。
# 同时也要允许elasticsearch的进程可以锁住内存,Linux下可以通过`ulimit-l unlimited`命令。
network.bind_host:192.168.0.1
# 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
network.publish_host:192.168.0.1
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.host:192.168.0.1
# 这个参数是用来同时设置bind_host和publish_host上面两个参数。
transport.tcp.port:9300
# 设置节点间交互的tcp端口,默认是9300。
transport.tcp.compress:true
# 设置是否压缩tcp传输时的数据,默认为false,不压缩。
http.port:9200
# 设置对外服务的http端口,默认为9200。
http.max_content_length:100mb
# 设置内容的最大容量,默认100mb
http.enabled:false
# 是否使用http协议对外提供服务,默认为true,开启。
gateway.type:local
# gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,
# Hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。
gateway.recover_after_nodes:1
# 设置集群中N个节点启动时进行数据恢复,默认为1。
gateway.recover_after_time:5m
# 设置初始化数据恢复进程的超时时间,默认是5分钟。
gateway.expected_nodes:2
# 设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
cluster.routing.allocation.node_initial_primaries_recoveries:4
# 初始化数据恢复时,并发恢复线程的个数,默认为4。
cluster.routing.allocation.node_concurrent_recoveries:2
# 添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
indices.recovery.max_size_per_sec:0
# 设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
indices.recovery.concurrent_streams:5
# 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
discovery.zen.minimum_master_nodes:1
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.ping.timeout:3s
# 设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
discovery.zen.ping.multicast.enabled:false
# 设置是否打开多播发现节点,默认是true。
discovery.zen.ping.unicast.hosts:["host1", "host2:port","host3[portX-portY]"]
# 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
-
配置文件的格式(Config file format)
配置文件使用的格式是
YAML
。下面例子修改了数据和日志目录:path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch
配置也可以使用平面化的方式:
path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch
-
环境变量替换(Environment variable subsitution)
在配置文件中,可以通过
${...}
符号引用环境变量,例如:node.name: ${HOSTNAME} network.host: ${ES_NETWORK_HOST}
-
提示输入配置(Prompting for settings)
如果你不想把配置写到配置文件中,你可以在配置的值中输入
${prompt.text}
或${prompt.secret}
符号,并且以前景的方式运行elasticsearch。${prompt.secret}
不会把你输入的内容显示到终端上(相当于输入密码时的***功能吧),${prompt.text}
可以让你在终端上看到你输入的内容,例如:node: name: ${prompt.text}
当启动elasticsearch的时候,终端会提示你输入配置值:
Enter value for [node.name]:
注意,如果elasticsearch的配置文件使用
${prompt.text}
或${prompt.secret}
作为配置值并且以后台的形式运行,那么它将启动失败。 -
设置默认配置(Setting default settings)
可以在命令行中使用default.前缀指定新的默认值。当配置文件没有指定该值的时候就会使用默认值。
例如,如果elasticsearch用以下命令运行:
./bin/elasticsearch -Edefault.node.name=My_Node
如果没有在命令行重写
es.node.name
或在配置文件中重写node.name
,node.name
的值将会是My_Node
。 -
日志配置(Logging configuration)
elasticsearch 使用
log4j2
来记录日志。日志的配置文件是log4j2.properties
。elastisearch 暴露了${sys:es.logs}
属性,Log4j2
可以在配置文件引用它动态指定日志文件的位置。在运行的时候,${sys:es.logs}
将会被替换成以当前集群名称作为前缀的路径。例如,如果你的日志目录
path.log
是/var/log/elasticsearch
并且 你的集群名字是prodution
,那么${sys:es.logs}
将会被替换成/var/log/elasticsearch/production
。appender.rolling.type = RollingFile【1】 appender.rolling.name = rolling appender.rolling.fileName = ${sys:es.logs}.log 【2】 appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log【3】 appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 【4】 appender.rolling.policies.time.interval = 1 【5】 appender.rolling.policies.time.modulate = true 【6】
- 使用
RollingFile
文本追加器来保存日志 - 把日志写到
/var/log/elasticsearch/production.log
- 设置日志命名规则
/var/log/elasticsearch/production-yyyy-MM-dd.log
- 使用基于时间的轮换策略
- 每天轮换一次日志文件
- 日志轮换是以天作为分界(而不是相隔24小时)
如果在
appender.rolling.filePattern
中追加.gz
或者.zip
后缀,那么当日志轮换的时候,旧的日志将会被压缩处理。可以在elasticsearch的
config
的不同子目录下使用多个名字是log4j2.properties
的配置文件(加载配置文件的时候会进行合并处理)。这样做可以让插件自定义日志。日志部分包含java包和相应的日志级别。appender
部分包含日志的储存位置。在Log4j documentation
可以找到关于如何自定义日志和其他appenders
的相关信息。 - 使用
-
弃用日志(Deprecation logging)
除了常规的日志,elasticsearch允许你记录弃用的特性。也就是说由于elasticsearch的升级,有些旧的特性可能会被弃用,当你的配置文件使用到这些弃用的特性时,就会写日志到弃用日志文件,好让你了解elasticsearch做了哪些改动。 这让你更早地确定你将来是否需要迁移某些功能(因为过期的特性不会马上被移除,但未来还是会移除,你可以在未移除之前,使用新的方案代替被移除的特性)。默认地,弃用日志记录对 WARN 级别开启,在这个级别的所有弃用日志消息都会被输出到弃用日志中。
logger.deprecation.level = warn
使用这个配置将会创建一个轮转策略的弃用日志文件到你的日志目录。你需要定期检查这个文件,特别是在准备更新一个大版本的时候。
默认使用轮换日志保存策略,日志大于1GB后被压缩,最多创建5个日志文件(4个轮换日志,一个在用的日志)。
你可以通过以下命令禁用弃用日志:
logger.deprecation.level = error
-
Elasticsearch 常用配置
path.data and path.logs
cluster.name
node.name
bootstrap.memory_lock
network.host
discovery.zen.ping.unicast.hosts
discovery.zen.minimum_master_nodes
-
path.data and path.logs
如果您正在使用
.zip
或.tar.gz
文件归档,data
和logs
目录在$ES_HOME
下。如果这些重要文件夹保留在默认位置,则Elasticsearch升级到新版本时,很有可能被删除。在生产中使用,肯定要更改数据和日志文件夹的位置:
path: logs: /var/log/elasticsearch data: /var/data/elasticsearch
RPM和Debian的安装包已经使用了自定义的data和logs路径。
path.data
选项可以同时指定多个路径,所有的路径都会被用来存储数据(但所有属于同一个分片的文件,都会全部保存到同一个数据路径)path.data:/path/to/data1,/path/to/data2
-
cluster.name
某个节点只有和集群下的其他节点共享它的
cluster.name
才能加入一个集群。默认是elasticsearch,但是应该修改为更恰当的,用于描述集群目的的名称。cluster.name: logging-prod
-
node.name
默认情况下,Elasticsearch 将使用随机生成的uuid的前7个字符作为节点id,请注意,节点ID是持久化的,并且在节点重新启动时不会更改,因此默认节点名称也不会更改。
推荐为节点配置更有意义的名称。
node.name: prod-data-2
也可以使用服务器的 HOSTNAME 作为节点的名称。
node.name: ${HOSTNAME}
-
bootstrap.memory_lock
由于当jvm开始swapping时es的效率会降低,所以要保证它不swap,这对节点健康极其重要。实现这一目标的一种方法是将
bootstrap.memory_lock
设置为true
。要使此设置有效,首先需要配置其他系统设置。有关如何正确设置内存锁定的更多详细信息,请参阅启用
bootstrap.memory_lock
。 -
network.host
默认情况下,Elasticsearch 仅仅绑定回环地址,比如
127.0.0.1
和[::1]
。这足以在服务器上运行单个开发节点。事实上,一台机器上可以启动多个节点。这可对于测试Elasticsearch集群的能力很有用,但不推荐用于生产。
为了与其他服务器上的节点进行通信并形成集群,你的节点将需要绑定到非环回地址。虽然这里有很多网络相关的配置,但通常只需要配置一下
network.host
network.host: 192.168.1.10
network.host 设置一些特殊值也是可以的,比如
_local_
,_site_
,_global_
,ip4
,ip6
。更多详情请参考 “Special values fornetwork.host
”。一旦自定义设置了 network.host ,Elasticsearch 会假定你正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级到异常。有关详细信息,请参阅“Development mode vs production mode”。
-
discovery.zen.ping.unicast.hosts
开箱即用,没有任何网络配置情况下,Elasticsearch将绑定到可用的回环地址,并会扫描端口9300至9305以尝试连接到同一服务器上运行的其他节点。这提供了一个自动集群体验,而无需执行任何配置。
如果想和其他服务器的节点形成一个集群,你必须提供集群中其它节点的列表。可以通过以下方式指定:
discovery.zen.ping.unicast.hosts:["host1", "host2:port","host3[portX-portY]"]
如果没有指定端口,将默认为
transport.profiles.default.port
并回退transport.tcp.port
。如果输入的是主机名,被解析成多个地址,将会尝试连接所有地址。
-
discovery.zen.minimum_master_nodes
为了防止数据丢失,
discovery.zen.minimum_master_nodes
配置至关重要, 以便每个候选主节点知道为了形成集群而必须可见的最少数量的候选主节点。没有这种设置,遇到网络故障的群集有可能将群集分成两个独立的群集(脑裂), 这将导致数据丢失。更详细的解释在“Avoiding split brain with
minimum_master_nodes
” 中提供。为了避免脑裂,候选主节点的数量应该设置为:
(master_eligible_nodes / 2) + 1
官方配置文档请点击
elasticsearch 检查配置升级更详细介绍请参阅
2. Elasticsearch ik 分词安装
在 plugins 下建立目录 ik ,然后下载 ik 分词器的 zip 包,直接解压到 ./ik 路径里面就行
3. Elasticsearch root 用户问题
elasticsearch 启动时会出现提示不能以管理员 root 身份启动
# 建立用户组 elsearch
groupadd elsearch
# 建立新的用户 elsearch
useradd elsearch -g elsearch -p elsearch
# 将目录 elasticsearch 授权给 elsearch
chown -R elsearch:elsearch elasticsearch
# 切换用户 elsearch 即可正常启动 elasticsearch
su elsearch
# elasticsearch 后台启动
./bin/elasticsearch -d