elasticsearch生产环境集群部署

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36381640/article/details/82794016
1、假设有三个节点那么在三个节点上都下载es
解压后es安装包的目录结构大致如下:
         bin:存放es的一些可执行脚本,比如用于启动进程的elasticsearch命令,以及用于安装插件的elasticsearch-plugin插件
         conf:用于存放es的配置文件,比如elasticsearch.yml
         data:用于存放es的数据文件,就是每个索引的shard的数据文件
         logs:用于存放es的日志文件
         plugins:用于存放es的插件
         script:用于存放一些脚本文件
2、zen discovery集群发现机制
      在多个节点上都部署es,那么各个节点上的es如何相互发发现对方?
             1.默认情况下,es进程会绑定在自己的回环地址上,也就是127.0.0.1,然后扫描本机上的9300~9305端口号,尝试跟那些端口上启动的其他es进程进行通信,然后组成一个集群。这对于在本机上搭建es集群的
       开发环境是很方便的。
             2.在生产环境中要发现启动的es进程,需要将每台es进程绑定在一个非回环的ip地址上,才能跟其他节点进行通信,同时使用集群发现机制来跟其他节点上的es node进行通信。
             3.这个发现机制就是es的discovery机制,discovery机制同时也负责es集群的master选举
      es集群的两种角色:
             1.master node角色
             2.data node角色
               简介: es是一种peer to peer,也就是p2p点对点的分布式系统架构,不是hadoop生态普遍采用的那种master-slave主从架构的分布式系统。集群中的每个node是直接跟其他节点进行通信的,几乎所有的API操作,比
             如index,delete,search,等等,都不是说client跟master通信,而是client跟任何一个node进行通信,那个node再将请求转发给对应的node来进行执行。
                     正常情况下只有一个master node,master node的责任就是负责维护整个集群的状态信息,也就是一些集群元数据信息,同时在node加入集群或者从集群中下限覅按时重新分配shard,或者是创建或
             删除索引,包括每次cluster state如果有改变的化,master node都会负责将集群状态同步给所有的node。集群中所有的node都有一份完整的cluster state。只不过master node负责维护而已。其他的node,除了master之
             外的node,就是负责数据的存储和读写的,写入索引,搜索数据。
             3.如果要让多个node组成一个es集群,就必须设置cluster.name,多个node的cluster.name如果一样,才满足组成一个集群的基本条件。这个cluster.name的默认值是elasticsearch
             4.es中默认的discovery机制,就是zen discovery机制zen discovery机制提供了unicast discovery集群发现机制,集群发现事的节点间通信是依赖的transport module,也就是es底层的网络通信模块和协议。
              es默认配置为使用unicast集群发现机制,以让经过特殊配置的节点可以组成一个集群,而不是随便哪个节点都可以组成一个集群。但是默认配置下,unicast是本机,也就是localhost,因此只能在一台机器上启动多个node来组成
             5.主节点和数据节点的配置方案
                   配置的时候,是配置多个node为预选主节点(master eligible node),也就是是说有那个master node故障的时候,这些master eligible node有接替他的资格,但是还是作为data node去使用的
                   一般建议master eligible node给3个即可:
                                   node.master: true,
                                   node.data: false
                   剩下的node都设置为data node:
                                   node.master: false,
                                   node.data: true
                   如果一个小集群就10个以内的节点,那就所有节点都可以作为master eligible node以及data node即可,超过10个node的集群再单独拆分master和data node吧
             6.network.host
                    默认情况下es会将自己绑定到127.0.0.1上,但是为了让节点间可以互相通信以组成一个集群,需要让节点绑定到一个ip地址上
                                   network.host: 192.168.1.10
                    注:一旦我们配置了network.host,那么es就会认为我们从开发模式迁移到生产模式,同时会启用一系列的bootstrap check。
             7.ping
                    ping是一个node用discovery机制来发现其他node的一个过程
             8.unicast
                     unicast discovery集群发现机制是要求配置一个主机列表,用来作为gossip(流言式)通信协议的路由器,这些机器如果通过hostname来指定,那么在ping的时候会被解析为ip地址。unicast
                     unicastdiscovery机制最重要的两个配置如下所示:
                                 hosts:主机列表                        用逗号分割的主机列表
                                 hosts.resolve_timeout:hostname       被DNS解析为ip地址的timeout等待时长
             9.多个节点通过一个工作的中间节点交换各自的信息,进而让所有的node感知到其他的node存在并且进行通信,最后组成一个集群。这就是基于gossip流言式通信协议的unicast集群发现机制。
               当一个node与unicast node list中的一个成员通信之后,就会接收到一份完整的集群状态,接着这个node通过cluster state跟master通信并且加入集群中,这就意味着unicast list node是不需要列
               出集群中的所有节点的,只要提供少数几个node让新的node可以连接上即可,可以使用集群中的预选master节点来完成配置如下:
                                 discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
