Elasticsearch-104-生产集群必须配置的一些重要参数

es的默认参数

es的默认参数是非常好的,适合绝大多数的情况,尤其是一些性能相关的配置.因此刚开始部署一个生产环境下的es集群时,几乎所有的配置参数都可以用默认的设置.有很多的生产环境场景下,都是因为es集群管理人员自己去调整es的某些配置,结果导致集群出现了严重的故障.

比如mysql或者oracle这种关系型数据库,也许是需要非常重的调优,但是es是真的不用.如果我们现在面临着一些es的性能问题,通常建议的解决方案是更好的进行数据结构的布局,或者增加更多的节点和机器资源.在es的性能调优中,真的很少有那种magic knobs,就是某个参数一调节,直接性能提升上百倍.即使有这种参数,es官方也早就将其设置为默认的最佳值了.

但是在生产环境中,还是有极少数跟公司和业务相关的配置是需要我们修改的.这些设置都是具体的公司和业务相关联的,是没法预先给予最好的默认配置的.

集群名称和节点名称的配置

默认情况下,es会启动一个名称为elasticsearch的集群.通常建议一定要将自己的集群名称重新进行命名,主要是避免公司网络环境中,也许某个开发人员的开发机会无意中加入你的集群.

此外,每个node启动的时候,es也会分配一个随机的名称.这个也不适合在生产环境中,因为这会导致我们没法记住每台机器.而且每次重启节点都会随机分配,就导致node名称每次重启都会变化.因此通常我们在生产环境中是需要给每个node都分配一个名称的.

这两个名称的配置在上文中已经配置过了

文件路径配置

主要是数据文件的路径,日志路径和插件路径,这里的配置是很重要的
默认情况下,es会将plugin,log,还有data,config,这些文件都放在es 的安装目录中,这有一个问题,就是在进行es升级的时候,可能会导致这些目录被覆盖掉.导致我们丢失之前安装好的plugin,已有的log,还有已有的数据,以及配置好的配置文件.

所以一般建议在生产环境中,必须将这些重要的文件路径,都重新设置一下,放在es安装目录之外的路径

  • path.data用于设置数据文件的目录
  • path.logs用于设置日志文件的目录
  • path.plugins用于设置插件存放的目录

path.data可以指定多个目录,用逗号分隔即可(multiple data path).如果多个目录在不同的磁盘上,那么这就是一个最简单的RAID 0的方式,将数据在本地进行条带化存储了,可以提升整体的磁盘读写性能.es会自动将数据在多个磁盘的多个目录中条带化存储数据.

在RAID 0的存储级别下,每个磁盘上会存储一部分数据,但是如果一个磁盘故障了,那么可能导致这台机器上的部分数据就丢失了.如果我们的es是有replica的,那么在其他机器上还是会有一份副本的.如果data file指定了多个目录,为了尽量减少数据丢失的风险,es会将某个shard的数据都分配到一个磁盘上去.这就意味着每个shard都仅仅会放在一个磁盘上.es不会将一个shard的数据条带化存储到多个磁盘上去,因为如果一个磁盘丢失了,就会导致整个shard数据丢失.

虽然multiple data path是一个很有用的功能,但是es毕竟不是一个专门的RAID软件.如果我们要对RAID存储策略进行更多的配置,提高存储的健壮性以及灵活性,还是要用专门的RAID软件来进行机器的磁盘数据存储,而不是用multiple data path策略.

综上所述,multiple data path功能在实际的生产环境中,其实是较少使用的.

然后我们来实际配置一下,先创建以下几个目录

1
2
3
4
mkdir -p /var/log/elasticsearch
mkdir -p /var/data/elasticsearch
mkdir -p /var/plugin/elasticsearch
mkdir -p /etc/elasticsearch

一般情况下,建议就存放在这几个目录中

目录创建好了之后,修改elasticsearch.yml里面的配置,将以下的配置copy进去就ok

1
2
3
path.logs: /var/log/elasticsearch
path.data: /var/data/elasticsearch
path.plugins: /var/plugin/elasticsearch

日志配置

es使用log4j2来记录日志,log4j2可以通过log4j2.properties文件来进行配置.比如下面的这份配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置了appender类型是RollingFile
appender.rolling.type = RollingFile

appender.rolling.name = rolling

# 配置了日志路径是/var/log/elasticsearch/production.log
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log

appender.rolling.policies.type = Policies
# 配置了用基于时间的roll策略
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
# 这个设置了每天一份日志文件
appender.rolling.policies.time.interval = 1
# 这个设置了根据自然天来划分文件,而不是24小时
appender.rolling.policies.time.modulate = true

我们可以在config/log4j2.properties中加入以下的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置了默认的DefaultRolloverStrategy
appender.rolling.strategy.type = DefaultRolloverStrategy
# 配置了Delete action,在rollover之后,就会删除文件
appender.rolling.strategy.action.type = Delete
# 配置了es log的基础路径
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
# 配置了rollover发生的条件,是基于IfLastModified
appender.rolling.strategy.action.condition.type = IfLastModified
# 配置了保留的天数,这里是7天
appender.rolling.strategy.action.condition.age = 7D
# 配置了删除匹配7天前的文件
appender.rolling.strategy.action.PathConditions.type = IfFileName
# 配置了一个删除文件的格式,这样就只是删除过期日志文件,但是不要删除慢查询日志
appender.rolling.strategy.action.PathConditions.glob = ${sys:es.logs.cluster_name}-*

移动配置文件到自定义的目录

日志文件以及配置文件修改好之后,把config目录下的所有文件都复制到之前创建好的 /etc/elasticsearch目录里面

1
2
3
cp elasticsearch.yml /etc/elasticsearch/
cp jvm.options /etc/elasticsearch/
cp log4j2.properties /etc/elasticsearch/