天天看點

用新伺服器從零開始部署 DolphinDB

本文主要介紹在新伺服器部署 DolphinDB 時需要注意哪些系統配置,以及如何選擇 DolphinDB 部署方式以符合業務需求。合适的系統配置可以提高 DolphinDB 系統的穩定性和可維護性,而合适的部署方式可以提高業務執行的效率。

1. 作業系統配置

本文以 CentOS 7.9.2009 為例,介紹 DolphinDB 相關的系統配置方法。

1.1 平台要求與推薦

1.1.1 支援的平台

平台 處理器架構 是否支援
Linux x86
arm
龍芯
Windows x86
Mac -
BSD -
在 Linux 系統使用 DolphinDB 要求核心版本為 Linux 2.6.19 或以上,推薦使用 CentOS 7 穩定版。

1.1.2 依賴軟體

DolphinDB 依賴 gcc 4.8.5 或以上版本。以在 CentOS 7 穩定版上安裝為例:

# yum install -y gcc      

1.1.3 推薦硬體配置

需要為 DolphinDB 中繼資料,redo log 以及資料實體配置不同的硬碟,以優化系統性能。

  • 中繼資料和 redo log:建議配一塊小容量 SSD;若對可靠性要求較高,建議配置兩塊 SSD 做 RAID1;
  • 資料實體:如果無需節約成本,優先考慮多塊 SSD 以獲得較好的讀寫性能;如果需要節約成本,優先考慮配置多塊機械硬碟以實作并行讀寫,提高讀寫吞吐量。

硬碟容量取決于實際業務。

資料實體存在1塊 SSD 或多塊 HDD 的讀寫性能差距取決于實際情況。

1.2 檔案系統與 inode 數量

1.2.1 檔案系統說明

推薦:在 Linux 下推薦使用 xfs 檔案系統類型,因為 xfs 檔案系統不僅支援硬連結,還支援動态調整 ​​inode​​

不推薦:不支援硬連結的檔案系統類型,例如 beegfs。其相較于支援硬連結的系統,其資料更新的性能較差。

root 使用者(或有 root 權限的使用者,下文指令前面添加 sudo)通過 SSH 連接配接到全新安裝的 CentOS 伺服器。首先使用 ​

​df -T​

​ 指令檢視檔案系統類型:

# df -T
檔案系統                類型        1K-塊    已用     可用 已用% 挂載點
devtmpfs                devtmpfs  3992420       0  3992420    0% /dev
tmpfs                   tmpfs     4004356       0  4004356    0% /dev/shm
tmpfs                   tmpfs     4004356    8748  3995608    1% /run
tmpfs                   tmpfs     4004356       0  4004356    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs      52403200 1598912 50804288    4% /
/dev/sda1               xfs       1038336  153388   884948   15% /boot
tmpfs                   tmpfs      800872       0   800872    0% /run/user/0
/dev/mapper/centos-home xfs      42970624   33004 42937620    1% /home      

/home 目錄對應的檔案系統類型為 xfs,是以可以将 DolphinDB 安裝在此目錄下。

若 /home 目錄檔案系統類型為 ext4 等不支援動态調整 inode 數量的類型,需要将其格式化為 xfs 類型。格式化步驟如下:

1. 備份 /home 資料

# cp -R /home /tmp      

2. 解除安裝 /home 并删除對應邏輯卷

# umount /home
# lvremove /dev/mapper/centos-home
Do you really want to remove active logical volume centos/home? [y/n]: y
  Logical volume "home" successfully removed      

3. 檢視硬碟剩餘可用空間

# vgdisplay | grep Alloc
  Free  PE / Size       10527 / 41.12 GiB # 剩餘可用空間為 41.12 GB      

4. 建立 /home 邏輯卷并格式化為 xfs

# lvcreate -L 41G -n home centos # 根據剩餘可用空間填寫建立大小
WARNING: xfs signature detected on /dev/centos/home at offset 0. Wipe it? [y/n]: y
  Wiping xfs signature on /dev/centos/home.
  Logical volume "home" created.
# mkfs.xfs /dev/mapper/centos-home      

5. 挂載 /home 并恢複資料

# mount /dev/mapper/centos-home /home
# mv /tmp/home/* /home/
# chown owner /home/owner # 重新賦予 home 目錄檔案的權限給對應 owner,需要根據使用者名自行修改      

1.2.2 xfs 檔案系統動态調整 inode 數量

若使用 DolphinDB 時出現磁盤空間足夠,但因沒有可用 inode 導緻無法寫入檔案,可通過增加 inode 數量解決問題,步驟如下:

