ElasticSearch--集群搭建(十二 )

一、集群规划

搭建一个集群我们需要考虑如下几个问题:

  1. 我们需要多大规模的集群?

需要从以下两个方面考虑:
1.1 当前的数据量有多大?数据增长情况如何?
1.2 你的机器配置如何?cpu、多大内存、多大硬盘容量?
推算的依据:
ES JVM heap 最大可以设置32G 。
30G heap 大概能处理的数据量 10 T。如果内存很大如128G,可在一台机器上运行多个ES节点实例。

备注:集群规划满足当前数据规模+适量增长规模即可,后续可按需扩展。

两类应用场景:
A. 用于构建业务搜索功能模块,且多是垂直领域的搜索。数据量级几千万到数十亿级别。一般2-4台机器的规模。
B. 用于大规模数据的实时OLAP(联机处理分析),经典的如ELK Stack,数据规模可能达到千亿或更多。几十到上百节点的规模。

  1. 集群中的节点角色如何分配?
    节点角色:Master
    node.master: true 节点可以作为主节点
    DataNode 数据节点
    node.data: true 默认是数据节点。
    Coordinate node 协调节点
    如果仅担任协调节点,将上两个配置设为false。

说明:
一个节点可以充当一个或多个角色,默认三个角色都有
协调节点:一个节点只作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点。就叫协调节点

如何分配:
A. 小规模集群,不需严格区分。
B. 中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。

  1. 如何避免脑裂问题?

脑裂问题:
一个集群中只有一个A主节点,A主节点因为需要处理的东西太多或者网络过于繁忙,从而导致其他从节点ping不通A主节点,这样其他从节点就会认为A主节点不可用了,就会重新选出一个新的主节点B。过了一会A主节点恢复正常了,这样就出现了两个主节点,导致一部分数据来源于A主节点,另外一部分数据来源于B主节点,出现数据不一致问题,这就是脑裂。

尽量避免脑裂,需要添加最小数量的主节点配置:
discovery.zen.minimum_master_nodes: (有master资格节点数/2) + 1
这个参数控制的是,选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。

常用做法(中大规模集群):

  1. Master 和 dataNode 角色分开,配置奇数个master,如3

  2. 单播发现机制,配置master资格节点:
    discovery.zen.ping.multicast.enabled: false —— 关闭多播发现机制,默认是关闭的
    discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] —— 配置单播发现的主节点ip地址,其他从节点要加入进来,就得去询问单播发现机制里面配置的主节点我要加入到集群里面了,主节点同意以后才能加入,然后主节点再通知集群中的其他节点有新节点加入

  3. 配置选举发现数,及延长ping master的等待时长
    discovery.zen.ping_timeout: 30(默认值是3秒)——其他节点ping主节点多久时间没有响应就认为主节点不可用了
    discovery.zen.minimum_master_nodes: 2 —— 选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举

  4. 索引应该设置多少个分片?
    说明:分片数指定后不可变,除非重索引。
    分片对应的存储实体是什么?
      存储的实体是索引
    分片是不是越多越好?
      不是
      每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源。
      每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降。
      ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差。
    分片多有什么影响?
      分片多浪费存储空间、占用资源、影响性能。

分片设置的可参考原则:
  ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。
  在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。
  对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片。如日志管理就是一个日期的索引需求,日期索引会很多,但每个索引存放的日志数据量就很少。

  1. 分片应该设置几个副本?
    说明:副本数是可以随时调整的!
    副本的用途是什么?
      备份数据保证高可用数据不丢失,高并发的时候参与数据查询。
    针对它的用途,我们该如何设置它的副本数?
      一般一个分片有1-2个副本即可保证高可用。
    集群规模没变的情况下副本过多会有什么影响?
      副本多浪费存储空间、占用资源、影响性能。

副本设置基本原则:
  为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。
  如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。
注意:新增副本时主节点会自动协调,然后拷贝数据到新增的副本节点

二、集群搭建

  1. 3台服务器
主机名 IP
node1 192.168.77.130
node2 192.168.77.131
node3 192.168.77.132
  1. 分别安装ES
    没有说明,以下操作均指所有节点。
# 修改主机名
[root@localhost ~]# vi /etc/hosts
192.168.77.130 node1
192.168.77.131 node2
192.168.77.132 node3

# 软件安装
[root@node2 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.3.tar.gz
# 解压文件
[root@node2 ~]# tar -xzf elasticsearch-6.4.3.tar.gz -C /usr/local/
# 切换目录
[root@node2 ~]# cd /usr/local/elasticsearch-6.4.3

  1. 修改3台服务器下ES的配置(组成集群)
    elasticsearch的config目录,修改elasticsearch.yml的配置
network.host: 0.0.0.0
http.port: 9200 
transport.tcp.port: 9300

配置说明:
1)IP访问限制、默认端口修改9200
IP访问限制可以限定具体的IP访问服务器,这有一定的安全过滤作用。

network.host: 0.0.0.0

