## Doris 簡介 ### Doris 概述 Apache Doris 由百度大數據部研發 (之前叫百度 Palo,2018 年貢獻到 Apache 社區後,更名為 Doris), 在百度內部,有超過 200 個產品線在使用,部署機器超過 1000 台,單一業務最大可達到上百 TB。 Apach ...
Doris 簡介
Doris 概述
Apache Doris 由百度大數據部研發 (之前叫百度 Palo,2018 年貢獻到 Apache 社區後,更名為 Doris), 在百度內部,有超過 200 個產品線在使用,部署機器超過 1000 台,單一業務最大可達到上百 TB。
Apache Doris 是一個現代化的 MPP(Massively Parallel Processing,即大規模並行處理)分析型(OLAP)資料庫產品。僅需亞秒級響應時間即可獲得查詢結果,有效地支持實時數據分析。
Apache Doris 的分散式架構非常簡潔,易於運維,並且可以支持 10PB 以上的超大數據集。
Apache Doris 可以滿足多種數據分析需求,例如固定歷史報表,實時數據分析,互動式數據分析和探索式數據分析等。
OLAP和OLTP
聯機事務處理OLTP(On-Line Transaction Processing)
公司業務系統使用資料庫的場景,針對業務系統資料庫有大量隨機的增刪改查
要求: 高併發 速度快 支持事務
聯機分析處理OLAP(On-Line Analytical Processing)
公司的數據分析使用資料庫的場景,對已經生成好的數據進行統計分析
要求:
- 一次操作都是針對的整個數據集
- 只有查這個動作,不會去增刪改
- 查詢的響應速度相對慢點也能接受
- 併發量要求不是太高
比較
OLTP | OLAP | |
---|---|---|
數據源 | 僅包含當前運行日常業務數據 | 整合來自多個來源的數據,包括OLTP和外部來源 |
目的 | 面嚮應用,面向業務,支撐事務 | 面向主題,面向分析,支持分析決策 |
焦點 | 當下 | 主要面向過去,面向歷史(實時數倉除外) |
任務 | 增刪改查 | 要是用於讀,select查詢,寫操作很少 |
響應時間 | 毫秒 | 秒,分鐘,小時 取決於數據量和查詢的複雜程度 |
數據量 | 小數據,MB,GB | 大數據,TP,PB |
使用場景
- 報表分析
- 實時看板 (Dashboards)
- 面向企業內部分析師和管理者的報表
- 面向用戶或者客戶的高併發報表分析(Customer Facing Analytics)。比如面向網站主的站點分析、面向廣告主的廣告報表,併發通常要求成千上萬的 QPS ,查詢延時要求毫秒級響應。著名的電商公司京東在廣告報表中使用 Apache Doris ,每天寫入 100 億行數據,查詢併發 QPS 上萬,99 分位的查詢延時 150ms。
- 即席查詢(Ad-hoc Query):面向分析師的自助分析,查詢模式不固定,要求較高的吞吐。小米公司基於 Doris 構建了增長分析平臺(Growing Analytics,GA),利用用戶行為數據對業務進行增長分析,平均查詢延時 10s,95 分位的查詢延時 30s 以內,每天的 SQL 查詢量為數萬條。
- 統一數倉構建 :一個平臺滿足統一的數據倉庫建設需求,簡化繁瑣的大數據軟體棧。海底撈基於 Doris 構建的統一數倉,替換了原來由 Spark、Hive、Hbase、Phoenix 組成的舊架構,架構大大簡化。
- 數據湖聯邦查詢:通過外表的方式聯邦分析位於 Hive、Hudi 中的數據,在避免數據拷貝的前提下,查詢性能大幅提升
優勢
架構
Doris 的架構很簡潔,只設 FE(Frontend)前端進程、BE(Backend)後端進程兩種角色、兩個後臺的服務進程,不依賴於外部組件,方便部署和運維,FE、BE 都可線上性擴展。
- FE(Frontend):存儲、維護集群元數據;負責接收、解析查詢請求,規劃查詢計劃,調度查詢執行,返回查詢結果。主要有三個角色:
- Leader 和 Follower:主要是用來達到元數據的高可用,保證單節點宕機的情況下,元數據能夠實時地線上恢復,而不影響整個服務。
- Observer:用來擴展查詢節點,同時起到元數據備份的作用。如果在發現集群壓力非常大的情況下,需要去擴展整個查詢的能力,那麼可以加 observer 的節點。observer 不參與任何的寫入,只參與讀取。
- BE(Backend):負責物理數據的存儲和計算;依據 FE 生成的物理計劃,分散式地執行查詢。數據的可靠性由 BE 保證,BE 會對整個數據存儲多副本或者是三副本。副本數可根據需求動態調整。
- MySQL Client:Doris 藉助 MySQL 協議,用戶使用任意 MySQL 的 ODBC/JDBC 以及 MySQL 的客戶端,都可以直接訪問 Doris。
- Broker:一個獨立的無狀態進程。封裝了文件系統介面,提供 Doris 讀取遠端存儲系統中文件的能力,包括 HDFS,S3,BOS 等。
預設埠
實例名稱 | 埠名稱 | 預設埠 | 通訊方向 | 說明 |
---|---|---|---|---|
BE | be_port | 9060 | FE-->BE | BE 上 thrift server 的埠,用於接收來自 FE 的請求 |
BE | webserver_port | 8040 | BE<-->FE | BE 上的 http server 埠 |
BE | heartbeat_service_port | 9050 | FE-->BE | BE 上心跳服務埠,用於接收來自 FE 的心跳 |
BE | brpc_prot* | 8060 | FE<-->BE,BE<-->BE | BE 上的 brpc 埠,用於 BE 之間通信 |
FE | http_port | 8030 | FE<-->FE ,用戶<--> FE | FE 上的 http_server 埠 |
FE | rpc_port | 9020 | BE-->FE ,FE<-->FE | FE 上 thirft server 埠 |
FE | query_port | 9030 | 用戶<--> FE | FE 上的 mysql server 埠 |
FE | edit_log_port | 9010 | FE<-->FE | FE 上 bdbje 之間通信用的埠 |
Broker | broker_ipc_port | 8000 | FE-->BROKER,BE-->BROKER | Broker 上的 thrift server,用於接收請求 |
安裝
安裝前準備
-
Linux 操作系統版本需求
CentOS 7.1及以上版本
Ubuntu 16.04及以上版本 -
軟體需求
java 1.8及以上版本
GCC 4.8.2及以上版本 -
操作系統環境要求
vi /etc/security/limits.conf
# 在文件最後添加下麵幾行信息(註意* 也要複製進去)
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
# ulimit -n 65535 臨時生效
# 重啟永久生效。
# 如果不修改這個句柄數大於等於60000,啟動doris be節點時會報如下錯誤
File descriptor number is less than 60000. Please use (ulimit -n) to set a value equal or greater than 60000
W1120 18:14:20.934705 3437 storage_engine.cpp:188] check fd number failed, error: Internal error: file descriptors limit is too small
W1120 18:14:20.934713 3437 storage_engine.cpp:102] open engine failed, error: Internal error: file descriptors limit is too small
F1120 18:14:20.935087 3437 doris_main.cpp:404] fail to open StorageEngine, res=file descriptors limit is too small
- 時鐘同步
Doris 的元數據要求時間精度要小於5000ms,所以所有集群所有機器要進行時鐘同步,避免因為時鐘問題引發的元數據不一致導致服務出現異常。
# ntpdate是一個向互聯網上的時間伺服器進行時間同步的軟體
yum install ntpdate -y
# 然後開始三台機器自己同步時間
ntpdate ntp.sjtu.edu.cn
# 美國標準技術院時間伺服器:time.nist.gov(192.43.244.18)
# 上海交通大學網路中心NTP伺服器地址:ntp.sjtu.edu.cn(202.120.2.101)
# 中國國家授時中心伺服器地址:cn.pool.ntp.org(210.72.145.44)
# 將當前時間寫入bios,這樣才能永久生效不變,不然reboot後還會恢復到原來的時間
clock -w
- 關閉交換分區(swap)
交換分區是linux用來當做虛擬記憶體用的磁碟分區;
linux可以把一塊磁碟分區當做記憶體來使用(虛擬記憶體、交換分區);
Linux使用交換分區會給Doris帶來很嚴重的性能問題,建議在安裝之前禁用交換分區;
# 臨時關閉交換分區
swapoff -a
# 永久刪除Swap掛載
vim /etc/fstab
註釋 swap 行
- mysql
安裝FE
1.官網下載源碼包,官網地址:https://doris.apache.org
2.下載後上傳到linux並解壓
3.修改配置文件
# 去自己的路勁中找到fe.conf文件
vi /opt/apps/doris/fe/conf/fe.conf
#配置文件中指定元數據路徑: 註意這個文件夾要自己創建
meta_dir = /opt/data/dorisdata/doris-meta
#修改綁定 ip(每台機器修改成自己的 ip)
priority_networks = 192.168.22.0/24
安裝BE
1.官網下載源碼包,官網地址:https://doris.apache.org
2.下載後上傳到linux並解壓
3.修改配置文件
# 去自己的路勁中找到be.conf文件
vi /opt/apps/doris/be/conf/be.conf
#配置文件中指定數據存放路徑: 需在啟動前創建目錄
storage_root_path = /opt/data/doris/be/storage.HDD;/opt/data/doris/be/storage.SSD
#修改綁定 ip(每台機器修改成自己的 ip)
priority_networks = 192.168.17.0/24
分發集群
for i in 2 3
do
scp /et/profile linux0$i:/etc/profile
scp -r /opt/apps/doris/ linux0$i:/opt/apps/
done
Mysql CLient連接FE
# 進入到fe的bin目錄下執行
./start_fe.sh --daemon
mysql -h linux01 -P 9030 -uroot
# 設置密碼
SET PASSWORD FOR 'root' = PASSWORD('123');
# 查看fe的運行狀態
SHOW PROC '/frontends'\G;
# 添加BE節點
ALTER SYSTEM ADD BACKEND "linux01:9050";
ALTER SYSTEM ADD BACKEND " linux02:9050";
ALTER SYSTEM ADD BACKEND " linux03:9050";
# 查看BE狀態
SHOW PROC '/backends';
# 添加環境變數
vi /etc/profile
#doris_fe
export DORIS_FE_HOME=/opt/app/doris1.1.4/fe
export PATH=$PATH:$DORIS_FE_HOME/bin
#doris_be
export DORIS_BE_HOME=/opt/app/doris1.1.4/be
export PATH=$PATH:$DORIS_BE_HOME/bin
source /etc/profile
# 啟動 BE(每個節點)
start_be.sh --daemon
# 啟動後再次查看BE的節點
SHOW PROC '/backends';
# Alive 為 true 表示該 BE 節點存活
部署FS_Broker
Broker 以插件的形式,獨立於 Doris 部署。如果需要從第三方存儲系統導入數據,需要部署相應的 Broker,預設提供了讀取 HDFS、百度雲 BOS 及 Amazon S3 的 fs_broker。fs_broker 是無狀態的,建議每一個 FE 和 BE 節點都部署一個 Broker。
# 啟動 Broker
/opt/apps/doris/fe/apache_hdfs_broker/bin/start_broker.sh --daemon
# 使用 mysql-client 連接啟動的 FE,執行以下命令:
mysql -h linux01 -P 9030 -uroot -p 123
ALTER SYSTEM ADD BROKER broker_name "linux01:8000","linux02:8000","linux03:8000";
# broker_name 這隻是一個名字,可以自己取
# 查看 Broker 狀態
# 使用 mysql-client 連接任一已啟動的 FE,執行以下命令查看 Broker 狀態:
SHOW PROC "/brokers";
擴容和縮容
FE 擴容和縮容
可以通過將 FE 擴容至 3 個以上節點來實現 FE 的高可用。
使用 MySQL 登錄客戶端後,可以使用 sql 命令 SHOW PROC '/frontends'\G;
查看 FE 狀態,目前就一臺 FE
FE 分為 Leader,Follower 和 Observer 三種角色。 預設一個集群,只能有一個 Leader,可以有多個 Follower 和 Observer。其中 Leader 和 Follower 組成一個 Paxos 選擇組,如果Leader 宕機,則剩下的 Follower 會自動選出新的 Leader,保證寫入高可用。Observer 同步 Leader 的數據,但是不參加選舉。
如果只部署一個 FE,則 FE 預設就是 Leader。在此基礎上,可以添加若幹 Follower 和 Observer。
-- 添加FE的新節點
ALTER SYSTEM ADD FOLLOWER "linux02:9010";
ALTER SYSTEM ADD OBSERVER "linux03:9010";
在linux01和linux02分別啟動FE
# 第一次添加,一定要加這兩個參數 --helper linux01:9010
/opt/apps/doris/fe/bin/start_fe.sh --helper linux01:9010 --daemon
此時,再在linux01的mysql客戶端中使用 SHOW PROC '/frontends'\G;
命令查看FE的狀態
刪除FE節點命令
-- 刪除 Follower FE 時,確保最終剩餘的 Follower(包括 Leader)節點最好為奇數。
ALTER SYSTEM DROP FOLLOWER[OBSERVER] "fe_host:edit_log_port";
ALTER SYSTEM DROP FOLLOWER "linux03:9010";
BE 擴容和縮容
增加 BE 節點
-- 在 MySQL 客戶端,通過 ALTER SYSTEM ADD BACKEND 命令增加 BE 節點。
ALTER SYSTEM ADD BACKEND "linux01:9050";
-- DROP 方式刪除 BE 節點(不推薦)
ALTER SYSTEM DROP BACKEND "be_host:be_heartbeat_service_port";
ALTER SYSTEM DROP BACKEND "linux03:9050";
-- 註意:DROP BACKEND 會直接刪除該 BE,並且其上的數據將不能再恢復!!!所以我們強烈不推薦使用 DROP BACKEND 這種方式刪除 BE 節點。當你使用這個語句時,會有對應的防誤操作提示。
-- DECOMMISSION 方式刪除 BE 節點(推薦)
ALTER SYSTEM DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";
ALTER SYSTEM DECOMMISSION BACKEND "linux03:9050";
-- 1.該命令用於安全刪除 BE 節點。命令下發後,Doris 會嘗試將該 BE 上的數據向其 他 BE 節點遷移,當所有數據都遷移完成後,Doris 會自動刪除該節點。
-- 2.該命令是一個非同步操作。執行後,可以通過 SHOW PROC '/backends'; 看到該 BE節點的 isDecommission 狀態為 true。表示該節點正在進行下線。
-- 3.該命令不一定執行成功。比如剩餘 BE 存儲空間不足以容納下線 BE 上的數據,或者剩餘機器數量不滿足最小副本數時,該命令都無法完成,並且 BE 會一直處於isDecommission 為 true 的狀態。
-- 4.DECOMMISSION 的進度,可以通過 SHOW PROC '/backends'; 中的 TabletNum 查看,如果正在進行,TabletNum 將不斷減少。
-- 5.該操作可以通過如下命令取消:CANCEL DECOMMISSION BACKEND "be_host:be_heartbeat_service_port"; 取消0後,該 BE 上的數據將維持當前剩餘的數據量。後續 Doris 重新進行負載均衡。
Broker 擴容縮容
-- Broker 實例的數量沒有硬性要求。通常每台物理機部署一個即可。Broker 的添加和刪除可以通過以下命令完成:
ALTER SYSTEM ADD BROKER broker_name "broker_host:broker_ipc_port";
ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port";
ALTER SYSTEM DROP ALL BROKER broker_name;
-- Broker 是無狀態的進程,可以隨意啟停。當然,停止後,正在其上運行的作業會失敗,重試即可。