文章目录
- 核心概念
- 集群
- 节点
- 分片
- CAT API查看集群信息
- 搭建三节点ES集群
- 安装ES
- 安装Cerebro客户端
- 安装kibana
- ES集群安全认证
- ES敏感信息泄露的原因
- 免费的方案
- 集群内部安全通信
- 开启并配置X-Pack的认证
核心概念
集群
- 一个集群可以有一个或者多个节点
- 不同的集群通过不同的集群名来区分,默认是elasticsearch,搭建集群时需要在配置文件中修改这个
cluster.name
配置项 ,或者在命令行中 -E cluster.name=es-cluster进行设定
节点
- 节点是ElasticSearch的一个实例,节点不是指一个机器,因为一个机器可以运行多个ES进程
- 每一个节点都有一个名字,在配置文件中通过
node.name
指定 - 每一个节点在启动之后,会分配一个UID,保存在data目录下
节点类型
- Master Node:主节点
- master eligible nodes:可以参与选举的合格节点,配置文件中的配置项
node.master
,默认值是true - Data Node:数据节点,配置文件中的配置项
node.data
,默认值是true - Ingest Node:预处理节点。配置文件中的配置项
node.ingest
,默认值是true - Coordinating Node:协调节点,每个节点都默认是协调者节点
Master eligible nodes和Master Node
- 每个节点启动后,默认就是一个Master eligible节点,可以通过
node.master: false
禁止
-
Master-eligible节点可以参加选主流程,成为Master节点
-
当第一个节点启动时候,它会将自己选举成Master节点
-
每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息,其中包括:所有节点信息、所有索引信息以及相关的Mappings和Setting信息、分片的路由信息
Master Node的职责
- 处理创建,删除索引等请求,负责索引的创建与删除
- 决定分片被分配到哪个节点
- 维护并且更新Cluster State
Data Node 数据节点
-
可以保存数据的节点,叫做Data Node,负责保存分片数据。
-
节点启动后,默认就是数据节点。可以设置
node.data: false
禁止 -
由Master Node决定如何把分片分发到数据节点上
-
通过增加数据节点可以解决数据水平扩展和解决数据单点问题
Coordinating Node预处理节点
- 负责接受Client的请求, 将请求分发到合适的节点,最终把结果汇集到一起
- 每个节点默认都起到了Coordinating Node的职责
其他节点类型
-
Hot & Warm Node
-
不同硬件配置 的Data Node,用来实现Hot & Warm架构,降低集群部署的成本
-
Ingest Node
-
数据前置处理转换节点,支持pipeline管道设置,可以使用ingest对数据进行过滤、转换等操作
-
Machine Learning Node
-
负责跑机器学习的Job,用来做异常检测
-
Tribe Node
-
Tribe Node连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理
分片
在ES中,分片Shard的概念是针对索引Index的,这也是和其他中间件不同的地方
-
主分片(Primary Shard)
- 用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
- 主分片数在索引创建时指定,后续不允许修改,除非Reindex
-
副本分片(Replica Shard)
- 用以解决数据高可用的问题。 副本分片是主分片的拷贝
- 副本分片数,可以动态调整
- 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
# 指定索引的主分片和副本分片数
PUT /blogs
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
#查看集群的健康状况
GET _cluster/health
集群status
- Green: 主分片与副本都正常分配
- Yellow: 主分片全部正常分配,有副本分片未能正常分配
- Red: 有主分片未能分配。例如,当服务器的磁盘容量超过85%时,去创建了一个新的索引
CAT API查看集群信息
GET /_cat/nodes?v #查看节点信息
GET /_cat/health?v #查看集群当前状态:红、黄、绿
GET /_cat/shards?v #查看各shard的详细情况
GET /_cat/shards/{index}?v #查看指定分片的详细情况
GET /_cat/master?v #查看master节点信息
GET /_cat/indices?v #查看集群中所有index的详细信息
GET /_cat/indices/{index}?v #查看集群中指定index的详细信息
搭建三节点ES集群
安装ES
建议:每台机器先安装好单节点ES进程,并能正常运行,再修改配置,搭建集群
单机版本的搭建请参考上文,而集群和单机的区别就是需要修改配置文件
# 给各个服务器创建es 用户
adduser es
passwd es
安装版本:elasticsearch-7.17.3
切换到root用户,修改/etc/hosts
vim /etc/hosts
192.168.75.65 hs-es-node1
192.168.75.66 hs-es-node2
192.168.75.67 hs-es-node3
修改elasticsearch.yml
[es@localhost elasticsearch-7.17.3]$ vim config/elasticsearch.yml
# 指定集群名称3个节点必须一致
cluster.name: hs-es-cluster
#指定节点名称,每个节点名字唯一
node.name: node-1
#是否有资格为master节点,默认为true
node.master: true
#是否为data节点,默认为true
node.data: true
# 绑定ip,开启远程访问,可以配置0.0.0.0
network.host: 0.0.0.0
#指定web端口 默认端口9200 前端请求端口
#http.port: 9200
#指定tcp端口 集群内各个节点通信端口
#transport.tcp.port: 9300
# 用于节点发现,这里可以指定各节点服务器ip,因为我上面在本机的hosts文件中配置了域名解析,所以就直接用域名
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"]
# 初始主节点列表,用于启动新集群时选举主节点
#该选项配置为node.name的值,指定可以初始化集群节点的名称
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
# 解决跨域问题
# 是否允许跨域请求,如果设置为false,则不允许非localhost的请求
http.cors.enabled: true
http.cors.allow-origin: "*"
三个节点配置如下:
#192.168.75.65的配置
cluster.name: hs-es-cluster
node.name: node-1
node.master: true
node.data: true
network.host: 0.0.0.0
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
http.cors.enabled: true
http.cors.allow-origin: "*"
#192.168.75.66的配置
cluster.name: hs-es-cluster
node.name: node-2
node.master: true
node.data: true
network.host: 0.0.0.0
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
http.cors.enabled: true
http.cors.allow-origin: "*"
#192.168.75.67的配置
cluster.name: hs-es-cluster
node.name: node-3
node.master: true
node.data: true
network.host: 0.0.0.0
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
http.cors.enabled: true
http.cors.allow-origin: "*"
启动每个节点的ES服务
# 注意:如果运行过单节点模式,需要删除data目录, 否则会导致无法加入集群
# ES 运行如果我们没有在config/elasticsearch.yml配置文件中显示指定 path.data 和 path.logs 这两个配置项,
# 那么默认会在 ${ES_HOME}目录下创建data和log两个目录
[es@localhost elasticsearch-7.17.3]$ rm -rf ./data/
# 启动ES服务
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch -d
[es@localhost elasticsearch-7.17.3]$ ps -ef | grep elasticsearch
验证集群
http://192.168.75.65:9200/_cat/nodes?pretty
安装Cerebro客户端
需要JDK
Cerebro 可以查看分片分配和通过图形界面执行常见的索引操作。
项目网址:https://github.com/lmenezes/cerebro
下载地址:https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip
运行 cerebro
[root@localhost ~]# unzip cerebro-0.9.4.zip
[root@localhost ~]# cd cerebro-0.9.4
# 前台运行
[root@localhost cerebro-0.9.4]#cerebro-0.9.4/bin/cerebro
#后台启动
[root@localhost cerebro-0.9.4]#nohup bin/cerebro > cerebro.log &
访问:http://192.168.75.65:9000/,默认端口是9000,如果想修改可以去更改conf/application.conf
文件
输入ES集群节点:http://192.168.75.65:9200,建立连接
此时我创建一个索引
# 创建一个索引,shard分片数为3 每个分片副本数为2
PUT /sys_user
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
安装kibana
[es@localhost kibana-7.17.3-linux-x86_64]$ vim ./config/kibana.yml
server.port: 5601
server.host: "192.168.75.65"
elasticsearch.hosts: ["http://192.168.75.65:9200", "http://192.168.75.66:9200", "http://192.168.75.67:9200"]
i18n.locale: "zh-CN"
# 注意要以非root用户启动
# 后台启动
[es@localhost kibana-7.17.3-linux-x86_64]$ nohup ./bin/kibana &
#查询kibana进程
[es@localhost kibana-7.17.3-linux-x86_64]$ netstat -tunlp | grep 5601
访问:http://192.168.75.65:5601/
ES集群安全认证
参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/configuring-stack-security.html
ES敏感信息泄露的原因
- Elasticsearch在默认安装后,不提供任何形式的安全防护
- 不合理的配置导致公网可以访问ES集群。比如在elasticsearch.yml文件中,server.host配置为0.0.0.0
免费的方案
-
设置nginx反向代理
-
安装免费的Security插件
- Search Guard : https://search-guard.com/
- readonlyrest: https://readonlyrest.com/
-
X-Pack的Basic版
- 从ES 6.8开始,Security纳入x-pack的Basic版本中,免费使用一些基本的功能
集群内部安全通信
ElasticSearch集群内部的数据是通过9300进行传输的,如果不对数据加密,可能会造成数据被抓包,敏感信息泄露。
解决方案: 为节点创建证书
TLS 协议要求Trusted Certificate Authority (CA)签发x.509的证书。证书认证的不同级别:
- Certificate ——节点加入需要使用相同CA签发的证书
- Full Verification——节点加入集群需要相同CA签发的证书,还需要验证Host name 或IP地址
- No Verification——任何节点都可以加入,开发环境中用于诊断目的
1、生成节点证书
在其中一台服务器上执行下面命名,不用三台服务器都执行
[es@localhost elasticsearch-7.17.3]$ ./bin/elasticsearch-certutil ca
# 为集群中的每个节点生成证书和私钥,这里也可以不用输入密码,直接回车
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 把上方生成的两个.p12文件 移动到config目录下
[es@localhost elasticsearch-7.17.3]$ mv *.p12 ./config/
将如上命令生成的两个证书文件拷贝到另外两个节点作为通信依据。
# 拷贝到192.168.75.66 192.168.75.67 两个节点上
[es@localhost elasticsearch-7.17.3]$ scp ./config/*.p12 es@192.168.75.66:/home/es/elasticsearch-7.17.3/config
[es@localhost elasticsearch-7.17.3]$ scp ./config/*.p12 es@192.168.75.67:/home/es/elasticsearch-7.17.3/config
2、配置节点间通信
三个ES节点增加如下配置:
[es@localhost elasticsearch-7.17.3]$ vim ./config/elasticsearch.yml
# shift + G 跳至文件结尾 最后指定两个文件的位置,因为我上一步已经复制到config目录下了,所以这里就直接使用的相对路径 表示当前目录下
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
开启并配置X-Pack的认证
修改elasticsearch.yml配置文件,开启xpack认证机制,三台服务器都要执行下面的命令
[es@localhost elasticsearch-7.17.3]$ vim ./config/elasticsearch.yml
xpack.security.enabled: true # 开启xpack认证机制
重启三个节点的ES实例
[es@localhost elasticsearch-7.17.3]$ ps -ef | grep elasticsearch
[es@localhost elasticsearch-7.17.3]$ kill -9
# -d 后台启动
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch -d
测试:
# 使用Curl访问ES,返回401错误
[es@localhost elasticsearch-7.17.3]$ curl 'localhost:9200/_cat/nodes?pretty'
{
"error" : {
"root_cause" : [
{
"type" : "security_exception",
"reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",
"header" : {
"WWW-Authenticate" : "Basic realm=\"security\" charset=\"UTF-8\""
}
}
],
"type" : "security_exception",
"reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",
"header" : {
"WWW-Authenticate" : "Basic realm=\"security\" charset=\"UTF-8\""
}
},
"status" : 401
}
浏览器访问http://192.168.75.67:9200/_cat/nodes?pretty需要输入用户名密码
为内置账号添加密码
ES中内置了几个管理其他集成组件的账号即:
elastic、apm_system、kibana_system、logstash_system、beats_system、remote_monitoring_user 使用之前,首先需要添加一下密码。
三台服务器都需要执行下面的命令
# 为上面的各个用户设置密码,我这里就都设置123456
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch-setup-passwords interactive
测试
# -u 指定用户名
curl -u elastic 'localhost:9200/_cat/nodes?pretty'
配置Kibana
开启了安全认证之后,kibana连接es以及访问es都需要认证。
修改kibana.yml
[es@localhost kibana-7.17.3-linux-x86_64]$ vim ./config/kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "123456"
重新启动kibana服务
# 通过端口找kibana的运行进程号
[es@localhost kibana-7.17.3-linux-x86_64]$ netstat -tulnp | grep 5601
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 192.168.75.65:5601 0.0.0.0:* LISTEN 2066/./bin/../node/
# 直接通过查询node关键字 找kibana的进程号
[es@localhost kibana-7.17.3-linux-x86_64]$ ps -ef | grep node
es 2066 1905 1 10:32 pts/0 00:00:55 ./bin/../node/bin/node ./bin/../src/cli/dist
es 6574 6480 0 11:48 pts/1 00:00:00 grep --color=auto node
# kill
[es@localhost kibana-7.17.3-linux-x86_64]$ kill -9 2066
# 重启
[es@localhost kibana-7.17.3-linux-x86_64]$ nohup bin/kibana &
此时再连接http://192.168.75.65:5601/
,此时我们通过用户名elastic 密码为123456就能登录进去了
配置cerebro客户端
修改配置文件
[root@localhost cerebro-0.9.4]# vim conf/application.conf
hosts = [
{
host = "http://192.168.75.65:9200"
name = "hs-es-cluster"
auth = {
username = "elastic"
password = "123456"
}
}
]
启动cerebro服务
nohup bin/cerebro > cerebro.log &
进行连接:http://192.168.75.65:9000