Elasticsearch 安装部署 参数调优

环境说明

系统以及java版本

系统版本

JAVA 版本

CentOS 7.6

1.7 es自带jdk

Elasticsearch node 配置

三台服务器都添加host 文件

IP

Elasticsearch node

10.3.65.14

node-14

10.3.65.18

node-18

10.3.65.37

node-37

安装es7.7

rpm安装

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-x86_64.rpm
yum localinstall -y elasticsearch-7.17.0-x86_64.rpm

添加hosts:

vim /etc/hosts
10.3.65.37 node-37
10.3.65.18 node-18
10.3.65.14 node-14

#rpm安装已经自动创建elasticsearch用户,下面步骤不用执行了
# es启动需要es用户
#useradd es
#chown es:es -R elasticsearch-7.7.0
#su - es

jdk配置

# # es7内置jdk,rpm安装默认用自带的,以下步骤用不到,供参考
# # 解压
# tar -xvf jdk-8u321-linux-x64_.tar.gz
# # 移动到/usr/local
# mv jdk1.8.0_181 /usr/local/
# # 配置环境变量
# # 将下面两行放到/etc/profile 文件最后
# export JAVA_HOME=/usr/local/jdk1.8.0_321
# export PATH=$JAVA_HOME/bin:$PATH
# # 加载使其生效
# source /etc/profile

禁用swap

sed -i '/swap/s/^/#/' /etc/fstab
swapoff -a

系统调优

vim /etc/sysctl.conf

#fs.file-max主要是配置系统最大打开文件描述符数,建议修改为655360或者更高
fs.file-max=655360
# vm.max_map_count影响Java线程数量,用于限制一个进程可以拥有的VMA(虚拟内存区域)的大小,系统默认是65530,建议修改成262144或者更高
vm.max_map_count = 655300
# 优化脏内存页,es写入削峰
#可以用脏数据填充的绝对最大系统内存量百分比
vm.dirty_ratio=10
#内存可以填充脏数据的百分比
vm.dirty_background_ratio=5
#多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。
vm.dirty_writeback_centisecs=200
# 优化系统回收inode cache权重
vm.vfs_cache_pressure=200
#脏数据能存活的时间
vm.dirty_expire_centisecs=6000

sysctl -p

vim /etc/security/limits.conf

*        soft    nproc           20480
*        hard    nproc           20480
*        soft    nofile          65536
*        hard    nofile          65536
*        soft    memlock         unlimited
*        hard    memlock         unlimited


#还需要修改/etc/security/limits.d/20-nproc.conf文件(centos7.x系统)
vim /etc/security/limits.d/20-nproc.conf

*          soft    nproc     4096
修改为:
*          soft    nproc     20480


#如果集群中使用的是SSD磁盘,那么可以将默认的io sched由cfq设置为noop
#目前 Linux 上有如下几种 I/O 调度算法
#1.noop(No Operation) - 通常用于内存存储的设备。
#2.cfq(Completely Fair Scheduler ) – 完全公平调度器。进程平均使用IO带宽。
#3.Deadline – 针对延迟的调度器,每一个 I/O,都有一个最晚执行时间。
#4.Anticipatory – 启发式调度,类似 Deadline 算法,但是引入预测机制提高性能。

sudo sh -c 'echo "noop">/sys/block/sda/queue/scheduler'

#查看调度算法

[root@mjq-xiaoneng-jenkins-uat ~]# dmesg | grep -i scheduler
[    0.581586] io scheduler noop registered
[    0.581588] io scheduler deadline registered (default)
[    0.581604] io scheduler cfq registered
[    0.581607] io scheduler mq-deadline registered
[    0.581609] io scheduler kyber registered

JVM调优

1. 不能超过最大内存的一半,需要给lucene留内存
2. 官方建议不要超过30G

vim /etc/elasticsearch/jvm.options  
        -Xms4g
        -Xmx4g

elasticsearch.yml配置

