55

你是不是也有多进程管理的困惑呢?

 5 years ago
source link: https://mp.weixin.qq.com/s/7dDUcp-_Kmh-PHpjDNdCmA?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1、问题引出——多进程应用场景

场景一:

将关系型、非关系型数据的数据同步到ES中。

但是数据库中的表有多个,

一种方案是:一个配置文件中 if else 的方式配置多个表;

另外一种方案是:多个配置文件,多个进程并行执行。

如下图所示:

vui6baV.jpg!web

场景二:

kafka多个通道的数据借助kafka_connector 或者logstash_input_kafka同步到ES中,

如下图所示:

2IJ3IzI.jpg!web

这时候,根据通道的处理分成如下1,2两部分:

1、kafka stream对实时数据流的数据清洗、转换操作,有几个通道就至少有几个进程;

2、kafka_connector对处理后的数据实时同步,有几个通道至少有几个进程;

3、为了提高同步的时效性,通用的方案是增加kafka的topic的分片数,这时对应的进程数有会增多。

2、多进程困惑

困惑1 :需要大量重复操作。

个位数内的进程数还能接受,二十个甚至更多个进程的重复操作会很繁琐。

比如,针对N个进程的操作:

1)更新jar包,多个进程需要拷贝N次;如果各业务进程jar包名称不一致,需要改名N次。

2)重启业务,多个进程需要挨个重启N次。

困惑2 :多进程管理很不直观、很繁琐。

困惑3 :不能第一时间获取某个进程的宕掉信息。

困惑4 :进程宕掉后,不能自动重启。

困惑5

:不能定义进程的优先级。

3、常用的解决方案?

定制开发,脚本实现。

开发要点:

1)进程文件名称尽量有规律。

2)进程名尽量统一、有规律,便于计数排错。

统计进程数计数举例:

ps -ef | grep 进程名 | grep -v 'color' |wc -l

3)定时任务crontab + sendmail预警。

通过脚本对进程进行监控,如果进程数变化,则通过邮件预警。

4)脚本循环检测+定时重启。

即便如此,仍然不够高效。

有没有

可视化、批量操作、自动重启、自动邮件预警

的管理工具呢?

4、有没有更高效的方案呢?

实践证明有的。

后台进程管理工具Supervisor + superlance(Supervisor 的增强插件工具集)。

5、多进程管理工具Supervisor

Supervisor是一个Python编写的客户端/服务器工具,允许用户在类UNIX操作系统上控制大量进程。

用途:

- 进程监控

- 进程守护

- 进程管理

官网地址:http://supervisord.org/

6、Superlance增强插件工具集

Superlance是一套用于监视和控制在Supervisor下运行的进程的插件工具集。

  • 1)httpok——此插件旨在用作主管事件侦听器,通过HTTP GET请求到达配置的URL,如果请求失败或超时,httpok将重新启动“挂起”子进程。

  • 2)crashmail——此插件旨在用作监督者事件侦听器,订阅PROCESS_STATE_EXITED事件。当进程意外进入EXITED退出状态时,它向用户发送电子邮件。这点,解决了我得困惑!

  • 3)memmon——此插件旨在用作主管事件侦听器,它监视配置的子进程的内存使用情况,并在超过配置的最大大小时重新启动它们。

  • 4)crashmailbatch——与crashmail类似,当进程意外死亡时,crashmailbatch会发送电子邮件警报。区别在于,在配置的时间间隔内生成的所有警报都会一起批处理以避免发送太多电子邮件。

  • 5)fatalmailbatch——当进程无法启动太多次时,这个插件会发送电子邮件警报,使supervisord放弃重试。在配置的时间间隔内生成的所有致命的开始事件都会一起批处理以避免发送太多的电子邮件。

  • 6)crashsms——除了通过电子邮件网关发送SMS警报外,它与crashmailbatch类似。消息格式化为适合SMS(短信)。

官网地址:http://superlance.readthedocs.io/en/latest/

7、sendEmail 命令行工具

sendEmail是一个轻量级,命令行的SMTP邮件客户端。

SendEmail是用Perl编写的,它的独特之处在于它不需要任何模块。

它具有直观灵活的一组命令行选项,使其易于学习和使用。

官网地址:http://caspian.dotconf.net/menu/Software/SendEmail/

8、Supervisor等工具集部署流程

3ymMVne.png!web

步骤1:安装supervisior

启动方法:

[root@localhost xx]# supervisord -c /etc/supervisord.conf

步骤2:安装superlance

我们主要使用superlance的监控+发送邮件的功能。

步骤3:安装SendMail

核心:借助SendMail发送邮件。

基于步骤1——步骤3的核心配置如下:

 1
2[program:exec_test]

3command=java -jar /home/test/banlance_test.jar
4directory= /home/test
5numprocs=1 ;
6autorestart=true
7autostart=true
8redirect_stderr=true ;
9stdout_logfile=/var/log/supervisor/app_test_stdout.log
10stderr_logfile=/var/log/supervisor/app_test_stderr.log
11loglevel=info
12
13
14[eventlistener:crashmail-exited]

15command=crashmail -p exec_test -s "sendEmail -f [email protected] -t [email protected] -s smtp.163.com
16-u '进程预警' -o message-content-type=html -o message-charset=utf8 -xu [email protected]
17-xp mima -m '业务流进程 异常退出!'"
-m [email protected]
18events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR
19redirect_stderr=false

注意:[eventlistener:crashmail-exited]下的 -p 后面跟的就是[program:exec_test]配置的进程名称。

这样就能实现对exec_test的进程监控。

SendMail核心参数解读:

-f [email protected] 发件人邮箱

-s smtp.163.com 发件人邮箱的smtp服务器

-u "我是邮件主题" 邮件的标题

-o message-content-type=html 邮件内容的格式,html表示它是html格式

-o message-charset=utf8 邮件内容编码

-xu [email protected] 发件人邮箱的用户名

-xp 123456 发件人邮箱密码

-m "我是邮件内容" 邮件的具体内容

至此,以前复杂多进程的管理,改成一个配置文件就能搞定。

如果新增文件,只需要在supervisord新增对应的进程监控+邮件预警配置即可。

9、supervisior 可视化效果

ZbyaIvY.jpg!web 这里写图片描述

截图中只有一个进程,多个进程会多行排列展示。

10、小结

文章中没有给出一步步的部署步骤,这些步骤资料网上都能查到。

主要给出解决问题的思路和官网链接。

你有没有更好的多进程解决方案,欢迎留言讨论。

参考:

http://www.alphadevx.com/a/455-Installing-Supervisor-and-Superlance-on-CentOS

http://www.ttlsa.com/linux/use-sendemail/

https://blog.csdn.net/baidu_zhongce/article/details/49151385

u6rqEzE.png!web 加入知识星球,更短时间更快习得更多干货!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK