【ElasticSearch】【ES启用安全认证】【ES集群搭建】和【ELK日志集成】
节点:一个运行中的 Elasticsearch 实例称为一个节点。
集群:由一个或者多个拥有相同 cluster.name 配置的节点组成共同承担数据和负载的压力的集群。
索引:保存相关数据的地方,是指向一个或者多个物理分片的逻辑命名空间。
分片:一个分片是一个底层的工作单元,它仅保存了全部数据中的一部分。Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。一个分片可以是主分片或者副本分片,主分片的数目在索引创建时就已经确定了下来。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档,但是实际最大值还需要参考你的使用场景。创建索引时指定主分片和副本分片的数量。
主分片 number_of_shards 副本分片 number_of_replicas PUT /blogs { "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 } }
在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群。让我们把副本数从默认的 1 增加到 2 : PUT /blogs/_settings { "number_of_replicas" : 2 }
参考:https://www.jianshu.com/p/7540ebec4096
集群健康状况
GET /_cluster/health
curl -XGET http://localhost:9200/_cluster/health?pretty
{ "cluster_name" : "elasticsearch-cluster", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 3, "active_primary_shards" : 109, "active_shards" : 218, "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.0 }
status:集群状态,分为green、yellow和red。
number_of_nodes/number_of_data_nodes:集群的节点数和数据节点数。
active_primary_shards:集群中所有活跃的主分片数。
active_shards:集群中所有活跃的分片数。
relocating_shards:当前节点迁往其他节点的分片数量,通常为0,当有节点加入或者退出时该值会增加。
initializing_shards:正在初始化的分片。
unassigned_shards:未分配的分片数,通常为0,当有某个节点的副本分片丢失该值就会增加。
number_of_pending_tasks:是指主节点创建索引并分配shards等任务,如果该指标数值一直未减小代表集群存在不稳定因素
active_shards_percent_as_number:集群分片健康度,活跃分片数占总分片数比例。
number_of_pending_tasks:pending task只能由主节点来进行处理,这些任务包括创建索引并将shards分配给节点。
集群状态信息
GET _cluster/stats?pretty
curl -XGET http://localhost:9200/_cluster/stats?pretty
indices.count:索引总数。
indices.shards.total:分片总数。
indices.shards.primaries:主分片数量。
docs.count:文档总数。
store.size_in_bytes:数据总存储容量。
segments.count:段总数。
nodes.count.total:总节点数。
nodes.count.data:数据节点数。
nodes. process. cpu.percent:节点CPU使用率。
fs.total_in_bytes:文件系统使用总容量。
fs.free_in_bytes:文件系统剩余总容量。
节点监控
GET _cluster/stats?pretty
curl -XGET http://localhost:9200/_cluster/stats?pretty
name:节点名。
roles:节点角色。
indices.docs.count:索引文档数。
segments.count:段总数。
jvm.heap_used_percent:内存使用百分比。
thread_pool.{bulk, index, get, search}.{active, queue, rejected}:线程池的一些信息,包括bulk、index、get和search线程池,主要指标有active(激活)线程数,线程queue(队列)数和rejected(拒绝)线程数量。
查看节点信息
GET _cat/nodes?pretty
curl -XGET http://localhost:9299/_cat/nodes?pretty
集群名称:YCXESClusterName
主节点名称:YCXESNodeMaster 192.168.1.35
从节点名称:YCXESNodeSlaveA 192.168.1.36
从节点名称:YCXESNodeSlaveB 192.168.1.37
################
搭建集群
################
1、Elasticsearch
下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-10-0
安装目录 /ycx/elasticsearch
查看版本:./elasticsearch --version
单节点
cluster.name: YCXESClusterName
node.name: YCXESNodeName
node.master: true
node.data: true
path.data: /ycx/elasticsearch/master_node/data
path.logs: /ycx/elasticsearch/master_node/logs
network.host: 0.0.0.0
network.publish_host: 192.168.1.30
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["192.168.1.30:9300"]
cluster.initial_master_nodes: ["YCXESNodeName"]
单节点配置
discovery.type: single-node
集群主节点
# 集群名称必须相同 cluster.name: YCXESClusterName # 节点名称 node.name: YCXESNodeMaster # 是否是master节点 node.master: true # 是否允许该节点存储索引数据 node.data: true # 最大集群节点数 node.max_local_storage_nodes: 3 # 数据目录 path.data: /ycx/elasticsearch/master_node/data # 日志目录 path.logs: /ycx/elasticsearch/master_node/logs # 快照数据存放路径 path.repo: ["/ycx/elasticsearch/backup"] # 绑定地址 network.host: 0.0.0.0 # http端口 http.port: 9200 # 内部节点之间沟通端口 transport.tcp.port: 9300 # 集群主机列表 discovery.seed_hosts: ["192.168.1.35:9300","192.168.1.36:9300","192.168.1.37:9300"] # 启动全新的集群时需要此参数,再次重新启动时此参数可免 cluster.initial_master_nodes: ["YCXESNodeMaster"] # 是否开启跨域访问 http.cors.enabled: true # 开启跨域访问后的地址限制,*表示无限制 http.cors.allow-origin: "*"
集群从节点A
# 集群名称必须相同 cluster.name: YCXESClusterName # 节点名称 node.name: YCXESNodeSlaveA # 是否是master节点 node.master: false # 是否允许该节点存储索引数据 node.data: true # 最大集群节点数 node.max_local_storage_nodes: 3 # 数据目录 path.data: /ycx/elasticsearch/slave_node/data # 日志目录 path.logs: /ycx/elasticsearch/slave_node/logs # 快照数据存放路径 path.repo: ["/ycx/elasticsearch/backup"] # 绑定地址 network.host: 0.0.0.0 # http端口 http.port: 9200 # 内部节点之间沟通端口 transport.tcp.port: 9300 # 集群主机列表 discovery.seed_hosts: ["192.168.1.35:9300","192.168.1.36:9300","192.168.1.37:9300"] # 启动全新的集群时需要此参数,再次重新启动时此参数可免 cluster.initial_master_nodes: ["YCXESNodeMaster"] # 是否开启跨域访问 http.cors.enabled: true # 开启跨域访问后的地址限制,*表示无限制 http.cors.allow-origin: "*"
集群从节点B
# 集群名称必须相同 cluster.name: YCXESClusterName # 节点名称 node.name: YCXESNodeSlaveB # 是否是master节点 node.master: false # 是否允许该节点存储索引数据 node.data: true # 最大集群节点数 node.max_local_storage_nodes: 3 # 数据目录 path.data: /ycx/elasticsearch/slave_node/data # 日志目录 path.logs: /ycx/elasticsearch/slave_node/logs # 快照数据存放路径 path.repo: ["/ycx/elasticsearch/backup"] # 绑定地址 network.host: 0.0.0.0 # http端口 http.port: 9200 # 内部节点之间沟通端口 transport.tcp.port: 9300 # 集群主机列表 discovery.seed_hosts: ["192.168.1.35:9300","192.168.1.36:9300","192.168.1.37:9300"] # 启动全新的集群时需要此参数,再次重新启动时此参数可免 cluster.initial_master_nodes: ["YCXESNodeMaster"] # 是否开启跨域访问 http.cors.enabled: true # 开启跨域访问后的地址限制,*表示无限制 http.cors.allow-origin: "*"
如果想要自动选举
node.master: true
cluster.initial_master_nodes: ["YCXESNodeMaster","YCXESNodeSlaveA","YCXESNodeSlaveB"]
启用安全认证
停止ES后做如下配置
生成CA证书,证书密码:123456
# ES根产生 elastic-stack-ca.p12
./elasticsearch-certutil ca
# ES根生成 elastic-certificates.p12,然后复制文件到每一个ES集群节点的config目录和logstash的config目录。集群每一个节点都使用相同的证书进行认证
./elasticsearch-certutil cert --ca elastic-stack-ca.p12
配置文件追安全配置,每一个集群节点配置文件都追加
# 启用安全
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
将密码存储在Elasticsearch密钥库中
# 如果在创建节点证书时输入了密码,请在每一个集群节点都运行以下命令将密码存储在Elasticsearch密钥库中
./elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
启动ES
设置ES集群密码密码:内置账号:elastic,密码:es123456,集群只需要执行一次就可以
./elasticsearch-setup-passwords interactive
结果
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
安全配置就完成了,访问地址 http://localhost:9200 就会弹出输入账号密码的提示
修改密码
curl -H "Content-Type:application/json" -XPOST -u elastic 'http://localhost:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'
其他注意项:
也可以使用自动生成的随机密码
./elasticsearch-setup-passwords auto
有关 #xpack.security.transport.ssl.client_authentication: required 配置的文章 https://www.elastic.co/guide/en/elasticsearch/reference/7.13/pki-realm.html
设置用户和组
# 设置用户和组 解决elasticsearch启动异常: can not run elasticsearch as root groupadd es useradd es -g es passwd es chown -R es:es elasticsearch chmod -R 777 elasticsearch su es
启动脚本
#!/bin/bash export ES_HOME=/ycx/elasticsearch case $1 in start) su es<<! cd $ES_HOME ./bin/elasticsearch -d -p pid exit ! echo "elasticsearch is started" ;; stop) pid=`cat $ES_HOME/pid` kill -9 $pid echo "elasticsearch is stopped" ;; restart) pid=`cat $ES_HOME/pid` kill -9 $pid echo "elasticsearch is stopped" sleep 1 su es<<! cd $ES_HOME ./bin/elasticsearch -d -p pid exit ! echo "elasticsearch is started" ;; *) echo "start|stop|restart" ;; esac exit 0
常见错误
1、异常: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] 解决: vim /etc/security/limits.conf 追加 * soft nofile 65536 * hard nofile 65536 退出重新登录后查看 ulimit -Sn ulimit -Hn 2、异常: max number of threads [3818] for user [es] is too low, increase to at least [4096] 解决: vim /etc/security/limits.conf 追加 * soft nproc 4096 * hard nproc 4096 退出重新登录后查看 ulimit -Sn ulimit -Hn 3、异常: 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=655360 生效 sysctl -p 4、异常: Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/elasticsearch/elasticsearch-6.2.2-1/config/jvm.options elasticsearch用户没有该文件夹的权限,执行命令 chown -R es:es /ycx/elasticsearch/
2、Kibana
下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-14-3
安装:解压下载的zip,安装目录 /ycx/kibana
运行:
# Linux
./kibana --allow-root
# Windows
kibana.bat
查看版本:./kibana --allow-root --version
编辑 conf/kibana.yml
# 绑定端口 server.port: 5601 # 绑定地址 server.host: "0.0.0.0"
#Kibana UI访问前缀
#server.basePath: "/kibana"
# 显示的服务名称 server.name: "ycx-kibana" # elasticsearch 地址 elasticsearch.hosts: ["http://localhost:9200"] # 中文 i18n.locale: "zh-CN"
启用安全认证
配置文件追加安全配置
elasticsearch.username: "kibana_system"
#elasticsearch.password: "123456"
创建 Kibana 秘钥库
./kibana-keystore create
将 kibana_system 用户的密码添加到 kibana 密钥库
./kibana-keystore add elasticsearch.password
启动脚本
#!/bin/bash
nohup /elk/kibana/bin/kibana --allow-root &
3、Logstash
下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-7-13-4
安装:解压下载的zip,安装目录 /ycx/logstash
运行:
# Linux
logstash -f ../config/logstash.conf
# Windows
logstash.bat -f ../config/logstash.conf
查看版本:./logstash --version
logstash.conf 配置:
input { tcp { mode => "server" host => "0.0.0.0" port => 5044 codec => json_lines } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{appName}-%{+YYYY.MM.dd}" } }
appName是自定义的变量
<springProperty scope="context" name="appName" source="spring.application.name"/>
启用安全认证
output增加 user, password, ssl_certificate_verification, truststore, truststore_password
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{appName}-%{+YYYY.MM.dd}"
user => "elastic"
password => "es123456"
ssl_certificate_verification => true
truststore => "/ycx/logstash/config/elastic-certificates.p12"
truststore_password => "123456"
}
}
启动脚本
#!/bin/bash
nohup /elk/logstash/bin/logstash -f /elk/logstash/config/logstash.conf &
4、elk 处理日志
添加依赖
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </dependency>
logback-elk.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" debug="false"> <!-- 服务名称 --> <springProperty scope="context" name="appName" source="spring.application.name"/> <!-- 日志索引文件前缀 --> <springProperty scope="context" name="logstashIndexPrefix" source="logstash.indexPrefix" defaultValue="ycx"/> <!-- logstash地址 --> <springProperty scope="context" name="logstashHost" source="logstash.host"/> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!--控制台的日志输出样式--> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> </appender> <!-- 为logstash输出的JSON格式的Appender --> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${logstashHost}</destination> <!-- 日志输出编码 --> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <providers> <timestamp> <timeZone>UTC</timeZone> </timestamp> <pattern> <pattern> { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } </pattern> </pattern> </providers> </encoder> </appender> <!-- 特殊处理 --> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <logger name="ycx.**" level="DEBUG"/> <!-- 开发、默认环境 只输出到控制台 --> <springProfile name="dev"> <root level="debug"> <appender-ref ref="logstash" /> </root> </springProfile> <!-- 测试环境 正式环境 输出info及以上日志 --> <springProfile name="test,prod"> <root level="debug"> <appender-ref ref="logstash" /> </root> </springProfile> </configuration>
yml 文件配置 或在 nacos 中配置
logstash: host: logstash:5044 #端口是启动logstash时config文件中指定的 logging: config: classpath:logback-elk.xml level: root: error ycx: info
##########
docker搭建
##########
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.4 docker run -d --restart=always -m=32g --name elasticsearch --network deyatech -p 9299:9200 -p 9300:9300 --privileged=true -v /deya/data/elasticsearch/data:/var/lib/elasticsearch -v /deya/data/elk/IKAnalyzer.cfg.xml:/etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml -v /etc/localtime:/etc/localtime -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms4096m -Xmx8192m" docker.elastic.co/elasticsearch/elasticsearch:7.13.4 #安装分词插件 https://github.com/medcl/elasticsearch-analysis-ik docker exec -it elasticsearch bash cd /usr/share/elasticsearch/bin elasticsearch-plugin install https://test.deyatong.com/elasticsearch-analysis-ik-7.13.4.zip #安装拼音插件 https://github.com/medcl/elasticsearch-analysis-pinyin docker exec -it elasticsearch bash cd /usr/share/elasticsearch/bin elasticsearch-plugin install https://test.deyatong.com/elasticsearch-analysis-pinyin-7.13.4.zip
ELK完整的基础认证
============================================
ES
============================================
nacos 配置添加账户密码
userName: elastic
password: es123456
【停止所有ES节点】
ps -ef | grep elasticsearch
1、生成CA证书:证书密码 123456,生成文件存放在ES的根目录
# 产生 elastic-stack-ca.p12
./elasticsearch-certutil ca
# 生成 elastic-certificates.p12,
./elasticsearch-certutil cert --ca elastic-stack-ca.p12
复制 elastic-certificates.p12 文件到ES集群的【每一个节点】的config目录和logstash的config目录
2、修改配置文件:elasticsearch.yml
# 启用安全
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
3、将密码存储在Elasticsearch密钥库中,证书密码:123456
# 如果在创建节点证书时输入了密码,请在【每一个集群节点都运行以下命令】
# 将密码存储在Elasticsearch密钥库中
./elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
4、设置用户和组【每一个集群节点】
cd /ycx
groupadd es
useradd es -g es
passwd es
chown -R es:es elasticsearch
chmod -R 777 elasticsearch
【启动ES集群每一个节点】
cd /ycx/shell
./es.sh start
5、设置ES集群密码密码:内置账号:elastic 密码:es123456,集群只需要【执行一次】就可以
./elasticsearch-setup-passwords interactive
============================================
kibana
============================================
【停止kibana】
1、修改配置文件:kibana.yml
# 绑定端口
server.port: 5601
# 绑定地址
server.host: "localhost"
# 显示的服务名称
server.name: "kibana"
# elasticsearch 地址
elasticsearch.hosts: ["http://localhost:9201"]
# 中文
i18n.locale: "zh-CN"
elasticsearch.username: "kibana_system"
2、创建 Kibana 秘钥库
./kibana-keystore create
3、将 kibana_system 用户的密码添加到 kibana 密钥库 密码:es123456
./kibana-keystore add elasticsearch.password
【启动kibana】
./kibana --allow-root
代理访问kibana
在server内
location /kibana/ {
proxy_pass http://localhost:5601/; # 后缀带/标识绝对目录,不会带/kibana/
}
单独建server
server {
listen 80;
server_name kibana.mydomain.cn;
location / {
proxy_pass http://172.17.0.1:5601/;
}
}
============================================
logstash
============================================
证书密码 123456
修改配置文件:logstash.conf
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://localhost:9201"]
index => "%{appName}"
user => "elastic"
password => "es123456"
ssl_certificate_verification => true
truststore => "/ycx/logstash/config/elastic-certificates.p12"
truststore_password => "123456"
}
}
启动 logstash
./logstash -f /ycx/logstash/config/logstash.conf