DorisDB
Apache Doris最早誕生於2008年,最初只為解決百度鳳巢報表的專用系統。在08年那個時候數據存儲和計算成熟的開源產品非常少,Hbase的導入性能只有大約2000條/秒,在這種不能滿足業務的背景下,doris
誕生了,並且跟隨百度鳳巢系統一起正式上線。
Apache Doris是一個現代化的MPP分析性數據庫產品。僅需要亞秒級響應時間即可獲得查詢結果,有效地支持實時數據分析。Apache Doris可以滿足多種數據分析需求,例如固定歷史報表,實時數據分析。
https://baijiahao.baidu.com/s?id=1633669902039812353&wfr=spider&for=pc
http://doc.dorisdb.com/2178813
DorisDB集群的安裝
hadoop102 |
hadoop103 |
hadoop104 |
FE(LEADER) |
FE(FOLLOWER) |
FE(OBSERVER) |
BE |
BE |
BE |
BROKER |
BROKER |
BROKER |
1.FE的磁盤主要用於存儲元數據,包括日志,和image。通常幾百MB到幾個GB不等
2.BE的磁盤主要用於存儲用戶數據,總磁盤空間按用戶總數據量*3(3份副本)計算,然后再預留額外40%的空間用作后台compaction以及一些中間數據的存放。
3.一台機器上可以部署多個BE實例,但只能部署一個FE。如果需要3副本數據,那么至少三台機器各部署一個BE實例。
4.FE角色分為Follower和Observer,(Leader為Follwer中選舉出來的一種角色)
5.FE節點至少為1個。當部署1個Follower和1個Observer時,可以實現高可用HA
6.Follower的數量必須為奇數,Observer數量隨意
7.根據官網描述,以往經驗,當集群可用性要求很高,可以部署3個Follower和1-3個Observer。如果是離線業務,建議部署1個Follower和1-3個Observer
8.Broker部署,Broker是用於訪問外部數據源hdfs進程。通常每台機器上部署一個broker實例即可。
二進制產品包
安裝包的下載:https://www.starrocks.com/zh-CN/download/community
DorisDB-XX-1.0.0
├── be # BE目錄
│ ├── bin
│ │ ├── start_be.sh # BE啟動命令
│ │ └── stop_be.sh # BE關閉命令
│ ├── conf
│ │ └── be.conf # BE配置文件
│ ├── lib
│ │ ├── dorisdb_be # BE可執行文件
│ │ └── meta_tool
│ └── www
├── fe # FE目錄
│ ├── bin
│ │ ├── start_fe.sh # FE啟動命令
│ │ └── stop_fe.sh # FE關閉命令
│ ├── conf
│ │ └── fe.conf # FE配置文件
│ ├── lib
│ │ ├── dorisdb-fe.jar # FE jar包
│ │ └── *.jar # FE 依賴的jar包
│ └── webroot
└── udf
部署FE
FE的基本配置
第一步: 定制配置文件conf/fe.conf:
FE的配置文件為DorisDB-XX-1.0.0/fe/conf/fe.conf
可以根據FE內存大小調整 -Xmx4096m,為了避免GC建議16G以上,DorisDB的元數據都在內存中保存。
vim fe/conf/fe.conf
meta_dir = /opt/module/apache-doris/fe/doris-meta
第二步: 創建元數據目錄:
mkdir -p fe/doris-meta
第三步: 啟動FE進程:
fe/bin/start_fe.sh --daemon
第四步: 確認啟動FE啟動成功.
查看日志log/fe.log確認.
[FeServer.start():48] thrift server started. [NMysqlServer.start():70] Open mysql server success on 9030 [QeService.start():60] QE service start. [HttpServer$HttpServerThread.run():231] HttpServer started with port 8030
- 如果FE啟動失敗,可能是由於端口號被占用,修改配置文件conf/fe.conf中的端口號http_port。
- 使用jps命令查看java進程確認"DorisDbFe"存在.
- 使用瀏覽器訪問8030端口, 打開DorisDB的WebUI, 用戶名為root, 密碼為空.
使用MySQL客戶端訪問FE
第一步: 安裝mysql客戶端(如果已經安裝,可忽略此步):
Ubuntu:sudo apt-get install mysql
Centos:sudo yum install mysql-client
第二步: 使用mysql客戶端連接:
mysql -h hadoop102 -P9030 -uroot
注意:這里默認root用戶密碼為空,端口為fe/conf/fe.conf中的query_port配置項,默認為9030
第三步: 查看FE狀態:
mysql> SHOW PROC '/frontends'\G
mysql> SHOW PROC '/frontends'\G *************************** 1. row *************************** Name: 192.168.122.1_9010_1634461485149 IP: 192.168.122.1 HostName: 192.168.122.1 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: FOLLOWER IsMaster: true ClusterId: 1315220597
Join: true Alive: true ReplayedJournalId: 61 LastHeartbeat: 2021-10-17 17:08:25 IsHelper: true ErrMsg: 1 row in set (20.07 sec)
Role為FOLLOWER說明這是一個能參與選主的FE;IsMaster為true,說明該FE當前為主節點。
如果MySQL客戶端連接不成功,請查看log/fe.warn.log日志文件,確認問題。由於是初次啟動,如果在操作過程中遇到任何意外問題,都可以刪除並重新創建FE的元數據目錄,再從頭開始操作。
FE的高可用集群部署
FE的高可用集群采用主從復制架構, 可避免FE單點故障. FE采用了類raft的bdbje協議完成選主, 日志復制和故障切換. 在FE集群中, 多實例分為兩種角色: follower和observer; 前者為復制協議的可投票成員, 參與
選主和提交日志, 一般數量為奇數(2n+1), 使用多數派(n+1)確認, 可容忍少數派(n)故障; 而后者屬於非投票成員, 用於異步訂閱復制日志, observer的狀態落后於follower, 類似其他復制協議中的leaner角色.
FE集群從follower中自動選出master節點, 所有更改狀態操作都由master節點執行, 從FE的master節點可以讀到最新的狀態. 更改操作可以從非master節點發起, 繼而轉發給master節點執行, 非master節點記錄最
近一次更改操作在復制日志中的LSN, 讀操作可以直接在非master節點上執行, 但需要等待非master節點的狀態已經同步到最近一次更改操作的LSN, 因此讀寫非Master節點滿足順序一致性. Observer節點能夠增
加FE集群的讀負載能力, 時效性要求放寬的非緊要用戶可以讀observer節點.
FE節點之間的時鍾相差不能超過5s, 使用NTP協議校准時間.
一台機器上只可以部署單個FE節點。所有FE節點的http_port需要相同。
集群部署按照下列步驟逐個增加FE實例.
第一步: 分發二進制和配置文件到另外兩個節點, 配置文件和單實例情形相同.
scp -r apache-doris/ hadoop103:/opt/module/
scp -r apache-doris/ hadoop104:/opt/module/
第二步: 使用MySQL客戶端連接已有的FE, 添加新實例的信息,信息包括角色、ip、port:
mysql> ALTER SYSTEM ADD FOLLOWER "host:port"; 或 mysql> ALTER SYSTEM ADD OBSERVER "host:port"; mysql> ALTER SYSTEM ADD FOLLOWER "hadoop103:9010"; Query OK, 0 rows affected (0.02 sec) mysql> ALTER SYSTEM ADD OBSERVER "hadoop104:9010"; Query OK, 0 rows affected (0.00 sec)
host為機器的IP,如果機器存在多個IP,需要選取priority_networks里的IP,例如priority_networks=192.168.1.0/24 可以設置使用192.168.1.x 這個子網進行通信。port為edit_log_port,默認為9010。
DorisDB的FE和BE因為安全考慮都只會監聽一個IP來進行通信,如果一台機器有多塊網卡,可能DorisDB無法自動找到正確的IP,例如 ifconfig 命令能看到 eth0 ip為 192.168.1.1, docker0: 172.17.0.1 ,我們可以設置 192.168.1.0/24 這一個字網來指定使用eth0作為通信的IP,這里采用是CIDR的表示方法來指定IP所在子網范圍,這樣可以在所有的BE,FE上使用相同的配置。
priority_networks 是 FE 和 BE 相同的配置項,寫在 fe.conf 和 be.conf 中。該配置項用於在 FE 或 BE 啟動時,告訴進程應該綁定哪個IP。示例如下:priority_networks=10.1.3.0/24
啟動hadoop103、hadoop104的fe
sh bin/start_fe.sh --daemon
mysql> SHOW PROC '/frontends'\G *************************** 1. row *************************** Name: 192.168.122.1_9010_1634461485149 IP: 192.168.122.1 HostName: 192.168.122.1 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: FOLLOWER IsMaster: true ClusterId: 1315220597
Join: true Alive: true ReplayedJournalId: 687 LastHeartbeat: 2021-10-17 17:43:03 IsHelper: true ErrMsg: *************************** 2. row *************************** Name: 192.168.1.104_9010_1634463682433 IP: 192.168.1.104 HostName: hadoop104 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: OBSERVER IsMaster: false ClusterId: 1315220597
Join: false Alive: true ReplayedJournalId: 549 LastHeartbeat: 2021-10-17 17:43:03 IsHelper: false ErrMsg: *************************** 3. row *************************** Name: 192.168.1.103_9010_1634463628227 IP: 192.168.1.103 HostName: hadoop103 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: FOLLOWER IsMaster: false ClusterId: 1315220597
Join: false Alive: true ReplayedJournalId: 539 LastHeartbeat: 2021-10-17 17:43:03 IsHelper: true ErrMsg: 3 rows in set (20.08 sec) mysql>
節點的Alive顯示為true則說明添加節點成功。192.168.122.1_9010_1634461485149 為主節點。
xcall.sh jps --------- hadoop102 ----------
3008 StarRocksFe 3760 Jps --------- hadoop103 ----------
3441 Jps 3244 StarRocksFe --------- hadoop104 ----------
3234 StarRocksFe 3404 Jps
部署BE
如果開啟了hadoop,yarn的8040端口號與be的web端口號會產生沖突;
修改doris fe.conf配置,將http port修改為其他端口
BE的基本配置
BE的配置文件為DorisDB-XX-1.0.0/be/conf/be.conf,
BE部署
用戶可使用下面命令添加BE到DorisDB集群, 一般至少部署3個BE實例, 每個實例的添加步驟相同.
cd DorisDB-XX-1.0.0/be
第一步: 創建數據目錄:
mkdir -p be/storage
添加到be/conf/be.conf中 vim be/conf/be.conf
storage_root_path = /opt/module/apache-doris/be/storage,10;
storage_root_path配置存儲目錄,可以用來指定多個目錄,每個目錄后可以跟逗號,指定大小默認GB;
第二步: 通過mysql客戶端添加BE節點:
mysql> ALTER SYSTEM ADD BACKEND "host:port";
這里IP地址為和priority_networks設置匹配的IP,portheartbeat_service_port,默認為9050
在mysql客戶端添加BE 節點
mysql> ALTER SYSTEM ADD BACKEND "hadoop102:9050"; Query OK, 0 rows affected (0.00 sec) mysql> ALTER SYSTEM ADD BACKEND "hadoop103:9050"; Query OK, 0 rows affected (0.00 sec) mysql> ALTER SYSTEM ADD BACKEND "hadoop104:9050"; Query OK, 0 rows affected (0.00 sec)
在hadoop102、hadoop103、hadoop104節點啟動BE:
sh bin/start_be.sh --daemon
sh bin/start_be.sh --daemon
sh bin/start_be.sh --daemon
查看BE狀態,確認BE就緒: mysql> SHOW PROC '/backends'\G *************************** 1. row *************************** BackendId: 10003 Cluster: default_cluster IP: 192.168.1.102 HostName: hadoop102 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2021-10-17 18:07:27 LastHeartbeat: 2021-10-17 18:07:47 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 0 DataUsedCapacity: .000 AvailCapacity: 20.053 GB TotalCapacity: 45.095 GB UsedPct: 55.53 % MaxDiskUsedPct: 55.53 % ErrMsg: Version: 1.18.2-7b65727 Status: {"lastSuccessReportTabletsTime":"2021-10-17 18:07:28"} *************************** 2. row *************************** BackendId: 10007 Cluster: default_cluster IP: 192.168.1.103 HostName: hadoop103 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2021-10-17 18:07:37 LastHeartbeat: 2021-10-17 18:07:47 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 0 DataUsedCapacity: .000 AvailCapacity: 1.000 B TotalCapacity: .000 UsedPct: 0.00 % MaxDiskUsedPct: 0.00 % ErrMsg: Version: 1.18.2-7b65727 Status: {"lastSuccessReportTabletsTime":"N/A"} *************************** 3. row *************************** BackendId: 10008 Cluster: default_cluster IP: 192.168.1.104 HostName: hadoop104 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2021-10-17 18:07:32 LastHeartbeat: 2021-10-17 18:07:47 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 0 DataUsedCapacity: .000 AvailCapacity: 1.000 B TotalCapacity: .000 UsedPct: 0.00 % MaxDiskUsedPct: 0.00 % ErrMsg: Version: 1.18.2-7b65727 Status: {"lastSuccessReportTabletsTime":"N/A"} 3 rows in set (0.03 sec)
如果isAlive為true,則說明BE正常接入集群。如果BE沒有正常接入集群,請查看log目錄下的be.WARNING日志文件確定原因。
部署Broker
部署FS_BROKER,BROKER以插件的形式,獨立與Doris的部署,建議每個PE和BE節點都部署一個Broker,Broker是用於訪問外部數據源的進程,默認是HDSF。
配置文件為apache_hdfs_broker/conf/apache_hdfs_broker.conf
注意:如果機器有多個IP,需要配置priority_networks,方式同FE。
如果有特殊的hdfs配置,復制線上的hdfs-site.xml到conf目錄下
啟動:
./apache_hdfs_broker/bin/start_broker.sh --daemon
添加broker節點到集群中:
MySQL> ALTER SYSTEM ADD BROKER broker1 "172.16.139.24:8000";
查看broker狀態
添加broker節點到集群:
mysql> ALTER SYSTEM ADD BROKER broker2 "hadoop102:8000"; Query OK, 0 rows affected (0.02 sec) mysql> ALTER SYSTEM ADD BROKER broker2 "hadoop103:8000"; Query OK, 0 rows affected (0.00 sec) mysql> ALTER SYSTEM ADD BROKER broker2 "hadoop104:8000"; Query OK, 0 rows affected (0.00 sec)
查看broker狀態: mysql> SHOW PROC "/brokers"\G *************************** 1. row *************************** Name: broker2 IP: 192.168.1.103 Port: 8000 Alive: true LastStartTime: 2021-10-17 18:24:10 LastUpdateTime: 2021-10-17 18:24:20 ErrMsg: *************************** 2. row *************************** Name: broker2 IP: 192.168.1.104 Port: 8000 Alive: true LastStartTime: 2021-10-17 18:24:00 LastUpdateTime: 2021-10-17 18:24:20 ErrMsg: *************************** 3. row *************************** Name: broker2 IP: 192.168.1.102 Port: 8000 Alive: true LastStartTime: 2021-10-17 18:23:35 LastUpdateTime: 2021-10-17 18:24:20 ErrMsg: 3 rows in set (0.00 sec)
Alive為true代表狀態正常。
xcall.sh jps --------- hadoop102 ----------
3008 StarRocksFe 5364 Jps 5189 BrokerBootstrap --------- hadoop103 ----------
4937 Jps 4810 BrokerBootstrap 3244 StarRocksFe --------- hadoop104 ----------
4784 BrokerBootstrap 3234 StarRocksFe 4916 Jps fe節點的查看: ps -ef | grep fe root 94 2 0 16:10 ? 00:00:00 [deferwq] kris 3008 1 1 17:04 pts/0 00:01:17 /opt/module/jdk1.8.0_212/bin/java -Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:/opt/module/apache-doris/fe/log/fe.gc.log.20211017-170443 com.starrocks.StarRocksFe kris 5356 3381 0 18:34 pts/1 00:00:00 grep --color=auto fe
參數設置
- Swappiness
關閉交換區,消除交換內存到虛擬內存時對性能的擾動。
echo 0 | sudo tee /proc/sys/vm/swappiness
- Compaction相關
當使用聚合表或更新模型,導入數據比較快的時候,可改下列參數以加速compaction。
cumulative_compaction_num_threads_per_disk = 4 base_compaction_num_threads_per_disk = 2 cumulative_compaction_check_interval_seconds = 2
- 並行度
在客戶端執行命令,修改DorisDB的並行度(類似clickhouse set max_threads= 8)。並行度可以設置為當前機器CPU核數的一半。
set global parallel_fragment_exec_instance_num = 8;
使用MySQL客戶端訪問DorisDB
1 Root用戶登錄
使用MySQL客戶端連接某一個FE實例的query_port(9030), DorisDB內置root用戶,密碼默認為空:
mysql -h fe_host -P9030 -u root
2 創建新用戶
通過下面的命令創建一個普通用戶:
mysql > create user 'test' identified by '123456';
3 創建數據庫
DorisDB中root賬戶才有權建立數據庫,使用root用戶登錄,建立example_db數據庫:
mysql > create database example_db;
數據庫創建完成之后,可以通過show databases查看數據庫信息:
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| example_db |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)
information_schema是為了兼容mysql協議而存在,實際中信息可能不是很准確,所以關於具體數據庫的信息建議通過直接查詢相應數據庫而獲得。
4 賬戶授權
example_db創建完成之后,可以通過root賬戶example_db讀寫權限授權給test賬戶,授權之后采用test賬戶登錄就可以操作example_db數據庫了:
mysql > grant all on example_db to test;
退出root賬戶,使用test登錄DorisDB集群:
mysql > exit
mysql -h hadoop102 -P9030 -utest -p123456
5 建表
DorisDB支持支持單分區和復合分區兩種建表方式
在復合分區中:
- 第一級稱為Partition,即分區。用戶可以指定某一維度列作為分區列(當前只支持整型和時間類型的列),並指定每個分區的取值范圍。
- 第二級稱為Distribution,即分桶。用戶可以指定某幾個維度列(或不指定,即所有KEY列)以及桶數對數據進行HASH分布。
以下場景推薦使用復合分區:
- 有時間維度或類似帶有有序值的維度:可以以這類維度列作為分區列。分區粒度可以根據導入頻次、分區數據量等進行評估。
- 歷史數據刪除需求:如有刪除歷史數據的需求(比如僅保留最近N 天的數據)。使用復合分區,可以通過刪除歷史分區來達到目的。也可以通過在指定分區內發送DELETE語句進行數據刪除。
- 解決數據傾斜問題:每個分區可以單獨指定分桶數量。如按天分區,當每天的數據量差異很大時,可以通過指定分區的分桶數,合理划分不同分區的數據,分桶列建議選擇區分度大的列。
用戶也可以不使用復合分區,即使用單分區。則數據只做HASH分布。
下面分別演示兩種分區的建表語句:
- 首先切換數據庫:mysql > use example_db;
- 建立單分區表建立一個名字為table1的邏輯表。使用全hash分桶,分桶列為siteid,桶數為10。這個表的schema如下:
- siteid:類型是INT(4字節), 默認值為10
- cidy_code:類型是SMALLINT(2字節)
- username:類型是VARCHAR, 最大長度為32, 默認值為空字符串
- pv:類型是BIGINT(8字節), 默認值是0; 這是一個指標列, DorisDB內部會對指標列做聚合操作, 這個列的聚合方法是求和(SUM)。這里采用了聚合模型,除此之外DorisDB還支持明細模型和更新模型,具體參考數據模型介紹。