下面一段文字是摘自doris官方文档:
注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉起,如 Supervisor。如需使用守护进程启动,需要修改各个 start_xx.sh 脚本,去掉最后的 & 符号

首先安装supervisor,具体请参照本人的另一篇博客CentOS7 安装supervisor守护进程管理器

1 配置palo be 进程管理

1.1 修改各个 start_be.sh 脚本,去掉最后的 & 符号

/home/workspace/palo-0.8./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./be ;工作目录
command=sh /opt/palo-0.8./be/bin/start_be.sh ;运行的命令
autostart=true ;自动开启
autorestart=true ;自动重启
user=root ;用户
numprocs= ;进程数
startretries= ;启动重试次数
stopasgroup=true ;是否停止子进程
killasgroup=true ;是否杀死子进程
startsecs= ;启动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./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./apache_hdfs_broker ;工作目录
command=sh /opt/palo-0.8./apache_hdfs_broker/bin/start_broker.sh ;运行的命令
autostart=true ;自动开启
autorestart=true ;自动重启
user=root ;用户
numprocs= ;进程数
startretries= ;启动重试次数
stopasgroup=true ;是否停止子进程
killasgroup=true ;是否杀死子进程
startsecs= ;启动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./fe ;工作目录
command=sh /opt/palo-0.8./fe/bin/start_fe.sh ;运行的命令
autostart=true ;自动开启
autorestart=true ;自动重启
user=root ;用户
numprocs= ;进程数
startretries= ;启动重试次数
stopasgroup=true ;是否停止子进程
killasgroup=true ;是否杀死子进程
;startsecs= ;启动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.]# jps
DataNode
Jps
PaloFe
NameNode
BrokerBootstrap
[root@palo252 palo-0.8.]# kill -
[root@palo252 palo-0.8.]# kill -

说明: BrokerBootstrap为broker的进程名称,PaloFe为fe的进程名称

停止掉be

[root@palo252 palo-0.8.]# ps -e | grep palo
? :: palo_be
[root@palo252 palo-0.8.]# kill -

4.2 启动supervisor,验证fe,be,broker是否启动

启动supervisor

supervisord -c /etc/supervisord.conf 

查看状态:

[root@palo252 palo-0.8.]# supervisorctl status
BrokerBootstrap RUNNING pid , uptime ::
PaloFe RUNNING pid , uptime ::
palo_be RUNNING pid , uptime ::

验证fe,be,broker进程是否启动

[root@palo252 palo-0.8.]# jps
DataNode
Jps
BrokerBootstrap
NameNode
PaloFe
[root@palo252 palo-0.8.]# ps -e | grep palo
? :: palo_be

我们发现进程确实已经启动了

4.3 通过supervisorctl stop后,进程是否停止

be:

[root@palo252 palo-0.8.]# supervisorctl stop palo_be
palo_be: stopped
[root@palo252 palo-0.8.]# ps -e | grep palo

be停止成功

fe:

[root@palo252 palo-0.8.]# supervisorctl stop PaloFe
PaloFe: stopped
[root@palo252 palo-0.8.]# jps
DataNode
BrokerBootstrap
NameNode
Jps

fe停止成功

broker:

[root@palo252 palo-0.8.]# jps
DataNode
BrokerBootstrap
NameNode
Jps
[root@palo252 palo-0.8.]# supervisorctl stop BrokerBootstrap
BrokerBootstrap: stopped
[root@palo252 palo-0.8.]# jps
Jps
DataNode
NameNode

broker停止成功

4.4 通过supervisorctl start可以开启进程

[root@palo252 palo-0.8.]# jps
DataNode
Jps
NameNode
[root@palo252 palo-0.8.]# ps -e | grep palo
[root@palo252 palo-0.8.]# supervisorctl start all
palo_be: started
PaloFe: started
BrokerBootstrap: started
[root@palo252 palo-0.8.]# supervisorctl status
BrokerBootstrap RUNNING pid , uptime ::
PaloFe RUNNING pid , uptime ::
palo_be RUNNING pid , uptime ::
[root@palo252 palo-0.8.]# jps
DataNode
BrokerBootstrap
Jps
NameNode
PaloFe
[root@palo252 palo-0.8.]# ps -e | grep palo
? :: palo_be

结果显示启动控制成功。

4.5 验证在fe,be,broker崩溃后supervisor能够自动重启进程

输入命令ps xuf 查看进程间的父子关系

ps xuf
root       0.0  0.0   ?        Ss   :   : /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 0.0 0.0 ? S : : \_ sh /opt/palo-0.8./apache_hdfs_broker/bin/start_broker.sh
root 0.2 0.1 ? Sl : : | \_ /usr/java/jdk1..0_172-amd64/bin/java -Xmx20480m -Dfile.encoding=UTF- com.baidu.palo.broker.hdfs.BrokerBootstrap
root 0.0 0.0 ? S : : \_ sh /opt/palo-0.8./be/bin/start_be.sh
root 0.5 0.3 ? Sl : : | \_ /opt/palo-0.8./be/lib/palo_be
root 0.0 0.0 ? S : : \_ sh /opt/palo-0.8./fe/bin/start_fe.sh
root 6.1 1.3 ? Sl : : \_ /usr/java/jdk1..0_172-amd64/bin/java -Xmx5120m -XX:+UseMembar -XX:SurvivorRatio= -XX:MaxTenuringThreshold= -XX:+PrintGCDateStamps -XX:+PrintGCDetails

我们发现在该列表中 fe的pid为1101,be的pid为500,broker的pid为65480

执行下面命令杀死这三个进程

kill -
kill -
kill -

