elasticsearch 集群
搭建elasticsearch的集群
現在假設我們有3台es機器,想要把他們搭建成為一個集群
基本配置
每個節點都要進行這樣的配置:
cluster.name: baichebao-cluster
這個是配置集群的名字,為了能進行自動查找
node.name: "baichebao-node-1"
這個是配置當前節點的名字,當然每個節點的名字都應該是唯一的
node.master: false
node.data: true
這兩個配置有4種配置方法,表示這個節點是否可以充當主節點,這個節點是否充當數據節點。
如果你的節點數目只有兩個的話,為了防止腦裂的情況,需要手動設置主節點和數據節點。其他情況建議直接不設置,默認兩個都為true.
network.host: "0.0.0.0"
綁定host,0.0.0.0代表所有IP,為了安全考慮,建議設置為內網IP
transport.tcp.port: 10800
節點到節點之間的交互是使用tcp的,這個設置設置啟用的端口
http.port: 9700
這個是對外提供http服務的端口,安全考慮,建議修改,不用默認的9200
discovery.zen.ping.multicast.enabled: false
discovery.zen.fd.ping_timeout: 100s
discovery.zen.ping.timeout: 100s
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["12.12.12.12:10801"]
這幾個是集群自動發現機制
discovery.zen.ping.multicast.enabled 這個設置把組播的自動發現給關閉了,為了防止其他機器上的節點自動連入。
discovery.zen.fd.ping_timeout和discovery.zen.ping.timeout是設置了節點與節點之間的連接ping時長
discovery.zen.minimum_master_nodes 這個設置為了避免腦裂。比如3個節點的集群,如果設置為2,那么當一台節點脫離后,不會自動成為master。
discovery.zen.ping.unicast.hosts 這個設置了自動發現的節點。
action.auto_create_index: false
這個關閉了自動創建索引。為的也是安全考慮,否則即使是內網,也有很多掃描程序,一旦開啟,掃描程序會自動給你創建很多索引。
在bin/elasticsearch里面增加兩行:
ES_HEAP_SIZE=4g
MAX_OPEN_FILES=65535
這兩行設置了節點可以使用的內存數和最大打開的文件描述符數。
好了,啟動三個節點他們就會互相自己連起來成為集群了。
自動選舉
elasticsearch集群一旦建立起來以后,會選舉出一個master,其他都為slave節點。
但是具體操作的時候,每個節點都提供寫和讀的操作。就是說,你不論往哪個節點中做寫操作,這個數據也會分配到集群上的所有節點中。
這里有某個節點掛掉的情況,如果是slave節點掛掉了,那么首先關心,數據會不會丟呢?不會。如果你開啟了replicate,那么這個數據一定在別的機器上是有備份的。
別的節點上的備份分片會自動升格為這份分片數據的主分片。這里要注意的是這里會有一小段時間的yellow狀態時間。
如果是主節點掛掉怎么辦呢?當從節點們發現和主節點連接不上了,那么他們會自己決定再選舉出一個節點為主節點。
但是這里有個腦裂的問題,假設有5台機器,3台在一個機房,2台在另一個機房,當兩個機房之間的聯系斷了之后,每個機房的節點會自己聚會,推舉出一個主節點。
這個時候就有兩個主節點存在了,當機房之間的聯系恢復了之后,這個時候就會出現數據沖突了。
解決的辦法就是設置參數:
discovery.zen.minimum_master_nodes
為3(超過一半的節點數),那么當兩個機房的連接斷了之后,就會以大於等於3的機房的master為主,另外一個機房的節點就停止服務了。
對於自動服務這里不難看出,如果把節點直接暴露在外面,不管怎么切換master,必然會有單節點問題。所以一般我們會在可提供服務的節點前面加一個負載均衡。
自動發現
elasticsearch的集群是內嵌自動發現功能的。
意思就是說,你只需要在每個節點配置好了集群名稱,節點名稱,互相通信的節點會根據es自定義的服務發現協議去按照多播的方式來尋找網絡上配置在同樣集群內的節點。
和其他的服務發現功能一樣,es是支持多播和單播的。多播和單播的配置分別根據這幾個參數:
discovery.zen.ping.multicast.enabled: false
discovery.zen.fd.ping_timeout: 100s
discovery.zen.ping.timeout: 100s
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["12.12.12.12:10801"]
多播是需要看服務器是否支持的,由於其安全性,其實現在基本的雲服務(比如阿里雲)是不支持多播的,所以即使你開啟了多播模式,你也僅僅只能找到本機上的節點。
單播模式安全,也高效,但是缺點就是如果增加了一個新的機器的話,就需要每個節點上進行配置才生效了。
參考文檔
http://kibana.logstash.es/content/elasticsearch/principle/auto-discovery.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-zen.html