1. 檢視 inode 資訊:

# xfs_info /dev/mapper/centos-home | grep imaxpct
data = bsize=4096 blocks=10747904, imaxpct=25 # 即 /dev/mapper/centos-home 的 25% 的空間用于存放 inode
# df -i | grep /dev/mapper/centos-home
檔案系統                    Inode 已用(I)  可用(I) 已用(I)% 挂載點
/dev/mapper/centos-home 21495808       7 21495801       1% /home      

可見配置了 /dev/mapper/centos-home 卷下的 25 % 的空間用于存放 inode,目前可用 inode 數為 21495801 個。

2. 增加 inode 數量:

# xfs_growfs -m 30 /dev/mapper/centos-home
meta-data=/dev/mapper/centos-home isize=512    agcount=4, agsize=2686976 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=10747904, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=5248, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
inode max percent changed from 25 to 30      

3. 再次檢視 inode 資訊

df -i | grep /dev/mapper/centos-home
/dev/mapper/centos-home 25794944       7 25794937       1% /home      

可見目前可用 inode 數增加到了 25794937 個。

1.2.3 ext 檔案系統設定合适的 inode 數量

如果必須使用 ext4 等不支援動态調整 inode 數量的檔案系統類型,則需要在格式化硬碟時預估檔案使用情況和增長速度以設定合适的 inode 數量。例如通過 ​

​mkfs.ext4​

​ 指令的 ​

​-N​

​ 選項指定 inode 數量。尤其當硬碟空間特别大時,ext4 檔案系統預設的 inode 數量往往相對較少,建議設定較大的值。

1.3 挂載新硬碟

硬碟 IO 性能提升對于大資料處理非常重要,推薦硬體配置見 ​​1.1.3 節​​。

實體安裝新硬碟或通過雲服務商增加新硬碟後,通過 SSH 連接配接到 CentOS 伺服器。本節通過虛拟機添加容量為 50G 的新硬碟,步驟如下:

1. 使用 ​

​fdisk -l​

​ 檢視硬碟資訊:

# fdisk -l
...

磁盤 /dev/sdb:53.7 GB, 53687091200 位元組,104857600 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/實體):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組

...      

可見 /dev/sdb 為新加的 50G 硬碟。

2. 使用 fdisk 程式對新硬碟進行分區:

# fdisk /dev/sdb
歡迎使用 fdisk (util-linux 2.23.2)。

更改将停留在記憶體中,直到您決定将更改寫入磁盤。
使用寫入指令前請三思。

Device does not contain a recognized partition table
使用磁盤辨別符 0x7becd49e 建立新的 DOS 磁盤标簽。

指令(輸入 m 擷取幫助):n  # 添加新分區
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分區号 (1-4,預設 1):
起始 扇區 (2048-104857599,預設為 2048):
将使用預設值 2048
Last 扇區, +扇區 or +size{K,M,G} (2048-104857599,預設為 104857599):
将使用預設值 104857599
分區 1 已設定為 Linux 類型,大小設為 50 GiB

指令(輸入 m 擷取幫助):q      

3. 使用 ​

​mkfs.xfs​

​ 指令格式化新硬碟為 xfs 檔案系統類型:

# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0      

4. 建立挂載點并挂載

# mkdir -p /mnt/dev1
# mount /dev/sdb /mnt/dev1      

5. 檢視新硬碟挂載情況

# df -Th
檔案系統                類型      容量  已用  可用 已用% 挂載點
devtmpfs                devtmpfs  3.9G     0  3.9G    0% /dev
tmpfs                   tmpfs     3.9G     0  3.9G    0% /dev/shm
tmpfs                   tmpfs     3.9G  8.6M  3.9G    1% /run
tmpfs                   tmpfs     3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        50G  1.6G   49G    4% /
/dev/sda1               xfs      1014M  150M  865M   15% /boot
/dev/mapper/centos-home xfs        41G   33M   41G    1% /home
tmpfs                   tmpfs     783M     0  783M    0% /run/user/0
/dev/sdb                xfs        50G   33M   50G    1% /mnt/dev1      

6. 設定開機自動挂載

# blkid /dev/sdb
/dev/sdb: UUID="29ecb452-6454-4288-bda9-23cebcf9c755" TYPE="xfs"
# vi /etc/fstab
UUID=29ecb452-6454-4288-bda9-23cebcf9c755 /mnt/dev1             xfs     defaults        0 0      

注意這裡使用了 UUID 來辨別新硬碟,避免了磁盤更換位置導緻識别出錯。

1.4 開啟 core dump

