elasticsearch生產環境叢集部署
阿新 • • 發佈:2018-12-25
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:這是預設的選項,所有的寫操作都會被拒絕,但是讀操作是被允許的