隨著業(yè)務(wù)的發(fā)展,elasticsearch部署在一臺(tái)機(jī)子上顯然會(huì)不夠用,那么我們?cè)撊绾翁幚砟?,幸運(yùn)的elasticsearch支持橫向擴(kuò)展,即集群模式,這樣無(wú)論數(shù)據(jù)量增長(zhǎng)多大,我們只需要擴(kuò)展我們的es集群即可。 背景說(shuō)明
假設(shè)現(xiàn)在就一臺(tái)服務(wù)器,我們要用這臺(tái)服務(wù)器來(lái)部署一個(gè)ES的集群,那么最好的解決辦法便是Docker了,我們可以利用Docker啟動(dòng)兩個(gè)容器,在兩個(gè)容器內(nèi)各部署一個(gè)ElasticSearch,總而組成一個(gè)2個(gè)節(jié)點(diǎn)的ES集群
Docker網(wǎng)絡(luò)模式解釋 1.host模式 眾所周知,Docker使用了Linux的Namespaces技術(shù)來(lái)進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等。一個(gè)Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、Iptable規(guī)則等都與其他的Network Namespace隔離。一個(gè)Docker容器一般會(huì)分配一個(gè)獨(dú)立的Network Namespace。但如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。 例如,我們?cè)?0.10.101.105/24的機(jī)器上用host模式啟動(dòng)一個(gè)含有web應(yīng)用的Docker容器,監(jiān)聽(tīng)tcp80端口。當(dāng)我們?cè)谌萜髦袌?zhí)行任何類(lèi)似ifconfig命令查看網(wǎng)絡(luò)環(huán)境時(shí),看到的都是宿主機(jī)上的信息。而外界訪(fǎng)問(wèn)容器中的應(yīng)用,則直接使用10.10.101.105:80即可,不用任何NAT轉(zhuǎn)換,就如直接跑在宿主機(jī)中一樣。但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。 2.container模式 在理解了host模式后,這個(gè)模式也就好理解了。這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò)lo網(wǎng)卡設(shè)備通信。 3.none模式 這個(gè)模式和前兩個(gè)不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè)Docker容器沒(méi)有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。 4.bridge模式 bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會(huì)為每一個(gè)容器分配N(xiāo)etwork Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)橋上 組播配置示例如下,單播配置在最下邊,使用時(shí)只需替換加幾行配置即可 1.下載Ubuntu最近版鏡像
2.配置基本環(huán)境 啟動(dòng)容器,進(jìn)入容器內(nèi)安裝基本環(huán)境vim,Java,和elasticsearch
然后安裝es,下載安裝包(閱讀原文獲取下載鏈接) 將其拷貝到docker內(nèi),安裝
至此基本環(huán)境已經(jīng)準(zhǔn)備的差不多了,然后便是退出容器,stop 容器,然后進(jìn)行commit 保存成兩個(gè)容器
最后查看鏡像如圖所示: 3.es環(huán)境配置 分別啟動(dòng)兩個(gè)容器
進(jìn)入兩個(gè)容器進(jìn)行配置elasticsearch.ymal文件 esc1:
esc2:
啟動(dòng)Elasticsearch
細(xì)心的朋友會(huì)發(fā)現(xiàn)容器的啟動(dòng)端口轉(zhuǎn)發(fā)端口不一致,這是因?yàn)?,這里啟動(dòng)Docker容器默認(rèn)采用的橋接,和主機(jī)共享端口了,所以?xún)烧叨丝诓荒芤恢?,要不然?huì)重復(fù) 啟動(dòng)完es集群,瀏覽器輸入 https:192.168.1.250:9200/_plugin/head 這里我安裝了head插件,插件安裝,參考之前的一篇文章,里邊有講到: http://blog.csdn.net/gamer_gyt/article/details/52654263 4.安裝logstash配置rsyslog解析文件 logstash 2.4版本(閱讀原文獲取下載鏈接 ) 更多版本:https://www./downloads/past-releases
然后進(jìn)入配置文件目錄
添加以下內(nèi)容
啟動(dòng)logstash
5.本地配置,產(chǎn)生syslog日志 編輯rsyslog的配置文件:
最后添加
重啟rsyslog服務(wù)
ssh 本地,產(chǎn)生日志
這個(gè)時(shí)候觀(guān)察elasticsearch界面: ES集群的多播與單播 以上的集群是采用組播的方式來(lái)構(gòu)建的,組播就是通過(guò)在你的網(wǎng)絡(luò)中發(fā)送UDP的ping請(qǐng)求以發(fā)現(xiàn)節(jié)點(diǎn),其它Elasticsearch會(huì)收到這些ping請(qǐng)求并且進(jìn)行響應(yīng),這樣隨后就會(huì)形成一個(gè)集群。 多播對(duì)于開(kāi)發(fā)環(huán)境是很好的,你不需要做什么事情,打開(kāi)一些節(jié)點(diǎn),他們自然的會(huì)發(fā)現(xiàn)對(duì)方形成一個(gè)集群。 正是因?yàn)檫@種易用性,你在生產(chǎn)環(huán)境中必須禁掉它。否在你得到的結(jié)果就是一個(gè)節(jié)點(diǎn)意外的加入到了你的生產(chǎn)環(huán)境,因?yàn)樗麄兪盏搅艘粋€(gè)錯(cuò)誤的組播信號(hào)。對(duì)于組播本身并沒(méi)有錯(cuò)。組播會(huì)導(dǎo)致一些愚蠢的問(wèn)題,并且導(dǎo)致集群變的脆弱(例如:一個(gè)網(wǎng)絡(luò)工程師正在搗鼓網(wǎng)絡(luò),而沒(méi)有告訴你,你會(huì)發(fā)現(xiàn)所有的節(jié)點(diǎn)突然發(fā)現(xiàn)不了對(duì)方了)。 在生產(chǎn)環(huán)境中,建議使用單播代替組播,也就是說(shuō)為Elasticsearch提供一些它應(yīng)該去嘗試連接的節(jié)點(diǎn)列表。一旦這個(gè)節(jié)點(diǎn)聯(lián)系到組播列表中的一員,它就會(huì)得到整個(gè)集群所有節(jié)點(diǎn)的狀態(tài),然后它會(huì)聯(lián)系master節(jié)點(diǎn),并加入集群。 這意味著你的單播列表不需要包含你的集群中的所有節(jié)點(diǎn),它只需要包含足夠一個(gè)新節(jié)點(diǎn)聯(lián)系上其中一個(gè)并且說(shuō)上話(huà)就ok了。 ES 是一個(gè) P2P 類(lèi)型(使用 gossip 協(xié)議)的分布式系統(tǒng),除了集群狀態(tài)管理以外,其他所有的請(qǐng)求都可以發(fā)送到集群內(nèi)任意一臺(tái)節(jié)點(diǎn)上,這個(gè)節(jié)點(diǎn)可以自己找到需要轉(zhuǎn)發(fā)給哪些節(jié)點(diǎn),并且直接跟這些節(jié)點(diǎn)通信。 所以,從網(wǎng)絡(luò)架構(gòu)及服務(wù)配置上來(lái)說(shuō),構(gòu)建集群所需要的配置極其簡(jiǎn)單。在 Elasticsearch 2.0 之前,無(wú)阻礙的網(wǎng)絡(luò)下,所有配置了相同 cluster.name 的節(jié)點(diǎn)都自動(dòng)歸屬到一個(gè)集群中。 2.0 版本之后,基于安全的考慮,Elasticsearch 稍作了調(diào)整,避免開(kāi)發(fā)環(huán)境過(guò)于隨便造成的麻煩。 ES 從 2.0 版本開(kāi)始,默認(rèn)的自動(dòng)發(fā)現(xiàn)方式改為了單播(unicast)方式。配置里提供幾臺(tái)節(jié)點(diǎn)的地址,ES 將其視作 gossip router 角色,借以完成集群的發(fā)現(xiàn)。由于這只是 ES 內(nèi)一個(gè)很小的功能,所以 gossip router 角色并不需要單獨(dú)配置,每個(gè) ES 節(jié)點(diǎn)都可以擔(dān)任。所以,采用單播方式的集群,各節(jié)點(diǎn)都配置相同的幾個(gè)節(jié)點(diǎn)列表作為 router 即可。 此外,考慮到節(jié)點(diǎn)有時(shí)候因?yàn)楦哓?fù)載,慢 GC 等原因可能會(huì)有偶爾沒(méi)及時(shí)響應(yīng) ping 包的可能,一般建議稍微加大 Fault Detection 的超時(shí)時(shí)間。 同樣基于安全考慮做的變更還有監(jiān)聽(tīng)的主機(jī)名?,F(xiàn)在默認(rèn)只監(jiān)聽(tīng)本地 lo 網(wǎng)卡上。所以正式環(huán)境上需要修改配置為監(jiān)聽(tīng)具體的網(wǎng)卡。
上面的配置中,兩個(gè) timeout 可能會(huì)讓人有所迷惑。這里的 fd 是 fault detection 的縮寫(xiě)。也就是說(shuō):
既然是長(zhǎng)期有用,自然還有運(yùn)行間隔和重試的配置,也可以根據(jù)實(shí)際情況調(diào)整:
單播配置 以上展示為組播方式,單播配置相對(duì)來(lái)說(shuō)只需要在配置文件里加幾行即可 esc1:
esc2:
PS:我這里嘗試了很多次,增加了
這三個(gè)屬性之后集群并不能啟動(dòng),所以這里只設(shè)置了discovery.zen.ping.unicast.hosts屬性。 |
|
來(lái)自: openlabzeng > 《待分類(lèi)》