如果设置成0.0.0.0则是不限制任何IP访问。一般在生产的服务器可能会限定几台IP,通常用于管理使用。
es实例的默认端口号9200:

http.port: 9200 
transport.tcp.port: 9300

  这里的9300是集群内部通讯使用的端口,这个也可以修改掉。因为连接集群的方式有两种,通过扮演集群node也是可以进入集群的,所以还是安全起见,修改掉默认的端口。
说明:记得修改安装了ES的3台虚拟机(三个节点)的相同配置,要不然节点之间无法建立连接工作,也会报错。

  1. 集群发现IP列表、node、cluster名称
      修改集群节点IP地址,这样可以让集群在规定的几个节点之间工作。
      elasticsearch,默认是使用自动发现IP机制。就是在当前网段内,只要能被自动感知到的IP就能自动加入到集群中。这有好处也有坏处。好处就是自动化了,当你的es集群需要云化的时候就会非常方便。但是也会带来一些不稳定的情况,如,master的选举问题、数据复制问题。
      导致master选举的因素之一就是集群有节点进入。当数据复制发生的时候也会影响集群,因为要做数据平衡复制和冗余。这里面可以独立master集群,剔除master集群的数据节点能力。
      固定列表的IP发现有两种配置方式,一种是互相依赖发现,一种是全量发现。
    依赖发现:
    在192.168.77.130的elasticsearch中配置成:
# 192.168.77.130 配置
discovery.zen.ping.unicast.hosts: [ "192.168.77.131:9300","192.168.77.132:9300" ]
cluster.name: xtsz-cluster 
node.name: node-1
# 192.168.77.131 配置
discovery.zen.ping.unicast.hosts: [ "192.168.77.130:9300","192.168.77.132:9300" ]
cluster.name: xtsz-cluster 
node.name: node-2
# 192.168.77.132 配置
discovery.zen.ping.unicast.hosts: [ "192.168.77.130:9300","192.168.77.131:9300" ]
cluster.name: xtsz-cluster 
node.name: node-3

让它去发现131,132的机器,以此内推,完成剩下的131和132机器的配置。
配置下集群名称,就是你当前节点所在集群的名称,这有助于你规划你的集群。集群中的所有节点的集群名称必须一样,只有集群名称一样才能组成一个逻辑集群。

# 所有主机
cluster.name: xtsz-cluster 

配置你当前节点的名称:

node.name: node-1

  以此类推,完成另外两个节点的配置。cluster.name的名称必须保持一样。然后分别设置node.name。
说明:
  这里搭建的是一个简单的集群,没有做集群节点角色的区分,所以3个节点默认的角色有主节点、数据节点、协调节点
选举ES主节点的逻辑:
  选举的大概逻辑,它会根据分片的数据的前后新鲜程度来作为选举的一个重要逻辑。(日志、数据、时间都会作为集群master全局的重要指标)
  因为考虑到数据一致性问题,当然是用最新的数据节点作为master,然后进行新数据的复制和刷新其他node。

三、集群管理

  1. 创建用户es并设置密码
# 所有节点
[root@node2 elasticsearch-6.4.3]# adduser es
[root@node2 elasticsearch-6.4.3]# passwd es
更改用户 es 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

# 添加所有者
[root@node2 elasticsearch-6.4.3]# chown -R es:es /usr/local/elasticsearch-6.4.3

  1. 启动集群
# 所有节点使用es用户启动
[root@node2 elasticsearch-6.4.3]# su es
[es@node2 elasticsearch-6.4.3]$ ./bin/elasticsearch

  1. 安装head插件
# 启动head插件
[root@node1 elasticsearch-head]# npm run start

> elasticsearch-head@0.0.0 start /usr/local/elasticsearch-6.4.3/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

http://192.168.77.130:9100/

启动head

  1. 监控API
    http://192.168.77.130:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates

四、Kibana

  1. node01服务器安装Kibana
# 下载
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.3-linux-x86_64.tar.gz

# 解压
[root@localhost ~]# tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz -C /usr/local/

# Kibana配置
[root@node1 kibana-6.4.3-linux-x86_64]# vi config/kibana.yml 
# Kibana配置
# 绑定的端口号
server.port: 5601
# 绑定的ip
server.host: "192.168.77.130"

# 启动
[root@node1 kibana-6.4.3-linux-x86_64]# ./bin/kibana

  1. 浏览访问
    http://192.168.77.130:5601
    点击: Monitoring


    查看节点

    节点查看

五、x-apck 安装配置

  1. 安装请参考《数据可视化--Kibana(六)》
  2. 配置SSL并启用x-apck(所有节点)
    所有节点的x-pack都要注册或破解。
# node1节点,生成证书
 # 默认直接点击进行下一步,密码也可以不输,全部回车
[root@node1 elasticsearch-6.4.3]#  ./bin/elasticsearch-certutil ca

 # 默认直接点击进行下一步,密码也可以不输,全部回车
[root@node1 elasticsearch-6.4.3]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12