#/etc/elasticsearch/elasticsearch.yml 配置信息
vim /etc/elasticsearch/elasticsearch.yml
grep -Ev "^#|^$" elasticsearch.yml 
cluster.name: elk-test
node.name: node-37
node.master: false
node.data: true
path.data: /data/es/data
path.logs: /data/es/logs
bootstrap.memory_lock: true
network.host: 10.3.65.37
http.port: 9200
discovery.seed_hosts: ["node-14", "node-18", "node-37"]
cluster.initial_master_nodes: ["node-14", "node-18"]
http.cors.enabled: true
http.cors.allow-origin: "*"

建好数据目录

mkdir -p /data/es/data
mkdir -p /data/es/logs
chown -R elasticsearch.elasticsearch /data/

针对锁定内存配置增加一下内容

systemctl edit elasticsearch
添加:
[Service]
LimitMEMLOCK=infinity

重新加载

systemctl daemon-reload

启动

# 启动
# ./bin/elasticsearch -d
systemctl start elasticsearch
systemctl enable elasticsearch

# 查看日志
# vim ./logs/elasticsearch.log
tail -f /data/es/logs/elk-test.log

验证

# 验证是否成功启动
curl 10.3.65.37:9200

整体脚本

# 安装es7.7
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-x86_64.rpm
yum localinstall -y elasticsearch-7.17.0-x86_64.rpm


# 添加hosts:
vim /etc/hosts
10.3.65.37 node-37
10.3.65.18 node-18
10.3.65.14 node-14
#rpm安装已经自动创建elasticsearch用户,下面步骤不用执行了
# es启动需要es用户
#useradd es
#chown es:es -R elasticsearch-7.7.0
#su - es
 
# # es7内置jdk,修改启动脚本;rpm安装默认用自带的,一下步骤用不到,供参考
# # 解压
# tar -xvf jdk-8u321-linux-x64_.tar.gz
# # 移动到/usr/local
# mv jdk1.8.0_181 /usr/local/
# # 配置环境变量
# # 将下面两行放到/etc/profile 文件最后
# export JAVA_HOME=/usr/local/jdk1.8.0_321
# export PATH=$JAVA_HOME/bin:$PATH
# # 加载使其生效
# source /etc/profile


# 禁用swap
sed -i '/swap/s/^/#/' /etc/fstab
swapoff -a

vim /etc/sysctl.conf

#fs.file-max主要是配置系统最大打开文件描述符数,建议修改为655360或者更高
fs.file-max=655360
# vm.max_map_count影响Java线程数量,用于限制一个进程可以拥有的VMA(虚拟内存区域)的大小,系统默认是65530,建议修改成262144或者更高
vm.max_map_count = 655300
# 优化脏内存页,es写入削峰
#可以用脏数据填充的绝对最大系统内存量百分比
vm.dirty_ratio=10
#内存可以填充脏数据的百分比
vm.dirty_background_ratio=5
#多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。
vm.dirty_writeback_centisecs=200
# 优化系统回收inode cache权重
vm.vfs_cache_pressure=200
#脏数据能存活的时间
vm.dirty_expire_centisecs=6000

sysctl -p

vim /etc/security/limits.conf

*        soft    nproc           20480
*        hard    nproc           20480
*        soft    nofile          65536
*        hard    nofile          65536
*        soft    memlock         unlimited
*        hard    memlock         unlimited


#还需要修改/etc/security/limits.d/20-nproc.conf文件(centos7.x系统)
vim /etc/security/limits.d/20-nproc.conf

*          soft    nproc     4096
修改为:
*          soft    nproc     20480


#如果集群中使用的是SSD磁盘,那么可以将默认的io sched由cfq设置为noop
#目前 Linux 上有如下几种 I/O 调度算法
#1.noop(No Operation) - 通常用于内存存储的设备。
#2.cfq(Completely Fair Scheduler ) – 完全公平调度器。进程平均使用IO带宽。
#3.Deadline – 针对延迟的调度器,每一个 I/O,都有一个最晚执行时间。
#4.Anticipatory – 启发式调度,类似 Deadline 算法,但是引入预测机制提高性能。

