Docker Elasticsearch 集群配置

一:选用ES原因

公司项目有些mysql的表数据已经超过5百万了,各种业务的查询入库压力已经凸显出来,初步打算将一个月前的数据迁移到ES中,mysql的老数据就物理删除掉。

首先是ES使用起来比较方便,对于项目初期存储一些不能删除但又一般使用不到的数据比较合适,

还有就是ES的存储采用索引分片式,使用数据的创建时间分片也很合适。

本文使用的ES版本:5.6.8,docker版本:18.06.3-ce

本文的测试机器为两台百度云的2C4G的机器,每个机器分别部署三个节点(1个master,2个data),总共6个节点,次配置仅为研究测试用,具体生产业务要看情况考虑。

二:Docker的安装:

  参考我之前的安装文档:《Docker-常用基建的安装与部署》。

三:ES配置

1:创建es相关目录

cd /home/data/docker
mkdir -p es/cluster/es-0/conf
mkdir -p es/cluster/es-1/conf
mkdir -p es/cluster/es-2/conf
cd es/cluster/es-0/conf
touch elasticsearch.yml
# 一个机器 三个节点,复制两份
cd /home/data/docker
cp es/cluster/es-0/conf/elasticsearch.yml es/cluster/es-1/conf
cp es/cluster/es-0/conf/elasticsearch.yml es/cluster/es-2/conf

2:编辑 服务器A的 elasticsearch.yml

#跨域支持
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群名称(所有节点的集群名称必须一致)
cluster.name: es-nova
#节点名称(集群下每个节点都不相同)
node.name: node-0
#ifconfig查看当前系统的内网ip
network.host: 172.16.0.4
#对外服务的http端口,默认为9200
http.port: 9201 #设置可以访问的ip,默认为0.0.0.0,这里全部设置通过
network.bind_host:
0.0.0.0 #设置结点之间交互的ip地址
network.publish_host: 当前服务器
的外网ip #culster transport port #节点之间交互的tcp端口
transport.tcp.port:
9301 transport.tcp.compress: true #至少存在一个主资格节点时才进行主节点选举,防止脑裂 discovery.zen.minimum_master_nodes: 1 #是否有master选举资格:一个集群同时只有一个master存在,true代表有资格参与master选举
node.master:
true #是否作为数据节点:参与数据存储与查询
node.data:
false #等待集群至少存在多少节点数才进行数据恢复 gateway.recover_after_nodes: 3 #等待 5 分钟,或者3 个节点上线后,才进行数据恢复,这取决于哪个条件先达到 gateway.expected_nodes: 3 gateway.recover_after_time: 5m #集群单播发现 discovery.zen.ping.unicast.hosts: ["外网ip:9301","另一台服务器外网ip:9301"]
# 连接集群超时时间 discovery.zen.ping_timeout: 120s # discovery.zen.fd合理的设置可以避免正常机器重启造成的数据迁移 # 单次心跳检测ping超时时间 discovery.zen.fd.ping_timeout: 60s # 多少次心跳检测失败才认为节点丢失 discovery.zen.fd.ping_retries: 3 # 集群机器间机器定时心跳检测时间 discovery.zen.fd.ping_interval: 30s # 为保证ES性能,请同时关闭系统内存交换 swapp #bootstrap.memory_lock: true

上面这个当前一个非数据节点的master节点的配置,然后再基于当前的配置,简单修改下,分别在es-1/conf 和 es-2/conf 下创建两个数据节点,

只需要修改以下配置:

node.name: node-1   
http.port: 9202  
transport.tcp.port: 9302 
node.master: false
node.data: true
node.name: node-2   
http.port: 9203
transport.tcp.port: 9303
node.master: false
node.data: true 

3:编辑 服务器B的 elasticsearch.yml

#跨域支持
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群名称(所有节点的集群名称必须一致)
cluster.name: es-nova
#节点名称(集群下每个节点都不相同)
node.name: node-4
#ifconfig查看当前系统的内网ip
network.host: 172.16.0.4
#对外服务的http端口,默认为9200
http.port: 9201
#设置可以访问的ip,默认为0.0.0.0,这里全部设置通过
network.bind_host: 0.0.0.0
#设置结点之间交互的ip地址
network.publish_host: 当前服务器的外网ip
#culster transport port
#节点之间交互的tcp端口
transport.tcp.port: 9301
transport.tcp.compress: true
#至少存在一个主资格节点时才进行主节点选举,防止脑裂
discovery.zen.minimum_master_nodes: 1
#是否有master选举资格:一个集群同时只有一个master存在,true代表有资格参与master选举
node.master: true
#是否作为数据节点:参与数据存储与查询
node.data: false
#等待集群至少存在多少节点数才进行数据恢复
gateway.recover_after_nodes: 3
#等待 5 分钟,或者3 个节点上线后,才进行数据恢复,这取决于哪个条件先达到
gateway.expected_nodes: 3
gateway.recover_after_time: 5m
#集群单播发现
discovery.zen.ping.unicast.hosts: ["外网ip:9301","另一台服务器外网ip:9301"]
# 连接集群超时时间
discovery.zen.ping_timeout: 120s
# discovery.zen.fd合理的设置可以避免正常机器重启造成的数据迁移
# 单次心跳检测ping超时时间
discovery.zen.fd.ping_timeout: 60s
# 多少次心跳检测失败才认为节点丢失
discovery.zen.fd.ping_retries: 3
# 集群机器间机器定时心跳检测时间
discovery.zen.fd.ping_interval: 30s
# 为保证ES性能,请同时关闭系统内存交换 swapp 
#bootstrap.memory_lock: true

