Gearman的问题分析与深入研究

简介: @import url(http://www.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);Gearman作为一个优秀的分布式解决方案,已经被众多的公司或者团队所采用,我在之前的一篇文章中也有过介绍。
Gearman作为一个优秀的分布式解决方案,已经被众多的公司或者团队所采用,我在之前的 一篇文章中也有过介绍。但是目前对于woker的执行状态和结果监控,特别是放入后台的worker的监控,官方还没有完善的解决方法。最近,为团队内部做了一次分享,我也得以深入的研究了 Gearmand。

Gearman的主要作用:
1、Dispatch 任务调度(无负载调度)
2、Interface 多应用语言间接口
3、Parallel 并行计算

Gearmand的安装

Gearmand 的安装有多种方式,在 Ubuntu 和 Debian 的系统中已经提供了 在线安装的方法。编译安装的过程也比较简单:

tar xzf gearmand-X.Y.tar.gz
cd gearmand-X.Y
./configure
make
make install
安装需要系统提供了 libevent,如果没有编译就会报错。编译安装完成后的提示如下:

 

 


其中 libsqlite3、lbdrizzle、libmemcached、libpq、tokyocabinet的支持都是对于持久化来说的,如果需要要确保系统中安装了这些数据库。

安装完成后,gearmand 提供了以下这些配置参数

 



性能的问题:

gearmand 中使用到了多线程模型,其线程分为三种:

     Listening and management thread 监听和管理线程 - 只有一个:主要负责接受连接请求,并分配给I/O线程
     I/O Thread I/O 线程 - 可以有很多个:主要负责读写系统调用,解析数据包
     Processing Thread 处理线程  - 只有一个:负责管理列表和Hash表,管理唯一Key、任务的Handle、函数、任务队列

刚才在  gearmand 的参数中看到,-t 可以指定I/O线程的数量。如果 没有指定 t 或者 t = 0,则三个线程合为一个,所有的事情都在一个线程中处理。如果 -t 1 则有一个监听和管理线程、一个I/O和处理线程;如果 -t 2 则每个类别一个线程,如果大于2,则创建更多的I/O线程。

官方提到,a 16 core Intel machine is able to process upwards of 50k jobs per second。

使用中应当关注的几个问题

1、Job Server 的单点问题。

实际上 Job Server 是存在单点问题的,我们只能通过增加冗余 Job Server 的方式来解决这个问题。就如官方的图例所示,下图:




我们可以通过配置域名、多个服务器配置列表等方法,在遇到其中一个 Job Server 失败时,将 Client 的请求转向另外的 Job Server。这种情况下,Job Server 中原来存在的任务会发生丢失,除非使用了数据库或其他类似的持久化方法。

2、Job Server 重启后,Worker会自动重新注册。

通过 gearmand -vvvvvvv  分析发现,如果 gearmand 关闭并重新启动后,原来的 worker 会马上与 Job Server 建立连接,并询问是否有任务。


3、使用持久队列避免任务的丢失

因为 Gearmand 的队列是放在内存中的,所以宕机或重启事件会导致队列的丢失。为了避免这种情况,可以使用持久队列,将队列存储在一个相对中立的位置。注意,持久队列只对于后台任务有效。

4、Gearman Worker 的无缝重启

我在实现Worker的过程中,采用了PHP脚本,脚本调用外部的配置文件。如果外部的配置文件修改后,需要重新启动脚本才能够使配置文件中修改的变量生效,所以想要坐到无缝的重启。即脚本Stop、Start的过程不会影响正在进行的业务。

对于无缝重启的问题,我总结了如下几个思路进行处理,解决的方法:

1、每次修改完代码后,Worker需要手工重启(先杀死然后启动)。
2、在Worker中设置,单次任务循环完成后,就对Worker进行重启。
3、在Worker中添加一个退出函数,如果需要Worker退出的时候,在Client端发送一个优先级比较高的退出调用。
4、在Worker中检查文件是否发生变化,如果发生了变化,退出并重启自身。
5、为Worker编写信号控制,接受重启指令,类似于 http restart graceful 指令

另外,也可以使用 supervisord 。这个工具暂时还没有了解,有兴趣的朋友可以分享一下。

下面是我在部门内部分享时制作的PPT


参考资料:
2、 Gearman

相关文章
|
机器学习/深度学习 存储 人工智能
云计算平台选择之路:AWS、Azure和Google Cloud的比较与抉择
在当今数字化时代,云计算平台扮演着企业转型和创新的关键角色。本文将对三大主流云计算平台——AWS、Azure和Google Cloud进行比较分析,为读者提供选择指南。我们将从性能、可靠性、生态系统、服务和定价等方面综合评估,以帮助读者做出最适合他们业务需求的决策。
1123 0
|
弹性计算 数据可视化 Ubuntu
云服务器使用docker安装portainer容器可视化管理工具
Portainer 将管理容器的复杂性隐藏在易于使用的 UI 后面,使部署应用程序和解决问题变得如此简单,通过使用界面化来完成容器的部署操作。
1547 1
云服务器使用docker安装portainer容器可视化管理工具
|
6月前
|
容器
Axure设计之下拉多选框制作教程A(中继器)
本文详细讲解了如何使用Axure制作动态交互的下拉多选器组件,以实现高保真原型设计。组件功能包括:下拉选项滚动显示、选中状态高亮、鼠标悬停效果、箭头图标切换、已选项删除等。通过选择框、中继器和动态面板的结合,完成从创建到交互设置的全流程。适合Web设计师和产品经理提升原型交互性,确保需求清晰传达。文内附案例预览图、在线演示链接及组件下载地址,方便学习与复用。
433 8
|
存储 传感器 物联网
|
Python
python语法错误变量未定义
【7月更文挑战第9天】
536 1
|
数据可视化
rpm 的降级安装命令是什么?
【6月更文挑战第13天】rpm 的降级安装命令是什么?
658 2
|
NoSQL PHP Redis
PHP使用Redis的Hash(哈希表)命令
本篇笔记简单介绍了Redis的Hash(哈希表)命令:hDel,hExists,hGet,hGetAll,hIncrBy,hIncrByFloat,hKeys,hLen,hMGet,hMSet,hSet,HSetnx,hVals作用和php的使用
3357 0
|
消息中间件 JSON 数据格式
使用RabbitMQ控制台查看和发送消息
使用RabbitMQ控制台查看和发送消息
2833 0
|
负载均衡 Java API
分布式任务调度框架:XXL-JOB(入门篇)
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“**调度中心**”负责发起调度请求。将任务抽象成分散的JobHandler,交由“执行器”统一管理,“**执行器**”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
1556 0
分布式任务调度框架:XXL-JOB(入门篇)