再次输入ps xuf 查看进程父子关系

ps xuf
root       0.0  0.0   ?        Ss   :   : /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 0.0 0.0 ? S : : \_ sh /opt/palo-0.8./fe/bin/start_fe.sh
root 14.0 1.3 ? Sl : : | \_ /usr/java/jdk1..0_172-amd64/bin/java -Xmx5120m -XX:+UseMembar -XX:SurvivorRatio= -XX:MaxTenuringThreshold= -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+Us
root 0.0 0.0 ? S : : \_ sh /opt/palo-0.8./be/bin/start_be.sh
root 0.7 0.3 ? Sl : : | \_ /opt/palo-0.8./be/lib/palo_be
root 0.0 0.0 ? S : : \_ sh /opt/palo-0.8./apache_hdfs_broker/bin/start_broker.sh
root 0.6 0.1 ? Sl : : \_ /usr/java/jdk1..0_172-amd64/bin/java -Xmx20480m -Dfile.encoding=UTF- 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
? :: supervisord
[edw@palo101 ~]$ cat /proc//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 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes processes
Max open files 1024 files
Max locked memory bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals signals
Max msgqueue size bytes
Max nice priority
Max realtime priority
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=
LimitNPROC=

修改后的完整文件内容为:

[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target [Service]
LimitCORE=infinity
LimitNOFILE=
LimitNPROC= 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 : ? :: /opt/user/lenmom/doris-0.11./be/lib/palo_be
lenmom : pts/ :: grep --color=auto palo
[lenmom@192.168.1.102 log]$ ls -lR /proc//fd | grep "^l" | wc -l

使用supervisor配置palo守护进程的完毕,使用supervisor后,确实能够提高应用的健壮性!

Apache Doris通过supervisor进行进程管理的更多相关文章

  1. supervisor - Python进程管理工具(转)

    add by zhj: 下面是在ubuntu上的一些使用经验 1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. s ...

  2. supervisor - Python进程管理工具

    经常会碰到要写一些守护进程,简单做法放入后台: shell> nohup python xxx.py & 偶尔这么做还可以接受,如果一堆这样的呢? 当然还有一个问题,就是各种服务,对应的 ...

  3. Ubuntu 安装和使用 Supervisor(进程管理)

    服务器版本 Ubuntu 16.04 LTS. Supervisor 是一个用 Python 写的进程管理工具,可以很方便的对进程进行启动.停止.重启等操作. 安装命令: $ apt-get inst ...

  4. CentOS7 安装supervisor守护进程管理器

    supervisor没有发布在标准的CentOS源在,需要安装epel源.这种方式安装的可能不是最新版本,但比较方便,安装完成之后,配置文件会自动帮你生成. 默认配置文件:/etc/superviso ...

  5. supervisor:进程管理工具

    一,安装(任何一种方式) apt-get install supervisor easy_install supervisor pip install supervisor 二,配置 配置superv ...

  6. 使用supervisor 进行进程管理时调整最大文件打开数

    [supervisord]logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.loglogfile_maxbytes=50MB ; 日志文 ...

  7. Linux进程管理工具——supervisor

    介绍 Supervisord是用Python实现的一款非常实用的进程管理工具 安装 这里用源码 supervisor-.tar.gz .tar.gz cd supervisor- sudo pytho ...

  8. supervisor python开发的进程管理工具

    Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...

  9. SUPERVISOR进程管理器配置指南

    SUPERVISOR进程管理器配置指南1. supervisor简介1.1. 官网http://supervisord.org/ 1.2. 介绍Supervisor是一个进程控制系统. 它是一个C/S ...

随机推荐

  1. grafana查询中的变量templating

    有时我们在管理成百上千台机器的时候,配置grafana无疑是明智的,因为你不需要一个一个的把每个机器的图形都配置一遍,利用templating就可以瞬间实现n台机器的状态显示了. templating ...

  2. 升级 macOS Mojave 后部分软件 (如 VS Code) 字体变虚的解决方法

    目前有些朋友的设备可能还是“非 Retina” 显示器,那这样如果升级到 Mojave 后你会发现文字不清晰了,这是因为 Mojave 默认关闭了文字次像素渲染字体,你需要在终端里执行: defaul ...

  3. Java中多线程

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  4. STM32中TIMx的映射及其通道

    TIMx,通道x,无映射,部分映射,完全映射    TIM1_CH1, PA8,    PE9,    TIM1_CH2, PA9,    PE11    TIM1_CH3, PA10,    PE1 ...

  5. liunx的磁盘管理的基本命令

    df     查看磁盘占用率 du -sh    查看磁盘多大 sudo fdisk -l   查看硬盘信息 sudo mkfs -t ext3 /dev/sdb1    建立文件系统(相当于格式化) ...

  6. 网络流--最大流dinic模板

    标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...

  7. 理解git

    为了真正了解git,我们从底部.底层开始,了解git核心,知其然并知其所以然. 为什么要进行版本控制呢? 因为编写文件不可能一次到位,文件总是有不同的状态需要保存下来,方便以后出错回滚. git 是目 ...

  8. cocos2dx学习资料

    [9秒原创]cocos2d-x——CCScrollView用法 http://www.9miao.com/thread-45619-1-1.html [9秒原创]cocos2d-x——场景切换效果示例 ...

  9. php 备份和恢复数据库

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. ThinkPHP 5 insertall 只插入最后一条数据的问题

    问题来源: Steed 2018/1/5 11:30:25 @流年 我用fetchsql查看的sql,发现数据都是最后一条 Steed 2018/1/5 11:30:39 我也不知道是什么问题,我打印 ...