core dump 指當程式出錯而異常中斷時,作業系統會把程式工作的目前狀态存儲成一個 core 檔案。core 檔案可以幫助技術支援人員定位問題。是以,在空間足夠的情況下,建議開啟 core dump。開啟步驟如下:

1. 建立存放 core 檔案的路徑

# mkdir /var/crash # 可自行修改存放目錄      

注意:

為目錄預留足以存放若幹 core 檔案的空間,其中core檔案最大為約為 maxMemSize 配置項的值;

確定 DolphinDB 在該目錄具備寫權限。

2. 設定開啟 core dump

# vi /etc/security/limits.conf
* soft core unlimited      

* 指為所有使用者開啟,也可以指定使用者名隻為 DolphinDB 使用者開啟,unlimited 指 core 檔案大小無限制。

3. 設定 core 檔案輸出路徑與格式

# vi /etc/sysctl.conf
kernel.core_pattern = /var/crash/core-%e-%s-%u-%g-%p-%t      

格式說明:

  • %e – 程式執行檔案名
  • %s – 生成 core 檔案時收到的信号
  • %u – 程序使用者 ID
  • %p – 程序号
  • %g – 程序使用者組 ID
  • %t – 生成 core 檔案的時間戳
  • %h – 主機名

4. 重新開機後檢視是否生效

# ulimit -c
unlimited      

1.5 增大檔案最大打開數量

DolphinDB 運作時同時打開的檔案數量可能會大于 CentOS 7 的檔案最大打開數量預設值 1024 個,建議配置檔案最大打開數量為 102400 個。配置步驟如下:

1. 檢視檔案最大打開數量

# ulimit -n # 使用者級
1024
# cat /proc/sys/fs/file-max # 系統級
763964      

可見使用者級檔案最大打開數量為 1024 個,系統級為 763964 個。DolphinDB 為使用者級,修改使用者級檔案最大打開數量為 102400 個即可。

2. 修改使用者級檔案最大打開數量

# vi /etc/security/limits.conf
* soft nofile 102400
* hard nofile 102400      

* 指對所有使用者生效,也可以配置為指定使用者名隻對 DolphinDB 使用者生效。

3. 若系統級最大打開檔案數量的配置值小于 102400 個,需要修改為不小于 102400 的值:

# vi /etc/sysctl.conf
fs.file-max = 102400      

本文例子中系統級檔案最大打開數量為 763964 個,大于 102400個,故不做修改。

4. 重新開機後檢視配置是否生效

# ulimit -n # 使用者級
102400
# cat /proc/sys/fs/file-max # 系統級
763964      

1.6 NTPD

若部署多機叢集模式,需要配置 NTPD(Network Time Protocol Daemon)進行時間同步,以確定事務發生的先後順序正确。本文使用兩台虛拟機分别配置為 NTPD 服務端和用戶端,配置如下:

虛拟機名稱 IP 子網路遮罩 NTPD 配置
虛拟機1 192.168.0.30 255.255.254.0 服務端,與 ​​cn.pool.ntp.org​​
虛拟機2 192.168.0.31 255.255.254.0 用戶端,與 192.168.0.30 時間同步

配置步驟如下:

1. 分别在兩台虛拟機上安裝 ntpd

# yum install ntp      

2. 在虛拟機1上配置與 ​​cn.pool.ntp.org​​

# vi /etc/ntp.conf
...
# Hosts on local network are less restricted.
restrict 192.168.0.0 mask 255.255.254.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.cn.pool.ntp.org iburst
server 1.cn.pool.ntp.org iburst
server 2.cn.pool.ntp.org iburst
server 3.cn.pool.ntp.org iburst
...      

其中第 4 行配置 IP 網段在 192.168.0.0 且子網路遮罩為 255.255.254.0 的本地網絡請求本機的 NTP 服務,nomodify 指用戶端不能修改服務端的參數配置,notrap 指不提供 trap 遠端登入。

3. 在虛拟機1上配置防火牆,添加 ntp 服務

# firewall-cmd --add-service=ntp --permanent
# firewall-cmd --reload      

4. 在虛拟機2上配置與虛拟機1時間同步

# vi /etc/ntp.conf
...
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 192.168.0.30 iburst
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
...      

5. 分别在兩台虛拟機上啟動 ntpd

# systemctl enable ntpd
# systemctl restart ntpd      

6. 等待若幹秒後,檢視 ntpd 運作狀況

虛拟機1:

# ntpstat
synchronised to NTP server (202.112.31.197) at stratum 2
   time correct to within 41 ms
   polling server every 64 s      

