基于ES7+版本
节点
10.255.175.93
用户及目录创建
es不能用root用户启动
操作
0.创建es专门用户
# 用root操作
$ useradd es
$ passwd es # 密码 es
$ visudo
在root ALL=(ALL) ALL下边添加
es ALL=(ALL) ALL
1.创建存放es的目录(自定义)
# 用root操作
$ mkdir -p /export/es_standalone
$ chown -R es:es /export/es_standalone
安装JDK
说明 : 各版本对Java的依赖
ES5 Java8及以上
ES6.5 支持Java11
ES7 内置Java环境 无需安装
安装ES
操作
下载安装
0.浏览器访问下载安装包
# 浏览器访问
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-linux-x86_64.tar.gz
1.上传安装包
上传到目录 /export/es_standalone
2.确保安装包及目录归属es用户
$ chown -R es:es elasticsearch-7.1.0-linux-x86_64.tar.gz
3.解压
# 切换为es用户
$ su es
# 解压
$ tar -zxvf elasticsearch-7.1.0-linux-x86_64.tar.gz
配置es的JVM
$ cd /opt/wsysoftware/elasticsearch-7.1.0/config
$ vi jvm.options
将 Xmx和Xms 设置成一样 且 Xmx不超内存50% 且 不超30G # 默认1G
配置es
$ cd /opt/wsysoftware/elasticsearch-7.1.0/config
$ vi elasticsearch.yml
cluster.name: my-application # 默认 my-application
node.name: node-1 # 默认 node-1
bootstrap.memory_lock: false
network.host: 10.255.175.93
http.port: 9200 # 默认9200
discovery.seed_hosts: ["10.255.175.93"]
cluster.initial_master_nodes: ["node-1"]
es文件目录结构
bin – 描述 : 脚本文件(启动es 安装插件 统计数据等命令)
config – 描述 : 配置文件
elasticsearch.yml – 描述 : 集群配置文件(user role based配置)
jvm.options – 描述 : 修改jvm配置 – ES7.1默认1GB
data – 描述 : 数据文件(是path.data的默认目录)
jdk – 描述 : 内置Java运行环境
lib – 描述 : Java类库
logs – 描述 : 日志文件(是path.log的默认目录)
modules – 描述 : 包含所有es模块
plugins – 描述 : 所有已安装插件
启动
启动服务
$ su es
$ cd /export/es_standalone/elasticsearch-7.1.0
$ ./bin/elasticsearch
测试启动成功
# 浏览器访问es网页
10.255.175.93:9200
启动常见问题
0.修改系统虚拟内存
启动报错 : max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
原因 : 系统的最大虚拟内存太小 应调大
解决 : 永久更改系统配置 重启服务器依然生效
$ sudo vi /etc/sysctl.conf
在最后一行添加
vm.max_map_count=262144
$ sudo sysctl -p
1.修改打开文件数限制
启动报错 : max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
原因 : ES因为需要大量的创建索引文件 需要打开大量系统文件 应解除系统的打开文件的最大数目限制
解决
$ sudo vi /etc/security/limits.conf
结尾追加如下两行
* soft nofile 65536
* hard nofile 65536
有时重新连接Secure才生效
测试是否生效
$ ulimit -n
# 结果是 65536 即生效 ; 结果是1024 这是默认值 即未生效
2.修改可用最大线程数
启动报错 : max number of threads [1024] for user [es] likely too low, increase to at least [4096]
原因 : 用户最大可创建线程数太小 无法创建本地线程
解决
$ sudo vi /etc/security/limits.conf
结尾追加如下两行
* soft nproc 4096
* hard nproc 4096
3.ES的一个bug
启动报错 : system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
原因 :因为Centos不支持SecComp 而ES默认bootstrap.system_call_filter为true进行检测 检测失败 导致ES不能启动
解决
$ vi elasticsearch.yml
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
4.discovery相关报错
启动报错 : org.elasticsearch.discovery.MasterNotDiscoveredException
原因 : 主节点未被发现 elasticsearch.yml集群配置有问题
解决
$ vi elasticsearch.yml
discovery.seed_hosts: ["10.255.175.93"]
cluster.initial_master_nodes: ["node-1"]
关闭服务/删除进程
$ ps | grep elasticsearch
$ kill pid
在一台服务器上 用docker部署2个ES实例的容器 使2个容器形成2个节点的ES集群 ; 同时在其中一个ES容器中部署kibana 和 cerebro
版本ES7.2.0 kibana7.2.0 cerebro0.8.3
使用docker-compose一键部署
节点
10.255.175.93
安装docker
见 docker专题
docker配置阿里云镜像加速
见 docker专题
安装docker-compose
见 docker专题
一键部署
创建目录(自定义)
$ mkdir -p /opt/wsysoftware/
编写docker-compose.yml配置文件
$ cd /opt/wsysoftware/
$ vi docker-compose.yml
内容如下 :
version: '2.2'
services:
cerebro:
image: lmenezes/cerebro:0.8.3
container_name: cerebro
ports:
- "9000:9000"
command:
- -Dhosts.0.host=http://elasticsearch:9200
kibana:
image: kibana:7.2.0
container_name: kibana7
environment:
- I18N_LOCALE=zh-CN
- XPACK_GRAPH_ENABLED=true
- TIMELION_ENABLED=true
- XPACK_MONITORING_COLLECTION_ENABLED="true"
ports:
- "5601:5601"
elasticsearch:
image: elasticsearch:7.2.0
container_name: es7_01
environment:
- cluster.name=wsyes
- node.name=es7_01
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01
- cluster.initial_master_nodes=es7_01,es7_02
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es7data1:/usr/share/elasticsearch/data
ports:
- 9200:9200
elasticsearch2:
image: elasticsearch:7.2.0
container_name: es7_02
environment:
- cluster.name=wsyes
- node.name=es7_02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01
- cluster.initial_master_nodes=es7_01,es7_02
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es7data2:/usr/share/elasticsearch/data
volumes:
es7data1:
driver: local
es7data2:
driver: local
启动
$ cd /opt/wsysoftware/
$ docker-compose up
测试
访问es的web
# 浏览器访问
10.255.175.93:9200
# 浏览器访问 查看集群状态
http://10.255.175.93:9200/_cat/nodes?v
前提 每个服务器都需要有外网
节点
10.255.175.240 ESnode1 Kibana cerebro
10.255.175.241 ESnode2
10.255.175.242 ESnode3
安装目录
/opt/software/docker_es7_dir01
部署操作
操作240节点
0.关闭防火墙
$ systemctl stop firewalld
1.禁止开机启动防火墙
$ systemctl disable firewalld.service
2.修改主机名
$ vi /etc/hostname
第一行改为
clickhouse1
我的主机名就叫clickhouse1 别的服务在用 就不改了
3.重启服务器
$ reboot
4.查看主机名
$ hostname
5.修改主机名与IP映射
$ vi /etc/hosts
添加以下3行
10.255.175.240 clickhouse1
10.255.175.241 clickhouse2
10.255.175.242 clickhouse3
6.配置所有节点免密登录
# 见 linux部署文章
7.创建项目目录结构
$ mkdir -p /opt/software/docker_es7_dir01
$ cd /opt/software/docker_es7_dir01
$ vi docker-compose.yml
内容如下 :
version: '3'
services:
cerebro:
image: lmenezes/cerebro:0.8.3
container_name: cerebro
ports:
- 9000:9000
command:
- -Dhosts.0.host=http://elasticsearch:9200
depends_on:
- elasticsearch
elasticsearch:
image: elasticsearch:${ELK_VERSION}
container_name: elasticsearch${ELK_VERSION}
restart: always
environment:
- ES_JAVA_OPTS=${ES_JVM_OPTS}
volumes:
- ${ES_CONF}:/usr/share/elasticsearch/config/elasticsearch.yml
- ${DATA_DIR}:/usr/share/elasticsearch/data/
- ${LOGS_DIR}:/usr/share/elasticsearch/logs/
- ${X_PACK}:/usr/share/elasticsearch/config/certs/
ports:
- 9200:9200
- 9300:9300
ulimits:
memlock:
soft: -1
hard: -1
kibana:
image: kibana:${ELK_VERSION}
container_name: kibana${ELK_VERSION}
environment:
- I18N_LOCALE=zh-CN
- XPACK_GRAPH_ENABLED=true
- TIMELION_ENABLED=true
- XPACK_MONITORING_COLLECTION_ENABLED="true"
# - ELASTICSEARCH_USERNAME="elastic"
# - ELASTICSEARCH_PASSWORD="123qwe"
restart: always
ports:
- 5601:5601
depends_on:
- elasticsearch
$ vi .env
内容如下 :
# set x-pack
X_PACK=/es7/certs/
# set es
ES_JVM_OPTS=-Xms512m -Xmx512m
DATA_DIR=/es7/data/
LOGS_DIR=/es7/logs/
ES_CONF=./es-config/elasticsearch.yml
# set elk version
ELK_VERSION=7.2.0
$ mkdir es-config
$ vi es-config/elasticsearch.yml
内容如下 :
# ======================== Elasticsearch Configuration =========================
#### x-pack ####
# 开启
#xpack.security.enabled: true
#xpack.security.transport.ssl.enabled: true
#xpack.security.transport.ssl.verification_mode: certificate
#xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
#xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
###### 集群必须配置 ######
# 集群名 (for node join cluster)
cluster.name: es-cluster
# 节点名 (hostname)
node.name: clickhouse1
# 集群所有IP列表 (IP或hostanme)
discovery.seed_hosts: 10.255.175.240,10.255.175.241,10.255.175.242
# 可选主的节点列表
cluster.initial_master_nodes: 10.255.175.240,10.255.175.241,10.255.175.242
# set both bind_host and publish_host (值必须0.0.0.0)
network.host: 0.0.0.0
# 显示指定 本机和其他节点通信的IP
network.publish_host: 10.255.175.240
# 是否支持跨域
http.cors.enabled: true
# 支持所有域名
http.cors.allow-origin: "*"
###### 优化配置 ######
# 有主节点资格并相互连接的节点的最小数目 (值 = 总节点数/2+1 . for 防止脑裂 10个节点的集群 每个节点都有选主资格 设置为6 ; 正常情况 6个节点互连可形成集群 ; 某刻 挂了3个节点 剩下7个节点可形成集群 忽然断开的3个节点恢复了 他们仨<=6 不能形成一个自己的集群 防止了脑裂)
#discovery.zen.minimum_master_nodes: 2
# 锁定ES物理内存地址不被其他使用 (for 不锁定 es内存会被其他应用使用 es只能频繁和硬盘交互)
#bootstrap.memory_lock: true
# 集群达到多少个节点后再恢复数据 (for 通过这个设置可以避免集群自动相互发现的初期,shard分片不全的问题,假如es集群内一共有5个节点,就可以设置为5,那么这个集群必须有5个节点启动后才会开始数据分片,如果设置为3,就有可能另外两个节点没存储数据分片)
#gateway.recover_after_nodes: 2
8.创建挂载目录及赋权
$ mkdir -p /es7/data && mkdir -p /es7/logs && mkdir -p /es7/certs && chmod -R 775 /es7/data/ && chmod -R 775 /es7/logs && chmod -R 775 /es7/certs/ && chown -R 1000:1000 /es7/data/ && chown -R 1000:1000 /es7/logs/ && chown -R 1000:1000 /es7/certs/
9.安装docker 启动 配置镜像加速器 安装docker-compose
# 见 docker系列文章
10.测试配置文件docker-compose.yml是否正确
$ docker-compose config
操作241节点 (部署步骤和240一样 不一样处如下 : 主机名 docker-compose.yml elasticsearch.yml两个配置文件内容不同)
2.修改主机名
$ vi /etc/hostname
第一行改为
clickhouse2
我的主机名就叫clickhouse2 别的服务在用 就不改了
7.创建项目目录结构
$ vi docker-compose.yml
内容如下 :
version: '3'
services:
elasticsearch:
image: elasticsearch:${ELK_VERSION}
container_name: elasticsearch${ELK_VERSION}
restart: always
environment:
- ES_JAVA_OPTS=${ES_JVM_OPTS}
volumes:
- ${ES_CONF}:/usr/share/elasticsearch/config/elasticsearch.yml
- ${DATA_DIR}:/usr/share/elasticsearch/data/
- ${LOGS_DIR}:/usr/share/elasticsearch/logs/
- ${X_PACK}:/usr/share/elasticsearch/config/certs/
ports:
- 9200:9200
- 9300:9300
ulimits:
memlock:
soft: -1
hard: -1
$ vi es-config/elasticsearch.yml
更改处如下 :
# 节点名
node.name: clickhouse2
# 显示指定 本机和其他节点通信的IP
network.publish_host: 10.255.175.241
操作242节点 (部署步骤和240一样 不一样处如下 : 主机名 docker-compose.yml elasticsearch.yml两个配置文件内容不同)
2.修改主机名
$ vi /etc/hostname
第一行改为
clickhouse3
我的主机名就叫clickhouse3 别的服务在用 就不改了
7.创建项目目录结构
$ vi docker-compose.yml
内容如下 :
同241节点
$ vi es-config/elasticsearch.yml
更改处如下 :
# 节点名
node.name: clickhouse3
# 显示指定 本机和其他节点通信的IP
network.publish_host: 10.255.175.242
启动服务
每个节点都执行
永久调大系统虚拟内存 重启服务器依然生效
$ sudo vi /etc/sysctl.conf
在最后一行添加
vm.max_map_count=262144
# 重新加载配置文件
$ sudo sysctl -p
启动所有服务
# 启动
$ cd /opt/elkDocker/
$ docker-compose up
我这里用的是CentOS版的Logstash7.2.0
(docker版和docker-compose版的logstash我测试可以安装成功 启动成功 但是往ES中导数据没有反应 也不报错 管道中配置stdin入 stdout出也没反应… 还未找到原因 有小伙伴可以成功使用 欢迎留言交流)
节点
部署节点选择 : logstash可独立部署 无任何依赖 ; 如使用logstash的目的是频繁向ES集群导入数据 可将logstash安装在ES集群的一个节点上 减少网络开销
10.255.175.240
安装目录
/opt/software/centos_logstash7_dir
安装JDK
见 linux部署文章
安装Logstash
下载安装包
$ mkdir -p /opt/software/centos_logstash7_dir
$ cd /opt/software/centos_logstash7_dir
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.tar.gz
解压
$ tar -zxvf logstash-7.2.0.tar.gz
```bash
$ cd /opt/software/centos_logstash7_dir/logstash-7.2.0
$ ./bin/logstash -e 'input { stdin { } } output { stdout {} }' # -e 指定管道 作用为 终端输入 终端输出
```
示例0 : 终端输入终端输出
# 启动后 最后一行出现port=>9600时 在终端输入 hello world
0.准备测试数据
$ mkdir -p /opt/software/centos_logstash7_dir/logstash-7.2.0/wsytestdata
上传movies.csv文件到此目录下
# movies.csv文件来源 : https://grouplens.org/datasets/movielens/
1.配置管道
新增配置文件
# 配置文件位置 自定义
# 配置文件名 自定义
$ mkdir -p /opt/wsysoftware/logstash-7.2.0/pipline
$ vi logstash.conf
内容如下 :
input {
file {
path => "/opt/software/centos_logstash7_dir/logstash-7.2.0/wsytestdata/movies.csv"
start_position => "beginning" # 这两行配置使每次读movies.csv文件数据都从头读
sincedb_path => "/dev/null" # 这两行配置使每次读movies.csv文件数据都从头读
}
}
filter {
csv {
separator => ","
columns => ["id","content","genre"]
}
mutate {
split => { "genre" => "|" }
remove_field => ["path", "host","@timestamp","message"]
}
mutate {
split => ["content", "("]
add_field => { "title" => "%{[content][0]}"}
add_field => { "year" => "%{[content][1]}"}
}
mutate {
convert => {
"year" => "integer"
}
strip => ["title"]
remove_field => ["path", "host","@timestamp","message","content"]
}
}
output {
elasticsearch {
hosts => "http://10.255.175.93:9200"
index => "movies"
document_id => "%{id}"
}
stdout {}
}
测试配置文件是否正确
$ cd /opt/software/centos_logstash7_dir/logstash-7.2.0/
$ sudo ./bin/logstash -t -f pipline/logstash.conf
2.指定配置文件启动
$ cd /opt/software/centos_logstash7_dir/logstash-7.2.0/
$ sudo bin/logstash -r -f pipline/logstash.conf
```bash
$ control c
```
基于上文的 ES分布式集群 + kibana + cerebro
# 操作每个节点
$ vi elasticsearch.yml
增加
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
1.重启所有ES
2.操作240的ES的docker
# 生成CA
$ ./bin/elasticsearch-certutil ca
# 一直回车
# 生成私钥
$ ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 一直回车
# 移动到指定目录
$ mv elastic-* config/certs/
# 赋权
$ chmod -R 775 elastic-*
$ chown -R 1000:1000 elastic-*
3.240节点宿主机的ca和p12文件copy到其他节点并赋权
$ scp /es7/certs/elastic-* es02:/es7/certs/
$ scp /es7/certs/elastic-* es03:/es7/certs/
$ ssh es02 && cd /es7/certs/ && chmod -R 775 elastic-* && chown -R 1000:1000 elastic-*
$ ssh es03 && cd /es7/certs/ && chmod -R 775 elastic-* && chown -R 1000:1000 elastic-*
4.操作每个节点的elasticsearch.yml
$ vi elasticsearch.yml
增加
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
5.重启所有ES
6.设置密码
# 操作240的ES的docker
$ ./bin/elasticsearch-setup-passwords interactive
# 需要给很多个用户设置密码 之后用用户名 elastic 密码 123qwe 进行访问
# 浏览器访问
10.255.175.240:9200
# 需要输入用户名和密码
# 操作240
$ vi docker-compose.yml
kibana的environment中增加es的用户名密码
- ELASTICSEARCH_USERNAME="elastic"
- ELASTICSEARCH_PASSWORD="123qwe"
当配置的管道的input输入 或 output输出 有X-PACK安全认证的ES时 加上用户名 密码即可
给管道配置文件加ES用户名密码
$ mkdir -p /opt/wsysoftware/logstash-7.2.0/config/wsyconf
$ vi logstash.conf
内容如下 :
input {
stdin { }
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["10.255.175.240:9200"]
user => "elastic"
password => "123qwe"
}
}
重启logstash
0.ES启动报错ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
原因 : 系统的最大虚拟内存太小 应调大
解决 : 永久更改系统配置 重启服务器依然生效
$ sudo vi /etc/sysctl.conf
在最后一行添加
vm.max_map_count=262144
$ sudo sysctl -p
1.启动报错 gc.log
$ mkdir -p /es7/data && mkdir -p /es7/logs && mkdir -p /es7/certs && chmod -R 775 /es7/data/ && chmod -R 775 /es7/logs && chmod -R 775 /es7/certs/ && chown -R 1000:1000 /es7/data/ && chown -R 1000:1000 /es7/logs/ && chown -R 1000:1000 /es7/certs/
2.ES启动报错 “stacktrace”: [“org.elasticsearch.action.search.SearchPhaseExecutionException: all shards failed”
解决
3.开启2行x-pack 启动报错 “message”: “exception caught on transport layer [Netty4TcpChannel{localAddress=0.0.0.0/0.0.0.0:9300, remoteAddress=/10.255.175.229:47652}], closing connection” , elasticsearch7.2.0 | “stacktrace”: [“io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: No available authentication scheme”
解决
4.x-pack配置后启动报错
解决
$ chmod -R 775 文件名
$ chown -R 1000:1000 文件名
参考
阮一名资料
官方文档
百度