Doris中的節(jié)點(diǎn)
FE
- 主要負(fù)責(zé)用戶請(qǐng)求的接入
- 查詢解析規(guī)劃
- 元數(shù)據(jù)的管理
- 節(jié)點(diǎn)管理相關(guān)工作
BE
- 主要負(fù)責(zé)數(shù)據(jù)存儲(chǔ)
- 查詢計(jì)劃的執(zhí)行
broker
- 輕量無狀態(tài)節(jié)點(diǎn)颁股,上面封裝了一層文件讀寫的語義
- 用于支持 Doris 讀寫遠(yuǎn)端存儲(chǔ)上的文件和目錄
- Broker 通過提供一個(gè) RPC 服務(wù)端口來提供服務(wù)囱皿,是一個(gè)無狀態(tài)的 Java 進(jìn)程触幼,負(fù)責(zé)為遠(yuǎn)端存儲(chǔ)的讀寫操作封裝一些類 POSIX 的文件操作宛逗,如 open,pread腥寇,pwrite 等等奇颠。
- 除此之外蒜撮,Broker 不記錄任何其他信息仑扑,所以包括遠(yuǎn)端存儲(chǔ)的連接信息览爵、文件信息、權(quán)限信息等等镇饮,都需要通過參數(shù)在 RPC 調(diào)用中傳遞給 Broker 進(jìn)程蜓竹,才能使得 Broker 能夠正確讀寫文件
FE節(jié)點(diǎn)管理
fe的角色
Follower
- 所有 Follower 角色的 FE 節(jié)點(diǎn)會(huì)組成一個(gè)可選擇組,類似 Paxos 一致性協(xié)議里的組概念储藐。
- 組內(nèi)會(huì)選舉出一個(gè) Follower 作為 Master
- 保證元數(shù)據(jù)寫的可靠性
- 一條元數(shù)據(jù)日志需要在多數(shù) Follower 節(jié)點(diǎn)寫入成功俱济,才算成功。
- 比如3個(gè) FE 钙勃,2個(gè)寫入成功才可以蛛碌。這也是為什么 Follower 角色的個(gè)數(shù)需要是奇數(shù)的原因
- 不參與數(shù)據(jù)的計(jì)算,如果系統(tǒng)是重計(jì)算辖源,則不考慮擴(kuò)展fe
Observer
- 保證元數(shù)據(jù)讀的擴(kuò)展
為什么要引入obeserver蔚携?
如果只存在follower節(jié)點(diǎn),那么當(dāng)橫向擴(kuò)展的時(shí)候會(huì)帶來元數(shù)據(jù)寫入的壓力
所以引入obeserver只讀節(jié)點(diǎn)克饶,其只會(huì)輪訓(xùn)的同步flower的元數(shù)據(jù)酝蜒,但不參與選舉與元數(shù)據(jù)多數(shù)寫的策略
當(dāng)加入多個(gè)observer的時(shí)候不會(huì)造成集群元數(shù)據(jù)寫的延遲
其保證了元數(shù)據(jù)讀的擴(kuò)展,一般建議根據(jù)負(fù)載請(qǐng)求安裝observer的數(shù)量
- 負(fù)載請(qǐng)求即高并發(fā)場(chǎng)景
fe啟動(dòng)流程
在1.2-SNAPSHOT中已經(jīng)變成Env.getCurrentEnv().initialize
元數(shù)據(jù)目錄結(jié)構(gòu)
bdb:BDBJE的數(shù)據(jù)目錄
- BDBJE:分布式嵌入式kv數(shù)據(jù)庫
- Doris 元數(shù)據(jù)的元數(shù)據(jù)
Image
- Image.2858:元數(shù)據(jù)鏡像文件
- ROLE:記錄角色信息
- VERSION:記錄集群信息
- 認(rèn)證信息token
- 集群id
在fe.conf中指定元數(shù)據(jù)目錄路徑
FE 啟動(dòng)流程 – 獲取節(jié)點(diǎn)信息和Helper信息
- Catalog.getSelfHostPort()
- IP + PORT 唯一確定一個(gè) FE 節(jié)點(diǎn)
- Catalog.getHelperNode()
- sh start_fe.sh –helper ip:port
- 當(dāng)在集群中啟動(dòng)新fe節(jié)點(diǎn)的時(shí)候矾湃,需要為其指定master的信息
- 新節(jié)點(diǎn)從Master節(jié)點(diǎn)拉取集群和角色信息
- HelperNode:
- 指向任一已存在的Follower
獲取集群和角色信息
首節(jié)點(diǎn)啟動(dòng)
當(dāng)沒有指定helper的時(shí)候 isMyself()=true
- 認(rèn)為自己就是fe的首節(jié)點(diǎn)
非首節(jié)點(diǎn)啟動(dòng)
非首節(jié)點(diǎn)啟動(dòng)會(huì)忽略本地存儲(chǔ)的集群信息亡脑,從helperNode中拉取信息
從helper獲取信息
獲取自身fe的role、cluster id 邀跃、token等
如果遠(yuǎn)端節(jié)點(diǎn)沒有ready霉咨,會(huì)在循環(huán)中等待遠(yuǎn)端節(jié)點(diǎn)返回的信息
進(jìn)行節(jié)點(diǎn)認(rèn)證
比對(duì) cluster id 、token id
將源端獲取的 cluster id 坞嘀、token id和本地存儲(chǔ)的 cluster id 躯护、token id比對(duì)
如果本地沒有,則直接存儲(chǔ)
如果本地有丽涩,需要和本地比對(duì)棺滞,判斷是否和上次加入的集群是同一個(gè)集群
- 比對(duì)失敗就會(huì)啟動(dòng)失敗
從helper node 節(jié)點(diǎn) pull new image,進(jìn)行元數(shù)據(jù)加載
加載元數(shù)據(jù)
狀態(tài)監(jiān)聽
- Catalog.createStateListener()
FE啟動(dòng)流程回顧
Env.getCurrentEnv().initialize執(zhí)行流程
確認(rèn)元數(shù)據(jù)目錄
確定是否為helper節(jié)點(diǎn)
如果不是矢渊,則從本地加載或創(chuàng)建元數(shù)據(jù)目錄
如果是继准,則從helper node中獲取集群信息,并進(jìn)行節(jié)點(diǎn)認(rèn)證
加載元數(shù)據(jù)
開啟狀態(tài)監(jiān)聽
FE 啟動(dòng)流程 – 節(jié)點(diǎn)認(rèn)證
防止錯(cuò)誤的節(jié)點(diǎn)加入集群
新節(jié)點(diǎn)的 IP:PORT 必須在元數(shù)據(jù)中顯式注冊(cè)矮男。
雙向認(rèn)證:
Master FE只會(huì)發(fā)送心跳給已注冊(cè)的FE節(jié)點(diǎn)移必,防止未注冊(cè)的節(jié)點(diǎn)被錯(cuò)誤加入。
新增FE會(huì)校驗(yàn)Master FE發(fā)送的心跳信息中的FE信息毡鉴,防止接收到其他FE發(fā)送的錯(cuò)誤心跳崔泵。
- role秒赤、cluster_id、token
認(rèn)證代碼:org.apache.doris.httpv2.meta.MetaService.java
均是restful api
/role?host=ip&port=9030
- 檢查指定的[ip:port]是否已經(jīng)注冊(cè)憎瘸,并返回對(duì)應(yīng)的角色(Follower / Observer)
/version
- 返回 VERSION 文件
/check
- 返回 cluster_id 和 token 用于對(duì)端校驗(yàn)
FE ADD NODE
刪除FE節(jié)點(diǎn)
FE節(jié)點(diǎn)刪除流程
執(zhí)行刪除命令
ALTER SYSTEM DROP FOLLOWER “ip:port”
ALTER SYSTEM DROP OBSERVER “ip:port”
執(zhí)行流程
接受命令節(jié)點(diǎn)的操作
其他FE會(huì)同步這個(gè)“刪除FE節(jié)點(diǎn)”的元數(shù)據(jù)操作
EditLog.loadJournal()
如果發(fā)現(xiàn)刪除的是自己入篮,直接退出。
BE ADD NODE
ADD BE NODE 流程
注冊(cè)BE節(jié)點(diǎn)信息
ALTER SYSTEM ADD BACKEND ”ip:port”;
org.apache.doris.system.SystemInfoService.addBackend()
- 在元數(shù)據(jù)中記錄新增節(jié)點(diǎn)的ip&port
Master FE 向 BE 發(fā)送心跳
org.apache.doris.system.HeartbeatMgr.java#BackendHeartbeatHandler
心跳信息: gensrc/thrift/HeartbeatService.thrift#TMasterInfo
- 心跳信息中會(huì)包含MasterInfo
BE接收心跳
epoch主要是一致性協(xié)議需要幌甘,即判斷發(fā)送方是不是真正的master潮售,類似raft協(xié)議
BE 啟動(dòng)流程 – 節(jié)點(diǎn)認(rèn)證
防止錯(cuò)誤的節(jié)點(diǎn)加入集群
新節(jié)點(diǎn)的 IP:PORT 必須在元數(shù)據(jù)中顯式注冊(cè)。
雙向認(rèn)證:
FE只會(huì)發(fā)送心跳給已注冊(cè)的BE節(jié)點(diǎn)锅风,防止未注冊(cè)的節(jié)點(diǎn)被錯(cuò)誤加入酥诽。
BE會(huì)校驗(yàn)FE發(fā)送的心跳信息中的FE信息,防止接收到其他FE發(fā)送的錯(cuò)誤心跳皱埠。
FEIP肮帐、epoch、cluster_id漱逸、token
刪除BE NODE
刪除的兩種方式
DROP 和 DECOMMISSION
ALTER SYSTEM DROP BACKEND:直接刪除
- org.apache.doris.system.SystemInfoService.dropBackend()
ALTER SYSTEM DECOMMISSION BACKEND:數(shù)據(jù)遷移后刪除
Org.apache.doris.alter.SystemHandler.process()
標(biāo)記副本為“下線”狀態(tài)泪姨,觸發(fā)副本修復(fù)邏輯。全部數(shù)據(jù)遷移完成后饰抒,會(huì)自動(dòng) DROP BACKEND
FE 配置:drop_backend_after_decommission
- true:在decommission結(jié)束后auto drop backend
FE節(jié)點(diǎn)沒有decommission操作的原因
fe節(jié)點(diǎn)是doris集群中負(fù)責(zé)元數(shù)據(jù)管理和查詢協(xié)調(diào)的節(jié)點(diǎn)肮砾。
元數(shù)據(jù)是指描述doris集群中表、分區(qū)袋坑、副本等信息的數(shù)據(jù)仗处。
元數(shù)據(jù)的正確性和一致性對(duì)于doris集群的正常運(yùn)行非常重要。
因此枣宫,doris集群采用了一種叫做raft的協(xié)議來保證元數(shù)據(jù)的高可用性和強(qiáng)一致性婆誓。
raft協(xié)議是一種分布式一致性算法,它要求集群中的每個(gè)節(jié)點(diǎn)都有一個(gè)角色也颤,分為leader洋幻、follower和candidate三種。
- leader節(jié)點(diǎn)是負(fù)責(zé)處理客戶端請(qǐng)求和同步數(shù)據(jù)給其他節(jié)點(diǎn)的節(jié)點(diǎn)翅娶,follower節(jié)點(diǎn)是跟隨leader節(jié)點(diǎn)并復(fù)制其數(shù)據(jù)的節(jié)點(diǎn)文留,candidate節(jié)點(diǎn)是在leader節(jié)點(diǎn)失效時(shí),試圖成為新的leader節(jié)點(diǎn)的節(jié)點(diǎn)竭沫。
doris集群中的fe節(jié)點(diǎn)也遵循raft協(xié)議燥翅,但是為了簡化實(shí)現(xiàn),它將角色分為兩種:follower和observer蜕提。
follower節(jié)點(diǎn)相當(dāng)于raft協(xié)議中的leader或follower節(jié)點(diǎn)森书,observer節(jié)點(diǎn)相當(dāng)于raft協(xié)議中的非投票型follower節(jié)點(diǎn)。
follower節(jié)點(diǎn)會(huì)參與元數(shù)據(jù)的寫入和選舉,而observer節(jié)點(diǎn)只會(huì)同步元數(shù)據(jù)并提供讀服務(wù)凛膏。
集群中的一個(gè)follower節(jié)點(diǎn)會(huì)被選舉為master節(jié)點(diǎn)杨名,負(fù)責(zé)處理元數(shù)據(jù)的寫請(qǐng)求。
如果master節(jié)點(diǎn)宕機(jī)或者網(wǎng)絡(luò)異常译柏,集群會(huì)自動(dòng)選舉一個(gè)新的master節(jié)點(diǎn)镣煮。
因此,用戶無法直接下線一個(gè)fe節(jié)點(diǎn)鄙麦,而只能通過修改fe.conf文件中的role參數(shù)來改變fe節(jié)點(diǎn)的角色。
如果想要下線一個(gè)fe節(jié)點(diǎn)镊折,可以將其role參數(shù)設(shè)置為observer胯府,并重啟該fe節(jié)點(diǎn)。
這樣恨胚,該fe節(jié)點(diǎn)就不會(huì)再參與元數(shù)據(jù)的寫入和選舉骂因,也不會(huì)被選為master節(jié)點(diǎn)。
如果想要徹底刪除一個(gè)fe節(jié)點(diǎn)赃泡,可以先將其role參數(shù)設(shè)置為observer寒波,并等待其同步完所有元數(shù)據(jù)后,再停止該fe節(jié)點(diǎn)升熊,并刪除其元數(shù)據(jù)目錄俄烁。
BE有decommission的原因
decommission操作可以用于安全地下線一個(gè)be節(jié)點(diǎn),而不影響集群的數(shù)據(jù)可用性和一致性级野。
decommission操作會(huì)先將該be節(jié)點(diǎn)上的所有數(shù)據(jù)分片遷移到其他be節(jié)點(diǎn)上页屠,然后再從集群中刪除該be節(jié)點(diǎn)。這樣蓖柔,可以避免數(shù)據(jù)丟失或者副本不足的風(fēng)險(xiǎn)辰企。
decommission操作也可以用于實(shí)現(xiàn)集群的擴(kuò)縮容,或者在節(jié)點(diǎn)增加新的磁盤后况鸣,將數(shù)據(jù)均衡到新的磁盤上牢贸。
be節(jié)點(diǎn)下線過程中和沒下線時(shí)工作職能的區(qū)別主要體現(xiàn)在:
be節(jié)點(diǎn)下線過程中不會(huì)參與數(shù)據(jù)導(dǎo)入,而沒下線時(shí)會(huì)參與數(shù)據(jù)導(dǎo)入镐捧。
be節(jié)點(diǎn)下線過程中只能提供有限的查詢服務(wù)潜索,而沒下線時(shí)可以提供完整的查詢服務(wù)。
be節(jié)點(diǎn)下線過程中會(huì)消耗更多的網(wǎng)絡(luò)和磁盤資源愤估,而沒下線時(shí)則不會(huì)帮辟。
Be下線過程中依然在集群中,但是不會(huì)被分配新的數(shù)據(jù)分片玩焰,也不會(huì)參與數(shù)據(jù)導(dǎo)入和選舉由驹。只有當(dāng)be節(jié)點(diǎn)完成數(shù)據(jù)遷移并從集群中刪除自己后,才會(huì)完全退出集群。
節(jié)點(diǎn)管理常見問題
broker節(jié)點(diǎn)
該節(jié)點(diǎn)是無狀態(tài)的蔓榄,可以隨意刪除
而像fe并炮、be節(jié)點(diǎn)這種有狀態(tài)的節(jié)點(diǎn)就不能隨意刪除了
priority_network配置需要主動(dòng)配置
無論BE、FE甥郑,這個(gè)參數(shù)我們?cè)诎惭b的時(shí)候都是必須要配置的逃魄,特別是當(dāng)一臺(tái)機(jī)器擁有多個(gè)IP地址的時(shí)候,我們要為FE澜搅、 BE 指定唯一的IP地址
- 避免拿到127.0.0.1 抑或docker虛擬網(wǎng)橋的ip
Invalid cluster id
這個(gè)錯(cuò)誤可能會(huì)在show backends 或 show frontends 命令的結(jié)果中出現(xiàn)伍俘。通常出現(xiàn)在某個(gè)FE或BE節(jié)點(diǎn)的錯(cuò)誤信息列中。
這個(gè)錯(cuò)誤的含義是勉躺,Master FE向這個(gè)節(jié)點(diǎn)發(fā)送心跳信息后癌瘾,該節(jié)點(diǎn)發(fā)現(xiàn)心跳信息中攜帶的 cluster id和本地存儲(chǔ)的 cluster id不同,所以拒絕回應(yīng)心跳饵溅。
Doris的 Master FE 節(jié)點(diǎn)會(huì)主動(dòng)發(fā)送心跳給各個(gè)FE或BE節(jié)點(diǎn)妨退,并且在心跳信息中會(huì)攜帶一個(gè)cluster_id。
cluster_id是在一個(gè)集群初始化時(shí)蜕企,由Master FE生成的唯一集群標(biāo)識(shí)咬荷。
當(dāng)FE或BE第一次收到心跳信息后,則會(huì)將cluster_id以文件的形式保存在本地轻掩。
FE的該文件在元數(shù)據(jù)目錄的image/目錄下幸乒,BE則在所有數(shù)據(jù)目錄下都有一個(gè)cluster_id文件。
之后放典,每次節(jié)點(diǎn)收到心跳后逝变,都會(huì)用本地cluster_id的內(nèi)容和心跳中的內(nèi)容作比對(duì),如果不一致奋构,則拒絕響應(yīng)心跳壳影。
該機(jī)制是一個(gè)節(jié)點(diǎn)認(rèn)證機(jī)制,以防止接收到集群外的節(jié)點(diǎn)發(fā)送來的錯(cuò)誤的心跳信息弥臼。
如果需要恢復(fù)這個(gè)錯(cuò)誤宴咧。
首先要先確認(rèn)所有節(jié)點(diǎn)是否都是正確的集群中的節(jié)點(diǎn)。
之后径缅,對(duì)于FE節(jié)點(diǎn)掺栅,可以嘗試修改元數(shù)據(jù)目錄下的 image/VERSION 文件中的 cluster_id 值后重啟FE。
對(duì)于BE節(jié)點(diǎn)纳猪,則可以刪除所有數(shù)據(jù)目錄下的 cluster_id 文件后重啟 BE
被 DROP 的 BE 能否恢復(fù)氧卧?
FE 的故障恢復(fù)
核心思路:通過清空“元數(shù)據(jù)的元數(shù)據(jù)”使FE恢復(fù)到單節(jié)點(diǎn)初始狀態(tài)
元數(shù)據(jù)的元數(shù)據(jù)
Doris 的元數(shù)據(jù)主要存儲(chǔ)4類數(shù)據(jù):
用戶數(shù)據(jù)信息。
- 包括數(shù)據(jù)庫氏堤、表的 Schema沙绝、分片信息等。
各類作業(yè)信息。
- 如導(dǎo)入作業(yè)闪檬,Clone 作業(yè)星著、SchemaChange 作業(yè)等。
用戶及權(quán)限信息粗悯。
集群及節(jié)點(diǎn)信息虚循。
元數(shù)據(jù)的元數(shù)據(jù)指fe raft協(xié)議中的拓?fù)錉顟B(tài)
清空元數(shù)據(jù)的元數(shù)據(jù)
- 即先將一個(gè)節(jié)點(diǎn)的fe 拓?fù)錉顟B(tài)清空,其自然變成master節(jié)點(diǎn)样傍,然后清空其他節(jié)點(diǎn)横缔,然后加入master
當(dāng)只有兩個(gè)flower節(jié)點(diǎn)的時(shí)候所有節(jié)點(diǎn)都掛掉了
- 因?yàn)閒lower通過raft一致性協(xié)議要保證多數(shù)節(jié)點(diǎn)成功,而兩個(gè)節(jié)點(diǎn)無法滿足達(dá)成多數(shù)節(jié)點(diǎn)成功铭乾,所以其自身就退出了
DeployManager
org.apache.doris.deploy.DeployManager
AmbariDeployManager
K8sDeployManager
LocalFileDeployManager
解決自動(dòng)節(jié)點(diǎn)發(fā)現(xiàn)的問題
多個(gè)FE同時(shí)啟動(dòng)