sudo sh -c 'echo "noop">/sys/block/sda/queue/scheduler'

#查看调度算法

[root@mjq-xiaoneng-jenkins-uat ~]# dmesg | grep -i scheduler
[    0.581586] io scheduler noop registered
[    0.581588] io scheduler deadline registered (default)
[    0.581604] io scheduler cfq registered
[    0.581607] io scheduler mq-deadline registered
[    0.581609] io scheduler kyber registered



#JVM调优
#这里的4g不能超过最大内存的一半,需要给lucene留内存 官方建议不要超过30G

vim /etc/elasticsearch/jvm.options  
    -Xms4g
    -Xmx4g

mkdir -p /data/es/data
mkdir -p /data/es/logs
chown -R elasticsearch.elasticsearch /data/

#/etc/elasticsearch/elasticsearch.yml 配置信息
vim /etc/elasticsearch/elasticsearch.yml
grep -Ev "^#|^$" elasticsearch.yml 
cluster.name: elk-test
node.name: node-37
node.master: false
node.data: true
path.data: /data/es/data
path.logs: /data/es/logs
bootstrap.memory_lock: true
network.host: 10.3.65.37
http.port: 9200
discovery.seed_hosts: ["node-14", "node-18", "node-37"]
cluster.initial_master_nodes: ["node-14", "node-18"]
http.cors.enabled: true
http.cors.allow-origin: "*"
gateway.recover_after_nodes: 2 #elasticsearch集群中的N个节点启动后,才允许进行数据恢复处理,默认是1.通常设置为过半的集群节点数量,例如,集群中总共有3个节点,那么将该值设置为2,如果在集群中总共有5个节点,则将该值设置为3,以此类推。
action.destructive_requires_name: true #设置是否可以通过正则或者_all删除或者关闭索引库,默认true表示必须要显式指定索引库名称,生产环境建议设置为true,删除索引库的时候必须指定,否则可能会导致误删除。

#针对锁定内存配置增加一下内容
systemctl edit elasticsearch
添加:
[Service]
LimitMEMLOCK=infinity

systemctl daemon-reload

# 启动
# ./bin/elasticsearch -d
systemctl start elasticsearch
systemctl enable elasticsearch

# 查看日志
# vim ./logs/elasticsearch.log
tail -f /data/es/logs/elk-test.log

# 验证是否成功启动
curl 10.3.65.37:9200

配置elasticsearch

(1)cluster.name: elkbigdata
         配置elasticsearch集群名称,默认是elasticsearch。这里修改为elkbigdata,elasticsearch会自动发现在同一网段下的集群名为elkbigdata的主机。
(2)node.name: server1
       节点名,任意指定一个即可,这里是server1,我们这个集群环境中有三个节点,分别是server1、server2和server3,记得根据主机的不同,要修改相应的节点名称。
(3)node.master: true
         指定该节点是否有资格被选举成为master,默认是true,elasticsearch集群中默认第一台启动的机器为master角色,如果这台服务器宕机就会重新选举新的master。
(4)node.data: true
        指定该节点是否存储索引数据,默认为true,表示数据存储节点,如果节点配置node.master:false并且node.data: false,则该节点就是client node。这个client node类似于一个“路由器”,负责将集群层面的请求转发到主节点,将数据相关的请求转发到数据节点。
(5)path.data:/data1/elasticsearch,/data2/elasticsearch
        设置索引数据的存储路径,默认是elasticsearch根目录下的data文件夹,这里自定义了两个路径,可以设置多个存储路径,用逗号隔开。
(6)path.logs: /usr/local/elasticsearch/logs
        设置日志文件的存储路径,默认是elasticsearch根目录下的logs文件夹
(7)bootstrap.memory_lock: true
          此配置项一般设置为true用来锁住物理内存。	linux下可以通过“ulimit -l” 命令查看最大锁定内存地址空间(memlock)是不是unlimited