ES集群搭建
一、环境准备
- JDK 配置。
略
2. elasticsearch7.X开始需要java11,通常我们用jdk1.8作为共有环境变量,我们可以不安装 jdk11版本 。但启动会报错,因为与现有环境变量冲突。
敲黑板:
es安装包包含一个相匹配的 JAVA 版本,只需修改配置文件。修改启动脚本/bin/elasticsearch使用自带jdk。亲测不好使没找到原因,启动总是提示找不到JAVA_HOME。所以自己下了一个jdk11。修改/bin/elasticsearch-env文件,在判断JAVA_HOME那块逻辑前指定ES_JAVA_HOME=xxx/xxx/jdk11,可不用配置PATH。或者直接在启动脚本/bin/elasticsearch 增加export JAVA_HOME= xxx/xxx/jdk11
二、操作步骤
- 下载解压
tar zxvf elasticsearch-7.XX.X.tar.gz
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz或wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.0-linux-x86_64.tar.gz
或rpm安装Install Elasticsearch with RPM | Elasticsearch Guide [5.0] | Elastic
下载后执行rpm -ivh elasticsearch-6.8.0.rpm(rpm的方式)
2.新建ES用户组(可选)、用户及密码(启动ES 不能是ROOT权限)
groupadd elastic、 useradd elasticuser -g elastic、
passwd elasticuser xxxxxxxx
为用户赋权限
chown -R elasticuser: elastic /usr/local/elasticsearch
切换用户su elasticuser,(不要root用户,注意logs、data、config等文件夹的权限)
3.规划目录修改配置。(目录换到不属于root目录)详见配置。
启动ES, ./bin/elasticsearch -d(-d 后台启动),或nohup /opt/elastic/bin/elasticsearch > /var/elastic/es.log >&1 & 启动后访问https://ip:port正常。
4.集群启动验证
停掉进程,复制文件(集群),然后修改配置中对应端口、地址等信息(详见配置)。再逐个启动。启动后调用curl http://ip:port/_cat/nodes?v 查看集群状态
或直接http://ip:port网页访问,若访问不到可能是防火墙拦截。
踩坑:
集群启动异常,类似找不到主节点、脑裂等异常(类似master not discovered yet, this node has not previously joined a bootstrappe这种)可能是之前配置了不同nodes数据,后面再修改,但此时data目录缓存了数据,导致加载了旧的节点信息。所以需要把data目录es自动生成的node目录删除掉。(前提是你的host等配置没配错)
5.安全设置(可选)
创建keystore bin/elasticsearch-keystore create
添加keystore bin/elasticsearch-keystore add xxx
删除keystore bin/elasticsearch-keystore remove xxx
三、配置
1、JVM配置config/jvm.options(高版本)
修改JVM内存,配置原则:
(1)Xmx和Xms大小设置成一样;(默认2g)
(2)不超过物理机内存的一半;
(3)最大不宜超过30G
敲黑板:
这里卡了很久,启动后无启动日志,开始还有进程存在,后来没了。研究好久发现自己虚拟机设置内存才2g,es默认2g,配置改成516m(1g报内存溢出)启动成功。
垃圾收集器修改:
-XX:+UseConcMarkSweepGC 改为 -XX:+UseG1GC(限高版本,G1需要jdk10以上)
内存配置 bin/elasticsearch.in.sh(低版本才有)
ES_MIN_MEM、ES_MAX_MEM=2g参考数据量和当前机器内存,值相同。参考1
2.基本信息配置 config/elasticsearch.yml
http.port: 9001
transport.tcp.port: 9101
node.master: true
cluster.name: "es_cluster"
node.name: "es-01"
path.data: /home/elasticuser/cluster/elasticSearch-cluster/elasticsearch01/data
node.data: true
path.log: /home/elasticuser/cluster/elasticSearch-cluster/elasticsearch01/logs
network.host: xx.xx.xxx
discovery.seed_hosts: ["xx.xx.xx:9101","xx.xx.xx.128:9202","xx.xx.xx:9303"]
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.zen.minimum_master_nodes: 2
discovery.zen.fd.ping_interval: 1s
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_retries: 3
transport.tcp.compress: false
bootstrap.memory_lock: true
cluster.initial_master_nodes: discovery.seed_hosts: ["es-01","es-02","es-03"]
(可选择修改配置目录,修改配置环境变量ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch)
必配:
http.port=8080
transport.tcp.port:8081
Cluster.name=XXXX(各节点一致、唯一)
node.name: XXX(各节点不同,eg:node-02)
node.master: true (设置主节点,都为true都是master候选人,可选)
path.data= /data/elasticsearch (索引位置,多个,分割)
node.data: true
Path.logs: xx/xx/log/
network.host: 127.0.0.1(自身IP)
bootstrap.memory_lock: true(配置保护Elasticsearch使用的内存, 请求JVM在内存中锁定堆。可选,若选true需修改后续的系统配置/system.conf 和limits.conf)
discovery.seed_hosts: [“IP:tcp端口”,” IP:tcp端口”] (集群中master节点的初始列表,“,”分割。自动发现机制,各节点都是。discovery.zen.ping.unicast.hosts是低版本用的)
cluster.initial_master_nodes: ["node-01","node-02","node-03"](设置全新群集中符合主机资格的节点的初始集合,首次启动集群时需要)
选配:
discovery.zen.minimum_master_nodes: 2(举Maste时需要的节点数,三节点时为2防止脑裂)
discovery.zen.fd.ping_interval: 1s(一个节点多久ping一次,默认)
discovery.zen.fd.ping_timeout: 30s(等待ping返回时间,默认)
discovery.zen.fd.ping_retries: 3(ping超时重试次数,默认)
index.number_of_shards: 5(设置默认索引分片个数,默认)
index.number_of_replicas: 1(设置默认索引副本个数,默认)
#head插件用
http.cors.enabled: true (是否支持跨域)
http.cors.allow-origin: "*" (域名限制 *不限制)
敲黑板:
elasticsearch5.X以上不支持包含索引级别的设置,即index开头的配置去掉。配置后会启动报错。
transport.tcp.compress: false(是否压缩tcp传输时的数据,默认为false,不压缩)
bootstrap.memory_lock: true(锁定物理内存地址,防止es内存被交换出去,调优用)
3.日志配置 config/logging.yml或log4j2.properties(可选)
主要说明如下:(具体参考log4j配置)
${sys:es.logs.base_path} 解析为日志目录
${sys:es.logs.cluster_name} 解析为集群名称
${sys:es.logs.node_name} 解析为节点名称
${sys:file.separator} 将被解析为路径分隔符
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz(文件压缩后名称)
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy(时间滚动策略)
appender.rolling.policies.time.interval = 1(每天滚动)
appender.rolling.policies.time.modulate = true(以天为标准输出日志)
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy(基于大小滚动策略)
appender.rolling.policies.size.size = 256MB(大小滚动的阈值)
appender.rolling.strategy.type = DefaultRolloverStrategy(滚动删除策略)
appender.rolling.strategy.action.type = Delete(处理类型,删除)
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize (删除条件)
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB(删除条件)
5.系统配置
能打开的最大文件描述符个数配置。ulimit -a查看max_file_descriptors参数(32K~64K,65535)
vim /etc/security/limits.conf
用户名 - nofile 65535(只es用户生效)
用户名 - nproc 32000(只es用户生效)
内存配置。/etc/systemd/system.conf(可选)
DefaultLimitMEMLOCK=infinity(若bootstrap.memory_lock为true需添加此项)
6、手动安装非.deb或.rpm包安装需配置。
root身份执行sysctl vm.max_map_count=262144;
永久设置此值:修改文件vim /etc/sysctl.conf增加一行配置vm.max_map_count = 262144。
vm.swappiness = 1
最后执行sysctl -p使其生效。
sysctl vm.max_map_count查看结果。
四、ES插件安装(可选)
1、elasticsearch-analysis-ik中分分词器安装
https://github.com/medcl/elasticsearch-analysis-ik
需maven、git环境支持,yum install -y maven、yum install -y git
git clone https://github.com/medcl/elasticsearch-analysis-ik.git
cd elasticsearch-analysis-ik/
mvn package
CP分词器jar包至xxx/elasticsearch/plugins/ik/下并解压,重启ES。
或直接执行./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.1/elasticsearch-analysis-ik-7.3.1.zip
2.elasticsearch-head插件安装(可选)
# yum install -y npm
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install
# npm run start
直接http://ip:port访问es即可
五、KIBANA安装
1、下载解压,版本与ES对应。
Wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.0-x86_64.rpm
yum install -y kibana-6.0.0-x86_64.rpm
或curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.16.2-linux-x86_64.tar.gz
2、配置 config/kibana.yml
server.port: 5601
server.host: 192.168.1.1
elasticsearch.hosts: ["http://xxx:8080"]
kibana.index: ".kibana"
i18n.locale: " zh-CN " (指定语言,English - en , Chinese - zh-CN )
elasticsearch.username: "elastic" (ES的用户密码)
elasticsearch.password: "elastic" (ES的用户密码)
(也可秘钥库形式设置账号密码
./bin/kibana-keystore create
./bin/kibana-keystore add elasticsearch.username
./bin/kibana-keystore add elasticsearch.password)
3、启动
nohup /opt/kibana/bin/kibana &
或systemctl enable kibana
systemctl start/stop/restart kibana
用ss -antlup | grep 端口号或http://IP:PORT/验证启动成功
六、logstach安装(可选)
1、解压安装,,版本与ES对应。
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.15.0.zip unzip logstash-6.2.3.zip 或tar -zvxf logstash-7.2.1.tar.gz
或curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.15.0.tar.gz
或sudo yum install logstash(具体步骤参见官方指导https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)
2、创建规划logs、date文件目录
3、配置
配置/config/logstash.yml
http.host: "ELK1"
path.data: /data/logstash/data
path.logs: /data/logstash/logs
config.reload.automatic:true
xpack.monitoring.enabled: true #kibana监控插件中启动监控logstash
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: {密码}
xpack.monitoring.elasticsearch.hosts: ["xx.x.x.xx:9200","xx.x.x.xx:9200","xx.x.x.xx:9200"]
创建配置文件xxx.conf
(其中账号密码可以用key-store管理,K-V形式记录,eg:执行./bin/logstash-keystore add logKey,配置里写”${logKey }”)
配置样例如下:
input {
file {
path => "/usr/share/tomcat/logs/*.log"
start_position => beginning
}
}
filter {
}
output {
elasticsearch {
hosts => ["localhost:9200"]
user => "${LS_USER}"
password => "${LS_PWD}"
}
}
index => "all_error-%{+YYYY.MM.dd}"
}
}
3、启动
sh logstash -f 配置文件 --path.data=/xx/xx/logs &
或nohup /usr/local/elk/logstash-7.2.1/bin/logstash -f /usr/local/elk/logstash-7.2.1/logstash.conf &
基于Docker集群搭建
一、docker搭建ES集群
1、简单搭建单节点
拉取镜像
docker pull elasticuser:7.14.0
启动docker服务
docker run -d --name myes -p 26001:26001 -p 26000:26000 -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -e "discovery.type=single-node" elasticsearch:7.14.0
cluster.name: "xxxx"
network.host: 0.0.0.0(高版本用"0")
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.zen.minimum_master_nodes: 1
说明:
--name 名称 :给容器起个名字
-p 外部访问端口:容器端口 :26001是供htpp访问端口,26000是供tcp访问的端口,如果不做端口映射,浏览器就不能访问elasticsearch的服务
--network 网络名:用于多个服务通信与隔离,例如用kibana连接elasticsearch就需要他们在同一个网络
-e 配置,内存配置不可少
重启ES
docker restart es
验证ES,浏览器访问http://IP:26001(iP为容器ip,docker inspect容器名 查询容器ip)
2、集群搭建
1、规划目录,并赋予权限
/mnt/data/elasticsearch/node1
/mnt/logs/elasticsearch/node1
chown elasticuser /mnt/logs/elasticsearch/
chown elasticuser /mnt/data/elasticsearch/
2、修改系统相关配置,详见上文三中内容
3、启动
可以通过启动方式加 -e直接配置es,例子如下:
sudo docker run --name es1 --restart=always --privileged=true -d -p 26600:26600 -p 26601:26601 --memory=2G \
-v /mnt/data/elasticsearch/node1/node1.yml:/data/note1/node1.yml \
-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \
-v /mnt/data/elasticsearch/node1/:/data/node1 \
-v /mnt/logs/elasticsearch/node1/:/logs/ \
-e cluster.name="es_cluster" \
-e node.name="node1" \
-e cluster.initial_master_nodes="node1" \
-e discovery.seed_hosts="172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801" \
-e http.port=26600 \
-e transport.tcp.port=26601 \
-e node.master=true \
-e node.data=false \
-e network.host="0.0.0.0" \
-e discovery.zen.minimum_master_nodes=2 \
elasticsearch:7.14.0
sudo docker run --name es2 --restart=always --privileged=true -d -p 26700:26700 -p 26701:26701 --memory=2G \
-v /mnt/data/elasticsearch/node2/node2.yml:/data/note2/node2.yml \
-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \
-v /mnt/data/elasticsearch/node1/:/data/node2 \
-v /mnt/logs/elasticsearch/node1/:/logs/ \
-e cluster.name="es_cluster" \
-e node.name="node2" \
-e cluster.initial_master_nodes="node1" \
-e discovery.seed_hosts="172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801" \
-e http.port=26700 \
-e transport.tcp.port=26701 \
-e node.master=true \
-e node.data=false \
-e network.host="0.0.0.0" \
-e discovery.zen.minimum_master_nodes=2 \
elasticsearch:7.14.0
sudo docker run --name es3 --restart=always --privileged=true -d -p 26800:26800 -p 26801:26801 --memory=2G \
-v /mnt/data/elasticsearch/node3/node3.yml:/data/note3/node3.yml \
-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \
-v /mnt/data/elasticsearch/node1/:/data/node2 \
-v /mnt/logs/elasticsearch/node1/:/logs \
-e cluster.name="es_cluster" \
-e node.name="node3" \
-e cluster.initial_master_nodes="node1" \
-e discovery.seed_hosts="172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801" \
-e http.port=26800 \
-e transport.tcp.port=26801 \
-e node.master=true \
-e node.data=false \
-e network.host="0.0.0.0" \
-e discovery.zen.minimum_master_nodes=2 \
elasticsearch:7.14.0
也可启动后进入容器,修改配置文件后在重启容器。
4、验证
略
踩坑:
节点启动后报错at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured。看配置文件node1.yml有cluster.initial_master_nodes的配置,换了好多配置都不成功,后来在启动参数中加入这个参数就可以了。不知道原因。
节点全部启动后报master not discovered yet, this node has not previously joined a bootstrappe找不到主节点,类似脑裂的异常。配置文件和启动参数都增加了discovery.seed_hosts=""的配置且cluster.initial_master_nodes=["node1","node2","node3"],仍然报这个错误。后来将cluster.initial_master_nodes参数只指定一个节点,启动成功。原因不明,理论上可以多个。
二、docker搭建KIBANA
1、镜像拉取 docker pull kibana:x.x.x。
2、启动Kibana
sudo docker run -d --name mykibana --link myes:elasticsearch --restart=always --privileged=true -p 26100:26100 -v /mnt/data/kibana/:/data -e server.host="0" -e server.port=26100 -e elasticsearch.hosts=["http://172.17.0.2:26000"] -e kibana.index=".kibana" -e i18n.locale="zh-CN" -e xpack.monitoring.ui.container.elasticsearch.enabled=true -e elasticsearch.username="elastic" -e elasticsearch.password="elastic" kibana:7.14.0
踩坑:
启动kibana总是报错检索不到es版本信息,找不到es节点。在网上找了很多说的修改系统配置,不行,修改elasticsearch.hosts参数,也都不行。后来启动参数加入--link 容器名:elasticsearch参数才没有此报错。
后继续启动报链接elasticsearch:9200失败,后来经过验证,我的启动参数-e elasticsearch.hosts和-e server.port都没有生效。于是启动后进入容器手动修改kibana.yml配置然后重启才生效。不知为啥不生效。(有高手可以指导在下一下)
三、docker搭建logstash
1、创建规划目录,编写配置logstash.yml
http.host: "0.0.0.0"
path.data: /usr/share/logstash/data
path.logs: /usr/share/logstash/logs
path.config: /usr/share/logstash/config/conf.d/logstash.conf
config.reload.automatic: true
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: elastic
xpack.monitoring.elasticsearch.hosts: ["172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801"]
2、编写规划管道配置文件logstash.conf
input {
tcp {
port => 26000
type => sys_log
}
tcp {
port => 26100
type => app_log
}
}
filter {
}
output {
elasticsearch {
hosts => ["172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801"]
user => "elastic"
password => "elastic"
}
}
3、启动验证
略
踩坑:
启动成功后,验证时发现日志报message=>"No Available connections"。。。。。message=>"Elasticsearch Unreachable: [http://elasticsearch:9200/。。。。明显链接到了默认es地址,配置文件里的地址没生效。读取了默认配置,进入容器查找,发现在/usr/share/logstash/config路径下也有配置(之前路径设置的不是/usr/share/),生效的是这个。修改完地址后restart报Path "/logstash/data" must be a writable directory 。上网找了下,大致情况是这个/usr/share/logstash路径是默认的自定义的容器路径没权限或是不读,所以修改下启动命令和配置在restart。
启动成功后,日志报:
这个问题跟es的问题差不多,也是修改lvm.options将报错的GC改为G1即可。但是尝试进入容器 exec -it修改配置时总是迅速自动退出,没法改还,就很烦。。。。可以用find / -name jvm.options命令找到容器对应的jvm.options文件。然后直接vi 进行修改,再重启。