虛拟機2:

# ntpstat
synchronised to NTP server (192.168.0.30) at stratum 3
   time correct to within 243 ms
   polling server every 64 s      

1.7 防火牆配置

運作 DolphinDB 前,需要配置防火牆開放 DolphinDB 的各個節點的端口,或者關閉防火牆。

具體開放哪些端口取決于叢集配置,以開放 8900 ~ 8903 TCP 端口為例:

# firewall-cmd --add-port=8900-8903/tcp --permanent
# firewall-cmd --reload
# systemctl restart firewalld      

若不需要防火牆,可通過如下指令關閉:

# systemctl stop firewalld
# systemctl disable firewalld.service      

1.8 Swap

Swap 即交換分區,在實體記憶體不夠用時,作業系統會從實體記憶體中把部分暫時不被使用的資料轉移到交換分區,進而為目前運作的程式留出足夠的實體記憶體空間,保證程式的正常運作,但會造成系統性能下降。如果系統實體記憶體充足,且使用者比較重視性能,建議關閉 Swap,步驟如下:

1. 檢查 Swap 是否已關閉

# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        378M        7.1G        8.5M        136M        7.1G
Swap:          7.9G          0B        7.9G      

可見 Swap 的 total 值為 7.9G,未關閉。

2. 臨時關閉 Swap

# swapoff -a      

3. 再次檢查 Swap 是否已關閉

# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        378M        7.1G        8.5M        136M        7.1G
Swap:            0B          0B          0B      

可見 Swap 的 total 值為 0B,已關閉。

4. 永久關閉 Swap,注釋掉第 2 列值為 swap 的行

# vi /etc/fstab
...
# /dev/mapper/centos-swap swap                    swap    defaults        0 0
...      

2. 部署 DolphinDB

系統配置好後,即可根據業務需求選擇合适的部署方式部署 DolphinDB。

2.1 單節點、單機叢集、多機叢集的選擇

本節介紹不同部署方式之間的比較重要的差異,不同部署方式的功能和應用場景的完整清單見​​《​​DolphinDB 安裝使用指南》第 2.4 節。

2.1.1 相同單機資源,部署單節點和單機叢集的差異

單節點指在單機上部署一個 DolphinDB 單機節點,單機叢集指在單機上部署多個 DolphinDB 分布式節點。

單節點部署更簡單,且在單機配置(CPU核數、記憶體容量、硬碟個數)不高、計算任務不複雜的情況下,單節點的部署方式減少了節點間的網絡傳輸,在性能方面反而比單機叢集更好(但并不明顯)。

單機叢集通常适合密集型計算場景,将計算任務分發到不同的節點(程序)上,可以有效的隔離記憶體資源競争,提高計算效率。

叢集與單節點的另外兩個差異,一是叢集支援橫向擴充,即支援線上加入新的資料節點,提高整個叢集的最大負載;二是叢集支援高可用,容錯率更高。

綜上,單機部署時,建議部署叢集模式。

2.1.2 相同節點的情況下,部署單機叢集和多機叢集的差異

多機叢集部署指将 DolphinDB 分布式節點分别部署到多台機器上。

多機可以充分利用各個節點(機器)的計算資源和存儲資源。但是節點間通信引入了網絡開銷,故建議部署在内網并配置萬兆網絡以降低網絡開銷。

另外,假設每台機器故障機率相同,多機比單機更容易出現故障,但由于節點分布在多機上,通過開啟高可用支援,多機叢集容錯率更高。

2.1.3 單機多硬碟與多機部署的差異

對于大吞吐量、低計算的任務來說,單機多硬碟叢集模式因網絡開銷小而具有更好的性能。對于小吞吐量、重計算的場景,多機叢集的分布式計算優勢更明顯。

中繼資料和redo log的存儲,相關配置項包括:

  • ​​chunkMetaDir​​: 中繼資料目錄
  • ​​dfsMetaDir​​: 該目錄儲存控制器節點上的分布式檔案系統的中繼資料
  • ​​redoLogDir​​: OLAP 存儲引擎重做日志(redo log)的目錄
  • ​​TSDBRedoLogDir​​: TSDB 存儲引擎重做日志(redo log)的目錄

這些配置項建議指定到 SSD 以提高讀寫性能。

資料實體的存儲,相關配置項包括:

  • ​​volumes​​: 資料檔案目錄。多個目錄用 ',' 隔開,例如: /hdd/hdd1/volumes,/hdd/hdd2/volumes,/hdd/hdd3/volumes
  • ​​diskIOConcurrencyLevel​​: 讀寫磁盤資料的線程數,預設為1,若 volumes 全部配置為 HDD 硬碟,建議 diskIOConcurrencyLevel 設定為同 HDD 硬碟個數相同的值

