之前写过两篇安装ES教程,分别是Docker安装单节点ES和Linus安装单节点ES, 均为单节点ES,如果单纯从项目使用方面来说单节点够用了,特别是针对使用侧的用户而言,尤其是Docker安装特别容易简单,不需要什么额外的学习成本,按照步骤即可。但如果作为想深度学习,了解ES底层原理,明显是不够了,所以这次写个Docker安装ES集群供大家参考,所有操作均经过测试,可放心ctrl + c
、ctrl+v
阿里云乞丐版, 单核2G内存!!!
程序猿,懂得都懂!SWAP傍身,用时间换空间,2G的内存不够用,只能降低性能使用虚拟内存,谁让是猿呢?
[root@Genterator ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
1 Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
[root@Genterator ~]# cat /proc/meminfo | grep MemTotal
MemTotal: 1790344 kB
[root@Genterator ~]# free -h
total used free shared buff/cache available
Mem: 1.7Gi 1.4Gi 134Mi 0.0Ki 212Mi 204Mi
Swap: 2.5Gi 114Mi 2.4Gi
说个小插曲,刚部署的时候每个服务分配了512M,还是用了锁内存,防止使用硬盘内存,结果悲催了,丐版阿里云罢工,直接连接不上, CPU、内存满负荷运行,导致SSH链接不上,VNC也链接不上,面对crash只能选择重启, 附图:
有条件或者时间宝贵的,建议多核大内存吧!要是小白或者猿,那就像我一样,选择SWAP吧!
Elasticsearch-head
,作为小白可以实践一番,熟悉熟悉即可,此次使用Kibana,ELK的三剑客之一,也是大众喜欢的,强烈推荐,版本跟ES一致即可此次部署文件稍微多了些,做个说明,尽量让进来的童鞋一目了然,不用在部署上耗费太多时间
/opt/shell/es/cluster
,我是将所有需要用的文件都放到了这个文件夹下:[root@Genterator cluster]# pwd
/opt/shell/es/cluster
[root@Genterator cluster]# ll
总用量 16
-rw-r--r-- 1 root root 2207 5月 27 22:18 docker-compose_es-cluster.yml
关于内容后面聊/opt/volume/es/cluster/
, 这里面主要存放es配置、数据和日志, 如下:[root@Genterator opt]# tree /opt/volume/es/cluster/
/opt/volume/es/cluster/
├── data
│ ├── 01
│ │ └── nodes
│ │ └── 0
│ │ ├── node.lock
│ │ ├── snapshot_cache
│ │ │ ├── segments_1
│ │ │ └── write.lock
│ │ └── _state
│ │ ├── _0.cfe
│ │ ├── _0.cfs
│ │ ├── _0.si
│ │ ├── manifest-0.st
│ │ ├── node-0.st
│ │ ├── segments_1
│ │ └── write.lock
│ ├── 02
│ │ └── nodes
│ │ └── 0
│ │ ├── node.lock
│ │ ├── snapshot_cache
│ │ │ ├── segments_3
│ │ │ └── write.lock
│ │ └── _state
│ │ ├── _16.cfe
│ │ ├── _16.cfs
│ │ ├── _16.si
│ │ ├── manifest-2.st
│ │ ├── node-2.st
│ │ ├── segments_1c
│ │ └── write.lock
│ └── 03
│ └── nodes
│ └── 0
│ ├── node.lock
│ ├── snapshot_cache
│ │ ├── segments_2
│ │ └── write.lock
│ └── _state
│ ├── _15.cfe
│ ├── _15.cfs
│ ├── _15.si
│ ├── manifest-1.st
│ ├── node-1.st
│ ├── segments_1b
│ └── write.lock
└── logs
├── 01
│ ├── gc.log
│ ├── gc.log.00
│ └── gc.log.01
├── 02
│ ├── gc.log
│ ├── gc.log.00
│ └── gc.log.01
└── 03
├── gc.log
├── gc.log.00
├── gc.log.01
└── gc.log.02
20 directories, 58 files
创建工作所需目录并授权
# 创建工作所需目录
mkdir -p /opt/volume/es/cluster/data/01 /opt/volume/es/cluster/logs/01
mkdir -p /opt/volume/es/cluster/data/02 /opt/volume/es/cluster/logs/02
mkdir -p /opt/volume/es/cluster/data/03 /opt/volume/es/cluster/logs/03
# 授权
[root@Genterator volume]# chmod -R 777 /opt/volume/es
编写docker-compose_es-cluster.yml
version: "3.8"
services:
es_01:
image: elasticsearch:7.17.1
container_name: es_01
#测试完后再打开
# restart: always
environment:
- TZ=Asia/Shanghai
- node.name=es_01
- cluster.name=es-cluster
- discovery.seed_hosts=es_02,es_03
- cluster.initial_master_nodes=es_01,es_02,es_03
# 设置为true,这将确保Elasticsearch将所有内存都锁定到RAM中,而不会使用交换分区(内存小的慎用)
# - bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /opt/volume/es/cluster/data/01:/usr/share/elasticsearch/data
- /opt/volume/es/cluster/logs/01:/usr/share/elasticsearch/logs
ports:
- 9211:9200
- 9311:9300
networks:
es_net:
ipv4_address: 172.30.10.11
es_02:
image: elasticsearch:7.17.1
container_name: es_02
# restart: always
environment:
- TZ=Asia/Shanghai
- node.name=es_02
- cluster.name=es-cluster
- discovery.seed_hosts=es_01,es_03
- cluster.initial_master_nodes=es_01,es_02,es_03
# - bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /opt/volume/es/cluster/data/02:/usr/share/elasticsearch/data
- /opt/volume/es/cluster/logs/02:/usr/share/elasticsearch/logs
networks:
es_net:
ipv4_address: 172.30.10.12
es_03:
image: elasticsearch:7.17.1
container_name: es_03
# restart: always
environment:
- TZ=Asia/Shanghai
- node.name=es_03
- cluster.name=es-cluster
- discovery.seed_hosts=es_01,es_02
- cluster.initial_master_nodes=es_01,es_02,es_03
# - bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /opt/volume/es/cluster/data/03:/usr/share/elasticsearch/data
- /opt/volume/es/cluster/logs/03:/usr/share/elasticsearch/logs
networks:
es_net:
ipv4_address: 172.30.10.13
networks:
es_net:
driver: bridge
ipam:
config:
- subnet: 172.30.10.0/25
gateway: 172.30.10.1
执行docker-compose命令
docker-compose -f docker-compose_es-cluster.yml up -d
提供几个docker快速启停的命令,直接操作所有es节点:
启动所有ES节点:
docker start $(docker ps -a | grep “redis-” | awk ‘{print $1}’)
停止所有ES节点
docker stop $(docker ps -a | grep “redis-” | awk ‘{print $1}’)
删除所有ES节点
docker rm $(docker ps -a | grep “es-” | awk ‘{print $1}’)
部署时依然肯能存在两个问题
[root@Genterator single]# docker-compose up
WARNING: Some networks were defined but are not used by any service: name
Pulling elasticsearch (docker.elastic.co/elasticsearch/elasticsearch:7.17.1)...
7.17.1: Pulling from elasticsearch/elasticsearch
……
elasticsearch | Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
elasticsearch | output:
elasticsearch | [0.000s][error][logging] Error opening log file 'logs/gc.log': Permission denied
elasticsearch | [0.000s][error][logging] Initialization of output 'file=logs/gc.log' using options 'filecount=32,filesize=64m' failed.
elasticsearch | error:
elasticsearch | Invalid -Xlog option '-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m', see error log for details.
elasticsearch | Error: Could not create the Java Virtual Machine.
……
处理:
给自己的ES部署文件夹
授权
# 给需要写入文件的文件夹赋予权限
[root@Genterator single]# chmod 777 -R /opt/volume/es
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量,默认值是65536。
elasticsearch | ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
elasticsearch | bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
elasticsearch | ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/es-cluster.log
处理:
[root@Genterator single]# cat /proc/sys/vm/max_map_count
65530
[root@Genterator single]# sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
[root@Genterator single]# cat /proc/sys/vm/max_map_count
262144