1. 程式人生 > >elasticsearch生產環境叢集部署

elasticsearch生產環境叢集部署

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:這是預設的選項,所有的寫操作都會被拒絕,但是讀操作是被允許的