我已经在 Centos 环境中配置了 Gearman,客户端和工作器都在同一台机器上运行。运行良好。
我正在尝试将 gearman 与 memcached 持久存储结合使用。我已经编译并安装了带有 libmemcached 的 gearman。因此,我只需启动我的 memcached 服务,然后运行
gearmand
PARAMS="-q
libmemcached
--libmemcached-servers=127.0.0.1:11211"
我现在启动没有任何工人的新工作,我可以在Gearman 用户界面
我现在尝试通过 telnet 进入 memcached 检查作业,但找不到任何东西。然后我停止了 memcached 服务,然后运行
gearmand
PARAMS="-q
libmemcached
--libmemcached-servers=127.0.0.1:11211"
它仍然运行良好,日志中没有任何错误。我仍然可以运行客户端和工作程序。我不明白 gearman 是否使用了 memcached。
我们有很多视频编码工作要做。我的最终目标是在 AWS 上安装 memcached,然后将我的队列存储在那里。这是个好主意吗?我的方法正确吗?
编辑
根据答案中的建议,我将前台作业更改为后台作业,并尝试使用 mysql 作为 gearman 队列。我做了以下事情:
我已经使用 libmysql 构建了 gearman。
* CPP Flags: -fvisibility=hidden
* LIBS:
* LDFLAGS Flags:
* Assertions enabled: no
* Debug enabled: no
* Warnings as failure: no
* Building with libsqlite3 no
* Building with libdrizzle yes
* Building with libmemcached yes
* Building with libpq no
* Building with tokyocabinet no
* Building with libmysql yes
在我的 gearmand.conf 文件中,我添加了以下内容,参考其他文档:
PARAMS="--queue-type=mysql \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-user=root \
--mysql-db=deliver \
--mysql-table=gearman"
我可以用 root 连接到本地 mysql,并且有一个名为“deliver”的数据库。当我运行 gearmand 服务器并添加新的作业和工作者时,我没有看到创建表“gearman”。
这些进程似乎运行良好。我尝试了详细模式的日志记录并检查了 gearmand.log 文件,但没有与 mysql 相关的内容。我应该查看哪里?
答案1
关于 gearman 中的持久队列,有几点需要注意。首先,持久队列仅用于后台作业。这意味着如果作业有一个附加的客户端(即它被阻塞),则根本不会使用持久队列(因此,如果你直接在典型的 hello-world/reverse-string 示例上进行测试,你将不会在队列中看到任何内容)。
来自gearman 手册(如上所述)。
持久队列是仅适用于后台作业因为前台作业有一个附加的客户端。如果作业服务器消失,客户端可以检测到这一点并在其他地方重新启动前台作业(或向原始调用者报告错误)。另一方面,后台作业没有附加的客户端,只是在提交时运行。
其次,gearman 本身就保留一个内存队列,但是会根据需要使用回调来从持久队列中转发/删除作业(以防作业服务器出现故障),因此有可能在您可以从 memcached 服务器获取任何内容之前该作业就已经完成了?
您可以通过运行测试作业sleep(100)
或类似程序来更具体地测试这一点,并且您可能能够在作业仍在运行时通过这种方式检查 memcached。
还请注意,在某些发行版(例如 Debian)上,使用 libmemcached que-type 的 gearmand 存在一些已知错误(至少据我所知),其中存在一些竞争条件。您可能想尝试运行 gearmand 来--verbose DEBUG
解决这些问题。