分布式系统的可用性与扩展性:
高可用性
服务可用性-允许有节点停止服务
数据可用性-部分节点丢失,不会丢失数据
可扩展性
请求量提升/数据的不断增长(将数据分布到所有节点上)
ES集群架构的优势:
提高系统的可用性,部分节点停止服务,整个集群的服务不受影响
存储的水平扩容
集群
一个集群可以有一个或者多个节点
不同的集群通过不同的名字来区分,默认名字“elasticsearch“
通过配置文件修改,或者在命令行中 -E cluster.name=es-cluster进行设定’
节点
节点是一个Elasticsearch的实例;本质上就是一个JAVA进程
一台机器上可以运行多个Elasticsearch进程,但是生产环境一般建议一台机器上只运行一个Elasticsearch实例
每一个节点都有名字,通过配置文件配置,或者启动时候 -E node.name=node1指定
每一个节点在启动之后,会分配一个UID,保存在data目录下
节点类型
Master Node:主节点
Master eligible nodes:可以参与选举的合格节点
node.master: false
禁止。Data Node:数据节点
Coordinating Node:协调节点
主分片(Primary Shard)
用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
一个分片是一个运行的Lucene的实例
主分片数在索引创建时指定,后续不允许修改
副本分片(Replica Shard)
用以解决数据高可用的问题。 副本分片是主分片的拷贝
副本分片数,可以动态调整
增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
# 指定索引的主分片和副本分片数
PUT /blogs
{
"settings": {
"number_of_shards": 3, #主分片
"number_of_replicas": 1 #副分片
}
}
分片的设定
对于生产环境中分片的设定,需要提前做好容量规划。
分片数设置过小,导致后续无法增加节点实现水平扩展;单个分片的数据量太大,导致数据重新分配耗时。
分片数设置过大,影响搜索结果的相关性打分,影响统计结果的准确性;单个节点上过多的分片,会导致资源浪费,同时也会影响性能
7.0 开始,默认主分片设置成1,解决了over-sharding(分片过度)的问题
集群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的详细信息
系统环境
操作系统: CentOS7,准备用户es。关闭防火墙
elasticsearch:elasticsearch-7.17.3
需要删除es下的data目录里面的节点信息,否则会加载以前的节点信息导致集群搭建失败
修改elasticsearch.yml
# 指定集群名称3个节点必须一致
cluster.name: elasticsearch
#指定节点名称,每个节点名字唯一
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端口
http.port: 9200
#指定tcp端口
transport.tcp.port: 9300
#用于节点发现
discovery.seed_hosts: ["192.168.10.111","192.168.10.112","192.168.10.114"]
#7.0新引入的配置项,初始仲裁,仅在整个集群首次启动时才需要初始仲裁。
#该选项配置为node.name的值,指定可以初始化集群主节点的名称
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
#解决跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
每个节点的配置文件,只要把node.name 修改即可,其他配置相同。
切换为es用户启动es
查看启动时候publish的地址是否是 配置文件上的地址,如果是其他地址,需要通过ifconfig把其他网关禁止。
验证集群
访问:http://192.168.10.111:9200/_cat/nodes
到此集群搭建完毕
Cerebro介绍
Cerebro 可以查看分片分配和通过图形界面执行常见的索引操作。 完全开源,并且它允许添加用户,密码或 LDAP 身份验证问网络界面。
Cerebro 基于 Scala 的Play 框架编写,用于后端 REST 和 Elasticsearch 通信。 它使用通过 AngularJS 编写的单页应用程序(SPA)前端。
项目网址:https://github.com/lmenezes/cerebro
下载地址:https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip
运行 cerebro
cerebro-0.9.4/bin/cerebro
#后台启动
nohup bin/cerebro > cerebro.log &
访问:http://192.168.10.111:9000
输入ES集群节点:http://192.168.65.192:9200,建立连接:
修改kibana配置 vim config/kibana.yml
server.port: 5601
server.host: "192.168.10.111"
elasticsearch.hosts: ["http://192.168.10.111:9200","http://192.168.10.112:9200","http://192.168.10.114:9200"]
i18n.locale: "zh-CN"
ES敏感信息泄露的原因
Elasticsearch在默认安装后,不提供任何形式的安全防护。不合理的配置导致公网可以访问ES集群。比如在elasticsearch.yml文件中,server.host配置为0.0.0.0
免费的方案
ElasticSearch集群内部的数据是通过9300进行传输的,如果不对数据加密,可能会造成数据被抓包,敏感信息泄露。
解决方案: 为节点创建证书
TLS 协议要求Trusted Certificate Authority (CA)签发x.509的证书。证书认证的不同级别:
生成节点证书
# 为集群创建一个证书颁发机构
bin/elasticsearch-certutil ca
# 为集群中的每个节点生成证书和私钥
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 移动到config目录下
mv *.p12 config/
将如上命令生成的两个证书文件拷贝到另外两个节点作为通信依据。
配置节点间通信
三个ES节点增加如下配置:
## elasticsearch.yml 配置
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
修改elasticsearch.yml配置文件,开启xpack认证机制xpack.security.enabled: true # 开启xpack认证机制
测试:
使用Curl访问ES,返回401错误curl 'localhost:9200/_cat/nodes
浏览器访问http://192.168.10.111:9200/需要输入用户名密码
为内置账号添加密码
ES中内置了几个管理其他集成组件的账号即:apm_system, beats_system, elastic, kibana, logstash_system, remote_monitoring_user,使用之前,首先需要添加一下密码。
bin/elasticsearch-setup-passwords interactive
interactive:给用户手动设置密码。
auto:自动生成密码。
所有账号密码都是123456,for后面的就是对应的账号。比如上图访问http://192.168.10.111:9200 需要登录的账号密码就是 elastic ; 123456
配置kibana账号密码
开启了安全认证之后,kibana连接es以及访问es都需要认证。修改kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "123456"
注意上面的用户名密码是kibana 访问 es集群的认证,界面登录kibana的账号密码
启动kibana服务 nohup bin/kibana &
登录的账号密码是 elastic 123456
配置cerebro账号密码
修改配置文件
vim conf/application.conf
hosts = [
{
host = "http://192.168.10.111:9200"
name = "es-cluster"
auth = {
username = "elastic"
password = "123456"
}
}
]
启动cerebro服务 nohup bin/cerebro > cerebro.log &
在开发环境中,一个节点可承担多种角色。
在生产环境中:
根据数据量,写入和查询的吞吐量,选择合适的部署方式。建议设置单一角色的节点
这种单一角色职责分离的好处:
生产环境中,建议为一些大的集群配置Coordinating Only Nodes。扮演Load Balancers,降低Master和 Data Nodes的负载;负责搜索结果的Gather/Reduce;有时候无法预知客户端会发送怎么样的请求。比如大量占用内存的操作,一个深度聚合可能会引发OOM。
增加节点水平扩展场景
一个集群总共需要多少个节点?一个索引需要设置几个分片?规划上需要保持一定的余量,当负载出现波动,节点出现丢失时,还能正常运行。
做容量规划时,一些需要考虑的因素:
评估业务的性能需求:
ES集群常见应用场景:
硬件配置:
内存大小要根据Node 需要存储的数据来进行估算
假设总数据量1T,设置一个副本就是2T总数据量
部署方式: