一、ES集群的多实例部署

1、在elk121节点上配置集群免密登录及同步脚本

在elk121节点上修改主机列表

[root@elk121 ~]# cat >> /etc/hosts <<'EOF'
192.168.1.121 elk121
192.168.1.122 elk122
192.168.1.123 elk123
EOF

在elk121节点上生成密钥对

[root@elk121 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa -q

在elk121节点上配置所有集群节点的免密登录

[root@elk121 ~]# for ((host_id=121;host_id\<=123;host_id++));do ssh-copy-id elk\${host_id} ;done

在elk121节点上链接测试

[root@elk121 ~]# ssh elk122
[root@elk121 ~]# ssh elk123

所有节点安装rsync数据同步工具

[root@elk121 ~]# yum -y install rsync
[root@elk122 ~]# yum -y install rsync
[root@elk123 ~]# yum -y install rsync

在elk121节点上编写同步脚本

[root@elk121 ~]# cat > /usr/local/sbin/data_rsync.sh <<'EOF'
#!/bin/bash
# Auther: zq
if [ $# -ne 1 ];then
echo "Usage: $0 /path/to/file(绝对路径)"
exit
fi
# 判断文件是否存在
if [ ! -e $1 ];then
echo "[ $1 ] dir or file not find!"
exit
fi
# 获取父路径
fullpath=`dirname $1`
# 获取子路径
basename=`basename $1`
# 进入到父路径
cd $fullpath
for ((host_id=122;host_id<=123;host_id++))
do
# 使得终端输出变为绿色
tput setaf 2
echo ===== rsyncing elk${host_id}: $basename =====
# 使得终端恢复原来的颜色
tput setaf 7
# 将数据同步到其他两个节点
rsync -apz $basename `whoami`@elk${host_id}:$fullpath
if [ $? -eq 0 ];then
echo "命令执行成功!"
fi
done
EOF

在elk121节点上给脚本授权

[root@elk121 ~]# chmod +x /usr/local/sbin/data_rsync.sh

2、下载ES软件包

地址链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.23.tar.gz

3、所有节点上创建运行ES服务的用户

[root@elk121 ~]# useradd -u 2023 es
[root@elk122 ~]# useradd -u 2023 es
[root@elk123 ~]# useradd -u 2023 es

4、在elk121节点上创建ElasticSearch的工作目录

[root@elk121 ~]# install -d /es/{data,logs,softwares}/es6 -o es -g es
[root@elk122~]# install -d /es/{data,logs,softwares}/es6 -o es -g es
[root@elk123~]# install -d /es/{data,logs,softwares}/es6 -o es -g es

5、在elk121节点上解压软件包

[root@elk121 ~]# tar xf elasticsearch-6.8.23.tar.gz -C /es/softwares/es6/
[root@elk121 ~]# chown es:es -R /es/softwares/es6/elasticsearch-6.8.23/

6、在elk121节点上修改配置文件

复制第17行内容修改集群名字

[root@elk121 ~]# vim +17 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
cluster.name: es6

复制第24行内容修改node名字

[root@elk121 ~]# vim +24 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
node.name: elk121

复制第34行内容修改数据路径

[root@elk121 ~]# vim +34 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
path.data: /es/data/es6

复制第38行内容修改日志路径

[root@elk121 ~]# vim +38 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
path.logs: /es/logs/es6

复制第56行内容修改ES服务监听对外暴露服务的地址为192.168.1.121,具体内容如下

[root@elk121 ~]# vim +56 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
network.host: 192.168.1.121

复制第64行内容修改http端口和tcp端口

[root@elk121 ~]# vim +65 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
http.port: 19200
transport.tcp.port: 19300

复制第71行内容指定ES集群的节点IP,具体内容如下

[root@elk121 ~]# vim +71 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
discovery.zen.ping.unicast.hosts: ["elk121","elk122","elk123"]

复制第77行内容指定master节点数量为2

[root@elk121 ~]# vim +77 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
discovery.zen.minimum_master_nodes: 2

最后修改后的配置文件如下:

[root@elk121 ~]# egrep -v '^#|^$' /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
cluster.name: es6
node.name: elk121
path.data: /es/data/es6
path.logs: /es/logs/es6
network.host: 192.168.1.121
http.port: 19200
transport.tcp.port: 19300
discovery.zen.ping.unicast.hosts: ["elk121","elk122","elk123"]
discovery.zen.minimum_master_nodes: 2

7、在elk121节点上修改堆内存大小

修改第22行和第23行内容

[root@elk121 ~]# vim +23 /es/softwares/es6/elasticsearch-6.8.23/config/jvm.options
…
…
-Xms256m
-Xmx256m

8、在elk121节点上编写启动脚本

[root@elk121 ~]# cat > /usr/lib/systemd/system/es6.service <<EOF
[Unit]
Description=es6
After=network.target
[Service]
Type=simple
Environment=JAVA_HOME=/es/softwares/jdk1.8.0_291
ExecStart=/es/softwares/es6/elasticsearch-6.8.23/bin/elasticsearch
User=es
LimitNOFILE=131070
[Install]
WantedBy=multi-user.target
EOF

9、在elk121节点上同步配置文件

[root@elk121 ~]# data_rsync.sh /es/softwares/es6/
[root@elk121 ~]# data_rsync.sh /usr/lib/systemd/system/es6.service

10、在elk122节点和elk123节点上修改各节点的配置文件

复制第24行内容修改node名字

[root@elk122 ~]# vim +24 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
node.name: elk122
[root@elk123 ~]# vim +24 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
node.name: elk123

复制第56行内容修改ES服务监听对外暴露服务的地址为各自节点IP,具体内容如下

[root@elk122 ~]# vim +56 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
network.host: 192.168.1.122
[root@elk123 ~]# vim +56 /es/softwares/es6/elasticsearch-6.8.23/config/elasticsearch.yml
network.host: 192.168.1.123

11、所有节点启动服务

[root@elk121 ~]# systemctl daemon-reload && systemctl enable --now es6
[root@elk122 ~]# systemctl daemon-reload && systemctl enable --now es6
[root@elk123 ~]# systemctl daemon-reload && systemctl enable --now es6

12、在elk121节点上查看集群节点的API是否正常

[root@elk121 ~]# curl 192.168.1.121:9200/_cat/nodes
192.168.1.122 14 68 0 1.96 1.09 0.43 cdfhilmrstw * elk122
192.168.1.121 5 71 0 2.10 1.18 0.49 cdfhilmrstw - elk121
192.168.1.123 6 67 0 2.49 1.23 0.47 cdfhilmrstw - elk123

说明:*代表该节点为主节点。主节点挂掉后会飘到其他节点上面。之前的主节点恢复后不存在抢占机制。另外,也存在”半数存活”规则(防止脑裂),这意味着最多只能挂一台。

13、在elk121节点上查看集群是否正常

[root@elk121 ~]# yum install -y jq
[root@elk121 ~]# curl 192.168.1.121:9200/_cluster/health 2>/dev/null | jq
{
"cluster_name": "es",
"status": "green",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"active_primary_shards": 3,
"active_shards": 6,
"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
}

二、其他组件

2.1 elasticsearch head

1、准备扩展包并进行解压

下载地址:https://chromewebstore.google.com/detail/cpmmilfkofbeimbmgiclohpodggeheim

2、加载已解压的扩展程序包

3、点击安装好的扩展程序,输入集群机器IP

说明:*代表该节点为主节点。主节点挂掉后会飘到其他节点上面。之前的主节点恢复后不存在抢占机制。另外,也存在”半数存活”规则(防止脑裂),这意味着最多只能挂一台。

2.2 postman

Postman 是一种流行的 API 开发和测试工具,它提供了一个直观的界面,让开发人员可以轻松地创建、测试和调试 API。

1、准备安装包

下载地址:https://dl.pstmn.io/download/latest/win64

2、双击安装并进行注册

3、创建新的Workspace

点击【New Workspace】

填写Name以及Summary后,点击【Create Workspace】

4、基本使用

点击【+】会创建一个默认目录

点击默认目录,修改目录名字为测试API

右键【测试API】会新建一个默认GET请求

点击默认GET请求,修改GET请求名字为【01-查看节点列表】

输入请求url:192.168.1.121:9200/_cat/nodes

三、故障排查

3.1 故障排查思路

1、看日志

[root@elk121 ~]# tail -100f /es/logs/es7/es.log
[root@elk121 ~]# journalctl -u es7

2、监听端口

[root@elk121 ~]# ss -ntl | grep -E '9200|9300'

3、进程信息

[root@elk121 ~]# jps
[root@elk121 ~]# ps -ef | grep es7

4、通过API查询

查看集群节点的API

[root@elk121 ~]# curl 192.168.1.121:9200/_cat/nodes

查看集群是否正常

[root@elk121 ~]# yum install -y jq
[root@elk121 ~]# curl 192.168.1.121:9200/_cluster/health 2>/dev/null | jq

3.2 故障案例

常见报错:

1、java.lang.RuntimeException: can not run elasticsearch as root

报错原因:

不能以root用户启动ES服务。

解决方案:

使用普通用户启动服务即可。

2、bootstrap check failure [1] of [3]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

报错原因:

程序默认的的文件打开数量上线过低。

解决方案:

调大文件打开数量上限即可。

3、bootstrap check failure [2] of [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

报错原因:

内核参数虚拟内存映射过低。

解决方案:

调大内核虚拟内存映射值即可。

4、bootstrap check failure [3] of [3]: max number of threads [3795] for user [oldboyedu] is too low, increase to at least [4096]

报错原因:

程序打开的线程数量设置过低。

解决方案:

调大程序打开的线程数量即可。

5、initial heap size [268435456] not equal to maximum heap size [1031798784]; this can cause resize pauses and prevents mlockall from locking the entire heap

报错原因:

初始化堆内存和最大堆内存大小不一致。

解决方案:

观察配置是否生效,建议将"-Xms"和"-Xmx"值配置一致。

四、集群的颜色

Green:表示所有的主分片和副本分片均正常工作。

Yellow:表示有部分副本分片不正常工作。

Red:表示有部分主分片不正常工作。