zoukankan      html  css  js  c++  java
  • Apache Doris通过supervisor进行进程管理

    下面一段文字是摘自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后,确实能够提高应用的健壮性!

  • 相关阅读:
    2019-1-17水晶报表函数大全
    2019-1-17【水晶报表内功心法】--推拉之间
    2019-1-17水晶报表技巧总结【二】
    2019-1-16 水晶报表自动补空行
    2019-1-16水晶报表技巧总结【一】
    博客园添加访客人数
    2019-1-11存储过程的查看
    2019-1-11数据库重构
    lcx端口转发 linux版
    PentesterLab-From SQL Injection to Shell: PostgreSQL edition
  • 原文地址:https://www.cnblogs.com/lenmom/p/9973401.html
Copyright © 2011-2022 走看看