核心概念

集群

  • 一个集群可以有一个或者多个节点
  • 不同的集群通过不同的集群名来区分,默认是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

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