2.2 Docker 和非 Docker 環境運作的選擇

Docker 隻是輕量化的資源隔離,DolphinDB 部署在 Docker 環境和非 Docker 環境下的運作性能差異不明顯,可根據業務需求選擇合适的運作環境。

2.3 生産環境配置參數實踐

以搭建中繼資料和流資料高可用叢集為例介紹如何配置叢集各節點。設叢集機器硬體配置相同,叢集機器資訊如下:

名稱 IP 備注
centos-1 175.178.100.3 1控制節點,1代理節點,1資料節點
centos-2 119.91.229.229 1控制節點,1代理節點,1資料節點
centos-3 175.178.100.213 1控制節點,1代理節點,1資料節點

3 台機器上 cluster.nodes 與 cluster.cfg 配置檔案内容均相同,而 controller.cfg 和 agent.cfg 需要根據機器 IP 和端口号做相應配置。注意下面隻列出部分重要配置。

  • cluster.nodes
  • cluster.cfg
diskIOConcurrencyLevel=0
node1.volumes=/ssd1/dolphindb/volumes/node1,/ssd2/dolphindb/volumes/node1 
node1.redoLogDir=/ssd1/dolphindb/redoLog/node1 
node1.chunkMetaDir=/ssd1/dolphindb/metaDir/chunkMeta/node1 
node1.TSDBRedoLogDir=/ssd1/dolphindb/tsdb/node1/redoLog
chunkCacheEngineMemSize=2
TSDBCacheEngineSize=2
...      
  • controller.cfg
localSite=175.178.100.3:8990:controller1
dfsMetaDir=/ssd1/dolphindb/metaDir/dfsMeta/controller1
dfsMetaDir=/ssd1/dolphindb/metaDir/dfsMeta/controller1
dataSync=1
...      
  • agent.cfg
localSite=175.178.100.3:8960:agent1
sites=175.178.100.3:8960:agent1:agent,175.178.100.3:8990:controller1:controller,119.91.229.229:8990:controller2:controller,175.178.100.213:8990:controller3:controller
...      

關于如何配置部分重要配置參數,見下表:

檔案 配置參數 說明
cluster.cfg node1.volumes=/ssd1/dolphindb/volumes/node1,/ssd2/dolphindb/volumes/node1 配置多個 SSD 硬碟達到并發讀寫,以提高讀寫性能。
cluster.cfg diskIOConcurrencyLevel=0 合理設定該參數,可以優化讀寫性能。建議配置如下:若 volumes 配置了 SSD 硬碟,建議設定 diskIOConcurrencyLevel = 0;若 volumes 全部配置為 HDD 硬碟,建議 diskIOConcurrencyLevel 設定為同 HDD 硬碟個數相同的值。
cluster.cfg

chunkCacheEngineMemSize=2

TSDBCacheEngineSize=2

DolphinDB 目前要求 cache engine 和 redo log 必須搭配使用。若在 cluster.cfg 配置了chunkCacheEngineMemSize 和 TSDBCacheEngineSize(即啟動 cache engine)則必須在 controller.cfg 裡配置 dataSync=1。
controller.cfg dataSync=1

2.4 部署流程

DolphinDB為各種部署方式提供了詳細的教程,在決定部署方式和配置後,根據教程部署即可,本文涉及的部署方式教程連結如下:

  • ​​單節點部署​​
  • ​​單節點部署(嵌入式ARM版本)​​
  • ​​單伺服器叢集部署​​
  • ​​多伺服器叢集部署​​
  • ​​高可用叢集部署教程​​
  • ​​如何擴充叢集節點和存儲​​
  • ​​DolphinDB Docker單機部署方案​​
  • ​​基于Docker-Compose的DolphinDB多容器叢集部署​​

更多教程可以前往​​官方教程倉庫​​檢視。

2.5 啟動流程

以啟動 2.3 節配置的高可用叢集為例,将 2.3 節的配置檔案相應放在 centos-1、centos-2、centos-3 機器的 DolphinDB 安裝目錄/clusterDemo/config 目錄下。

注意:啟動腳本使用了相對路徑,故需要到腳本所在目錄執行。

2.5.1 啟動控制節點

$ cd DolphinDB/clusterDemo/
$ ./startController.sh      

2.5.2 啟動代理節點

$ cd DolphinDB/clusterDemo/
$ ./startAgent.sh      

2.5.3 啟動資料節點

繼續閱讀