下面一段文字是摘自doris官方文檔:
注:在生產環境中,所有實例都應使用守護進程啟動,以保證進程退出后,會被自動拉起,如 Supervisor。如需使用守護進程啟動,需要修改各個 start_xx.sh 腳本,去掉最后的 & 符號
首先安裝supervisor,具體請參照本人的另一篇博客CentOS7 安裝supervisor守護進程管理器
1 配置palo be 進程管理
1.1 修改各個 start_be.sh 腳本,去掉最后的 & 符號
/home/workspace/palo-0.8.2/be/bin/start_be.sh
:wq保存退出
1.2 創建be supervisor進程管理配置文件
輸入命令:
vim /etc/supervisord.d/palo_be-0.8.2.ini
填寫以下內容
[program:palo_be] process_name=%(program_name)s ;進程名稱 directory=/opt/palo-0.8.2/be ;工作目錄 command=sh /opt/palo-0.8.2/be/bin/start_be.sh ;運行的命令 autostart=true ;自動開啟 autorestart=true ;自動重啟 user=root ;用戶 numprocs=1 ;進程數 startretries=3 ;啟動重試次數 stopasgroup=true ;是否停止子進程 killasgroup=true ;是否殺死子進程 startsecs=5 ;啟動5秒后,如果還是運行狀態才認為進程已經啟動 //redirect_stderr = true //stdout_logfile_maxbytes = 20MB //stdout_logfile_backups = 10 //stdout_logfile=/var/log/supervisor-palo_be-0.8.2.log
2 配置broker進程管理
2.1 修改各個 start_broker.sh 腳本,去掉最后的 & 符號
vim /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh
:wq保存退出
2.2 創建broker supervisor進程管理配置文件
輸入命令
vim /etc/supervisord.d/palo_broker-0.8.2.ini
輸入以下內容
[program:BrokerBootstrap] environment = JAVA_HOME="/usr/java/jdk1.8.0_172-amd64" process_name=%(program_name)s ;進程名稱 directory=/opt/palo-0.8.2/apache_hdfs_broker ;工作目錄 command=sh /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh ;運行的命令 autostart=true ;自動開啟 autorestart=true ;自動重啟 user=root ;用戶 numprocs=1 ;進程數 startretries=3 ;啟動重試次數 stopasgroup=true ;是否停止子進程 killasgroup=true ;是否殺死子進程 startsecs=5 ;啟動5秒后,如果還是運行狀態才認為進程已經啟動 //redirect_stderr=true //stdout_logfile_maxbytes=20MB //stdout_logfile_backups=10 //stdout_logfile=/var/log/supervisor-BrokerBootstrap-0.8.2.log
3 配置fe進程管理
3.1 修改各個 start_fe.sh 腳本,去掉最后的 & 符號
vim /opt/palo-0.8.2fe/bin/start_fe.sh
:wq保存退出
3.2 創建fe supervisor進程管理配置文件
輸入命令
vim /etc/supervisord.d/palo_fe-0.8.2.ini
輸入內容如下:
[program:PaloFe] environment = JAVA_HOME="/usr/java/jdk1.8.0_172-amd64" process_name=PaloFe ;進程名稱 directory=/opt/palo-0.8.2/fe ;工作目錄 command=sh /opt/palo-0.8.2/fe/bin/start_fe.sh ;運行的命令 autostart=true ;自動開啟 autorestart=true ;自動重啟 user=root ;用戶 numprocs=1 ;進程數 startretries=3 ;啟動重試次數 stopasgroup=true ;是否停止子進程 killasgroup=true ;是否殺死子進程 ;startsecs=10 ;啟動5秒后,如果還是運行狀態才認為進程已經啟動 //redirect_stderr=true //stdout_logfile_maxbytes=20MB //stdout_logfile_backups=10 //stdout_logfile=/var/log/supervisor-PaloFe-0.8.2.log
4. 驗證
4.1 先確保沒有palo fe,be,broker進程在運行,如果有則使用kill -9 [processid]殺死掉
停止掉fe,broker
[root@palo252 palo-0.8.2]# jps 50258 DataNode 60387 Jps 59908 PaloFe 50109 NameNode 40318 BrokerBootstrap [root@palo252 palo-0.8.2]# kill -9 59908 [root@palo252 palo-0.8.2]# kill -9 40318
說明: BrokerBootstrap為broker的進程名稱,PaloFe為fe的進程名稱
停止掉be
[root@palo252 palo-0.8.2]# ps -e | grep palo 59362 ? 00:00:07 palo_be [root@palo252 palo-0.8.2]# kill -9 59362
4.2 啟動supervisor,驗證fe,be,broker是否啟動
啟動supervisor
supervisord -c /etc/supervisord.conf
查看狀態:
[root@palo252 palo-0.8.2]# supervisorctl status BrokerBootstrap RUNNING pid 64312, uptime 0:00:16 PaloFe RUNNING pid 64314, uptime 0:00:16 palo_be RUNNING pid 64313, uptime 0:00:16
驗證fe,be,broker進程是否啟動
[root@palo252 palo-0.8.2]# jps 50258 DataNode 63846 Jps 61548 BrokerBootstrap 50109 NameNode 60734 PaloFe [root@palo252 palo-0.8.2]# ps -e | grep palo 61118 ? 00:00:01 palo_be
我們發現進程確實已經啟動了。
4.3 通過supervisorctl stop后,進程是否停止
be:
[root@palo252 palo-0.8.2]# supervisorctl stop palo_be palo_be: stopped [root@palo252 palo-0.8.2]# ps -e | grep palo
be停止成功
fe:
[root@palo252 palo-0.8.2]# supervisorctl stop PaloFe PaloFe: stopped [root@palo252 palo-0.8.2]# jps 50258 DataNode 64411 BrokerBootstrap 50109 NameNode 65295 Jps
fe停止成功
broker:
[root@palo252 palo-0.8.2]# jps 50258 DataNode 64411 BrokerBootstrap 50109 NameNode 65295 Jps [root@palo252 palo-0.8.2]# supervisorctl stop BrokerBootstrap BrokerBootstrap: stopped [root@palo252 palo-0.8.2]# jps 65328 Jps 50258 DataNode 50109 NameNode
broker停止成功
4.4 通過supervisorctl start可以開啟進程
[root@palo252 palo-0.8.2]# jps 50258 DataNode 65400 Jps 50109 NameNode [root@palo252 palo-0.8.2]# ps -e | grep palo [root@palo252 palo-0.8.2]# supervisorctl start all palo_be: started PaloFe: started BrokerBootstrap: started [root@palo252 palo-0.8.2]# supervisorctl status BrokerBootstrap RUNNING pid 65421, uptime 0:00:21 PaloFe RUNNING pid 498, uptime 0:00:21 palo_be RUNNING pid 65422, uptime 0:00:21 [root@palo252 palo-0.8.2]# jps 50258 DataNode 65480 BrokerBootstrap 1212 Jps 50109 NameNode 1101 PaloFe [root@palo252 palo-0.8.2]# ps -e | grep palo 500 ? 00:00:00 palo_be
結果顯示啟動控制成功。
4.5 驗證在fe,be,broker崩潰后supervisor能夠自動重啟進程
輸入命令ps xuf 查看進程間的父子關系
ps xuf
root 64311 0.0 0.0 221680 12884 ? Ss 16:48 0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 65421 0.0 0.0 113124 1528 ? S 16:55 0:00 \_ sh /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh root 65480 0.2 0.1 24345924 44188 ? Sl 16:55 0:00 | \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx20480m -Dfile.encoding=UTF-8 com.baidu.palo.broker.hdfs.BrokerBootstrap root 65422 0.0 0.0 113128 1540 ? S 16:55 0:00 \_ sh /opt/palo-0.8.2/be/bin/start_be.sh root 500 0.5 0.3 1787780 91400 ? Sl 16:55 0:00 | \_ /opt/palo-0.8.2/be/lib/palo_be root 498 0.0 0.0 113120 1492 ? S 16:55 0:00 \_ sh /opt/palo-0.8.2/fe/bin/start_fe.sh root 1101 6.1 1.3 9002228 342412 ? Sl 16:55 0:10 \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx5120m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails
我們發現在該列表中 fe的pid為1101,be的pid為500,broker的pid為65480
執行下面命令殺死這三個進程
kill -9 1101 kill -9 500 kill -9 65480
再次輸入ps xuf 查看進程父子關系
ps xuf
root 64311 0.0 0.0 221680 12892 ? Ss 16:48 0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 1375 0.0 0.0 113124 1548 ? S 17:03 0:00 \_ sh /opt/palo-0.8.2/fe/bin/start_fe.sh root 1709 14.0 1.3 9004284 330748 ? Sl 17:03 0:09 | \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx5120m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+Us root 1791 0.0 0.0 113128 1540 ? S 17:03 0:00 \_ sh /opt/palo-0.8.2/be/bin/start_be.sh root 2054 0.7 0.3 1774784 92008 ? Sl 17:03 0:00 | \_ /opt/palo-0.8.2/be/lib/palo_be root 2265 0.0 0.0 113124 1528 ? S 17:03 0:00 \_ sh /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh root 2295 0.6 0.1 24345924 42224 ? Sl 17:03 0:00 \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx20480m -Dfile.encoding=UTF-8 com.baidu.palo.broker.hdfs.BrokerBootstrap
發現supervisor確實將進程重新啟動起來了。
說明一下:
通過supervisorctl status查詢出來的進程id其實不是fe,be,broker的進程id,而是啟動他們的shell進程id,start_xxx.sh里面會啟動真正的doris進程,所以才有了進程樹之說,所以我們在配置的時候需要配置
stopasgroup=true ;是否停止子進程
killasgroup=true ;是否殺死子進程
這兩個參數為true,否則通過supervisorctl控制doris的后台進程是無效的,這個是通過supervisor做doris守護進程的關鍵。
5. FAQ
5.1. 如果在使用過程中出現類似:Exited too quickly (process log may have details)的錯誤,則應該是由於找不到JAVA_HOME造成的,在ini文件中添加相應的環境變量即可。盡管系統中已經配置了JAVA_HOME環境變量,但是supervisor啟動時並不會加載/etc/profile 文件
以加載環境變量,supervisor 提供了一個配置參數enviroment。配置格式為:
environment = JAVA_HOME="jdk具體路徑"
如果有多個環境變量,中間以逗號分隔.如果應用程序依賴其他環境變量亦同理.
5.2 還有一個原因會導致出現Exited too quickly (process log may have details),就是sh腳本中的&沒有去掉,本人在使用supervisor管理hdfs的啟動的時候,就遇到了這個問題,默認start-dfs.sh,hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode,
時,就遇到&沒有去掉的問題。
5.3 使用supervisor管理后,doris數據丟失厲害,尤其是頻繁創建表的時候
通過下面命令查看supervisor進程的文件描述符數目
cat /proc/{supervisor_proc_id}/limits
結果如下:
[edw@palo101 ~]$ ps -e | grep supervisor 1034 ? 00:02:51 supervisord [edw@palo101 ~]$ cat /proc/1034/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size unlimited unlimited bytes Max resident set unlimited unlimited bytes Max processes 100000 100000 processes Max open files 1024 1024 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 256980 256980 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
發現supervisor的最大文件描述符數量為1024,doris的be操作很多都是文件操作,被supervisor管理的子進程會繼承父進程的文件描述數量限制,所以這個有可能會導致be數據丟失,設置crash。
解決辦法為修改supervisor的最大文件描述符數目
sudo vim /usr/lib/systemd/system/supervisord.service
在service下添加內容:
LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=100000
修改后的完整文件內容為:
[Unit] Description=Process Monitoring and Control Daemon After=rc-local.service nss-user-lookup.target [Service] LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=100000 Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf [Install] WantedBy=multi-user.target
if you wana to see the file descriptor number of your current process, you can use the command as follows:
ls -lR /proc/{process_id}/fd | grep "^l" | wc -l
show an example:
[lenmom@192.168.1.101 log]$ ps -ef | grep palo lenmom 6189 5966 13 15:32 ? 00:02:23 /opt/user/lenmom/doris-0.11.5/be/lib/palo_be lenmom 14976 31169 0 15:50 pts/0 00:00:00 grep --color=auto palo [lenmom@192.168.1.102 log]$ ls -lR /proc/6189/fd | grep "^l" | wc -l 531
使用supervisor配置palo守護進程的完畢,使用supervisor后,確實能夠提高應用的健壯性!