【ElasticSearch】【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

 

posted @ 2021-08-15 22:30  翠微  阅读(427)  评论(0编辑  收藏  举报