# 这时在es目录下会生成elastic-certificates.p12、elastic-stack-ca.p12
[root@node1 elasticsearch-6.4.3]# ls *p12
elastic-certificates.p12  elastic-stack-ca.p12

# 创建目录
[root@node1 elasticsearch-6.4.3]# mkdir config/certs/
# 拷贝证书到nod1配置目录
[root@node1 elasticsearch-6.4.3]# cp elastic-certificates.p12 config/certs/

# 复制文件到node2与node3
[root@node1 elasticsearch-6.4.3]# scp elastic-certificates.p12 root@192.168.77.131:/usr/local/elasticsearch-6.4.3/config/certs

# 复制文件到node3
[root@node1 elasticsearch-6.4.3]# scp elastic-certificates.p12 root@node3:/usr/local/elasticsearch-6.4.3/config/certs

# 更改文件所有者
[es@node3 elasticsearch-6.4.3]$ su root
密码:
[root@node3 elasticsearch-6.4.3]#  chown -R es:es /usr/local/elasticsearch-6.4.3/

# 所有节点添加配置
[root@node1 elasticsearch-6.4.3]# vi config/elasticsearch.yml 
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

# 重启所有节点ES
[es@node1 elasticsearch-6.4.3]$ ./bin/elasticsearch
[es@node2 elasticsearch-6.4.3]$ ./bin/elasticsearch
[es@node3 elasticsearch-6.4.3]$ ./bin/elasticsearch

六、常见问题

  1. nested: IOException[没有到主机的路由
    关闭防火墙
[root@node2 elasticsearch-6.4.3]# systemctl stop firewalld
[root@node2 elasticsearch-6.4.3]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
  1. elasticsearch unassigned错误解决
    http://192.168.77.130:9200/_cluster/health?pretty
    结果:
{
  "cluster_name" : "xtsz-cluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 29,
  "active_shards" : 53,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 5,
  "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" : 91.37931034482759
}

其中:
"unassigned_shards" : 5,
http://192.168.77.130:9200/_cat/shards

pinyin_index                    1 p STARTED         0    261b 192.168.77.130 node-1
pinyin_index                    1 r UNASSIGNED                               
pinyin_index                    2 p STARTED         1   3.6kb 192.168.77.130 node-1
pinyin_index                    2 r UNASSIGNED                               
pinyin_index                    3 p STARTED         1   3.5kb 192.168.77.130 node-1
pinyin_index                    3 r UNASSIGNED                               
pinyin_index                    4 p STARTED         0    261b 192.168.77.130 node-1
pinyin_index                    4 r UNASSIGNED                               
pinyin_index                    0 p STARTED         0    261b 192.168.77.130 node-1
pinyin_index                    0 r UNASSIGNED     

删除此节点。
逐个修复每一个节点分片数据, 改:index、shard、node。

POST '192.168.77.130:9200/_cluster/reroute
  1. Caused by: javax.net.ssl.SSLException: Received close_notify during handshake

  2. Caused by: org.elasticsearch.ElasticsearchSecurityException: missing authentication token for action [cluster:monitor/nodes/stats[n]]
    证书问题,请注册所有ES并将node1的证书复制到其它节点的config/certs目录下。

  3. Generating a random key for xpack.security.encryptionKey.
    在配置文件kibana.yml中添加【xpack.reporting.encryptionKey】属性

xpack.reporting.encryptionKey: "a_random_string"
xpack.security.encryptionKey: "something_at_least_32_characters"
  1. [plugin:xpack_main@6.4.3] Status changed from yellow to red - Authentication Exception
    配置文件kibana.yml中需要加入以下配置:
# x-pack自动生成或设置的elastic账号密码
elasticsearch.username: "elastic"
elasticsearch.password: "OYOPqdXjk1k6EHqhSpR6"

  1. [warning][security] Session cookies will be transmitted over insecure connections. This is not recommended.
    需要配置kibana的SSL。
    server.ssl.enabled
    默认值: “false” 对到浏览器端的请求启用 SSL,设为 true 时, server.ssl.certificate 和 server.ssl.key 也要设置。
# 启用ssl
server.ssl.enabled: true
server.ssl.certificate: /etc/ssl/server.crt
server.ssl.key: /etc/ssl/server.key
# 设置 Elasticsearch URL 指定使用 HTTPS 协议
elasticsearch.url: "https://192.168.77.130:9200"

# Elasticsearch 使用了自签名证书
# 默认值: full 控制证书的认证,可用的值有 none 、 certificate 、 full 。 full 执行主机名验证,certificate 不执行主机名验证。
elasticsearch.ssl.verificationMode: certificate
# 指定用于 Elasticsearch 实例的 PEM 证书文件路径。
server.ssl.certificateAuthorities: ["/usr/local/kibana-6.4.3-linux-x86_64/config/certs/elastic-certificates.p12"]

elasticsearch.ssl.verificationMode不是必须的,默认为full, 因为生成证书的时候没有加入 dns, ip 等,这里 需要禁用verify host, 不然会报错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容