和服务器A的不同配置仅仅 node.namenetwork.publish_host。

同样在当前服务器下也分别在es-1/conf 和 es-2/conf 下创建两个数据节点,

node.name: node-5  
http.port: 9202  
transport.tcp.port: 9302 
node.master: false
node.data: true
node.name: node-6  
http.port: 9203
transport.tcp.port: 9303
node.master: false
node.data: true

 

四:修改宿主机的配置

如果es集群启动报错:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 

vim
/etc/sysctl.conf
# 配置里需要添加
vm.max_map_count=262144
# 执行命令sysctl -p 生效
sysctl -p
如果es集群启动报错:memory locking requested for elasticsearch process but memory is not locked

# 修改limits.conf
vim /etc/security/limits.conf
# 添加 *表示所用用户

* soft nofile 65536

* hard nofile 65536

* soft nproc 32000

* hard nproc 32000

* hard memlock unlimited

* soft memlock unlimited

 

然后再修改 /etc/systemd/system.conf

DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity

 

最后重启系统即可解决

# 关闭selinux
vim /etc/sysconfig/selinux
# 将 SELINUX=enforcing 改为 SELINUX=disabled

 

五:集群

1:开启集群

分别启动服务器A的三个es节点、服务器B的三个es节点 (启动命令中仅docker的路径不同)

docker run -d --name es-0 -p 9201:9201 -p 9301:9301 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/data/docker/es/cluster/es-0/data:/usr/share/elasticsearch/data -v /home/data/docker/es/cluster/es-0/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/docker/es/cluster/es-0/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8 docker run -d --name es-1 -p 9202:9202 -p 9302:9302 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/data/docker/es/cluster/es-1/data:/usr/share/elasticsearch/data -v /home/data/docker/es/cluster/es-1/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/docker/es/cluster/es-1/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8 docker run -d --name es-2 -p 9203:9203 -p 9303:9303 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/data/docker/es/cluster/es-2/data:/usr/share/elasticsearch/data -v /home/data/docker/es/cluster/es-2/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/docker/es/cluster/es-2/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
docker run -d --name es-0 -p 9201:9201 -p 9301:9301 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /root/data/docker/es/cluster/es-0/data:/usr/share/elasticsearch/data -v /root/data/docker/es/cluster/es-0/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/data/docker/es/cluster/es-0/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8

docker run -d --name es-1 -p 9202:9202 -p 9302:9302 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /root/data/docker/es/cluster/es-1/data:/usr/share/elasticsearch/data -v /root/data/docker/es/cluster/es-1/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/data/docker/es/cluster/es-1/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8

docker run -d --name es-2 -p 9203:9203 -p 9303:9303 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /root/data/docker/es/cluster/es-2/data:/usr/share/elasticsearch/data -v /root/data/docker/es/cluster/es-2/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/data/docker/es/cluster/es-2/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8

启动完成后,docker ps  以及docker logs es-0  去查看es是否启动成功。

 

2:常用的一些es命令

#集群健康
curl -XGET 127.0.0.1:9201/_cat/health?v

"status": 集群状态,重点关注项

* green正常
* yellow服务仍然可用但存在副本分片丢失,
* red 存在主分片丢失,集群不正常,存在数据丢失可能

shards :所有分片数(主分片+副本分片)

pri:主分片数

 

# 查询集群节点
curl -XGET 127.0.0.1:9203/_cat/nodes?v

 v替换为format=json可以使用json形式返回

表头字段 含义 用途
Ip IP地址  
heap.percent heap使用百分比 内存使用高时重点关注
ram.percent 系统内存使用百分比 内存使用高时重点关注
cpu  当前cpu使用百分比 CPU使用高时重点关注
load_1m 最近1分钟cpu load CPU使用高时重点关注
load_5m 最近5分钟cpu load CPU使用高时重点关注
load_15m 最近15分钟cpu load CPU使用高时重点关注
node.role 三字母缩写 m: 主节点  d: 数据节点  i: 协调节点  
master * 表示当前节点为主节点  

 

 

 

 

 

 

 

 

 

 

 

 

 

# 分片信息查询
curl -XGET 127.0.0.1:9201/_cat/shards?v

 

表头字段 含义 用途
index 索引名  
shard 分片  
prirep p:主分片,r:副本分片  
state 节点状态  
docs 分片文档数  
store 分片数据大小  
ip 分片所在ip地址  
node 分片所在节点名称 结合prirep,确定多个主分片是否分布在同一个节点

 

 

 

 

 

 

 

 

 

 

 

 

 

分片移动(当多个主分片分配在同一节点,造成单节点写入压力较大,可将其中一个主分片移动到空闲节点)

POST _cluster/reroute
{
   "commands": [
     {
       "move": {
         "index": "poi-address",            // 索引名
         "shard": 2,                        // 分片号
         "from_node": "node-1",            // 源节点
         "to_node": "node-5"            // 目标节点
       }
     }
   ]
}
commands为json数据,支持多个迁移命令同时执行,可通过GET /_cat/recovery?v 查看迁移进度

 

六:参考文献

1:Elasticsearch: 权威指南

 

posted @ 2021-02-25 11:42  让我发会呆  阅读(685)  评论(0编辑  收藏  举报