综上所述集群中每个节点的配置首先有如下几项:
                1.cluster.name
                2.node.name
                3.network.host
                4.discovery.zen.ping.unicast.hosts
3.关于master选举:
               在ping发现过程中,es集群会自动完成master选举,建议设置如下:
                            1.discovery.zen.ping_timeout:时间(默认是3s)
                                      如果因为网络慢或者拥塞,导致master选举超时,那么可以增加这个参数,确保集群启动的稳定性
                            2.discovery.zen.join_timeout:时间
                                      每次一个新的node加入集群都会发送一个join request到master node,如果一次join不上,默认会重试20次,通过设置discovery.zen.join_timeout保证node稳定加入集群,
                            3.discovery.zen.master_election.ignore_non_master_pings:true或者false
                                      如果discovery.zen.master_election.ignore_non_master_pings设置为了true,同时node的node.master设置为了false,当发送ping请求参与master选举这些node会被忽略掉。
                            4.discovery.zen.minimum_master_nodes:参数
                                      作用有两个:
                                          1.对于一个新选举的master,要求必须有多少个master候选node去连接那个新选举的master
                                          2.用于设置一个集群中必须拥有的master的候选node。
                                      如果这些要求没有被满足,那么master node就会被停止,然后会重新选举一个新的master。这个参数必须设置为master候选node的quorum数量,一般避免说只有两个 master候选
                                      node因为2的quorum还是2,如果在那个情况下,任何一个master候选节点宕机了,集群就无法正常运作了。
4.es集群故障探查机制:
               1.第一种是通过master进行的,master会ping集群中所有的其他node,确保它们是否是存活着的。
               2.第二种每个node都会去ping master node来确保master node是存活的,否则就会发起一个选举过程。
               相关的配置参数:
                  ping_interval:    每隔多长时间会ping一次node,默认是1s
                  ping_timeout:     每次ping的timeout等待时长是多长时间,默认是30s
                  ping_retries:     如果一个node被ping多少次都失败了,就会认为node故障,默认是3次
5.集群状态更新
           discovery.zen.commit_timeout:
           discovery.zen.minimum_master_nodes:
           discovery.zen.publish_timeout:
               只有master node可以对cluster state进行更新的node,master node每处理一个集群状态的更新事件,然后应用这次状态更新之后将更新后的状态发布到集群中所有的node上去。
            每个node都会接收publish message,ack这个message,但是不会应用这个更新,如果master没有在discovery.zen.commit_timeout指定的时间内(默认是30s),从至少discovery.zen.minimum_master_nodes个节点获取ack响应,那么这次cluster state change事件就会被reject,不会应用。
             但是一旦在指定时间内,指定数量的node都返回了ack消息,那么cluster state就会被commit,然后一个message会被发送给所有的node。所有的node接收到那个commit message之后,接着才会将之前
             接收到的集群状态应用到自己本地的状态副本中去。接着master会等待所有节点再次响应是否更新自己本地副本状态成功,在一个等待超时时长内,如果接收到了响应,那么就会继续处理内存queue中保存
             的下一个更新状态。discovery.zen.publish_timeout默认是30s,这个超时等待时长是从plublish cluster state开始计算的。
6.不因为master宕机阻塞集群操作
         discovery.zen.no_master_block:all或者write
                  如果要让集群正常运转,那么必须有一个master,还有discovery.zen.minimum_master_nodes指定数量的master候选node都在运行。discovery.zen.no_master_block可以控制当master当即时,什么
             样的操作应该被拒绝。有下面两个选项:
                        1.all:一旦master当即,那么所有的操作都会被拒绝
                        2.write:这是默认的选项,所有的写操作都会被拒绝,但是读操作是被允许的

猜你喜欢

转载自blog.csdn.net/qq_36381640/article/details/82794016