PS:对于队列持久化的问题,是一个值得考虑的问题。持久化必然影响高性能。gearman支持后台工作任务的持久化,支持drizzle、mysql、memcached的持久化。对于client提交的background job,Job server除了将其放在内存队列中进行派发之外,还会将其持久化到外部的持久化队列中。一旦Job server发生问题重启,外部持久化队列中的background job将会被恢复到内存中,参与Job server新的派发当中。这保证了已提交未执行的background job不会由于Job server发生异常而丢失。并且我测试发现如果开启了持久化,那么后台工作任务会先将工作任务写到持久化介质,然后在入内存队列,再执行。非后台工作任务,由于client与job server是保持长连接的状态,如果工作任务执行异常,client可以灵活处理,所以无须持久化。
持久化队列:
0.6版本中新添的一项功能,允许将队列存放在drizzle或mysql中。
0.7版本允许将队列存放在memcached。
0.9版本可以将队列存放在sqlite3或postgresql。
在gearman job服务器内部,所有的job队列都是存放在内存中的,这就意味着一旦服务器重启或崩溃,未执行的job将会丢失而不会被worker服务器执行。持久化队列将后台作业存放在一个外部持久的队列中。持久化队列只对后台jobs有效,因为前台jobs依附于客户端。如果job服务器挡掉了,客户端会检测到,将会从其他地方重新启动这个前台job或者返回错误。而后台jobs没有依附于客户端,如果要想让它运行则需要提交。
Gearman队列的mysql持久化存储
支持mysql持久化
Tip:mysql安装指引
#gearmand源码编译增加 --with-mysql 参数并指向正确的lib路径 wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz; tar -zxvf gearmand-1.1.12.tar.gz; cd gearmand-1.1.12; ./configure --prefix=/usr/local/gearmand --with-mysql=/usr/local/mysql/bin/mysql_config; make && make install;
#./configure编译后的提示如下: --------- * Building with libsqlite3 yes #持久化存储-sqlite * Building with libdrizzle yes #持久化存储-libdrizzle * Building with libmemcached not found #持久化存储-libmemcached * Building with libpq no #持久化存储-libpq * Building with tokyocabinet no #持久化存储-tokyocabinet * Building with libmysql yes #持久化存储-libmysql
mysql数据库创建
create database gearman; use gearman; create table `gearman_queue` ( `unique_key` varchar(64) NOT NULL, `function_name` varchar(255) NOT NULL, `priority` int(11) NOT NULL, `data` LONGBLOB NOT NULL, `when_to_run` INT, PRIMARY KEY (`unique_key`) )
gearmand启动mysql
/usr/local/gearmand/sbin/gearmand --queue-type=MySQL \ --mysql-host=localhost \ --mysql-port=3306 \ --mysql-user=admin \ --mysql-password=admin \ --mysql-db=gearman \ --mysql-table=gearman_queue; #--queue-type mysql 队列类型:mysql #-w 2 当接收到任务时如果所有进程休眠,只唤醒2工作线程 #libdrizzle启动mysql gearmand -q libdrizzle --libdrizzle-host=127.0.0.1 --libdrizzle-user=gearman --libdrizzle-password=password --libdrizzle-db=gearman --libdrizzle-table=gearman_queue --libdrizzle-mysql
支持memcached准持久化
Tip:Memcached安装指引
#gearmand源码编译增加 --with-memcached wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz; tar -zxvf gearmand-1.1.12.tar.gz; cd gearmand-1.1.12; ./configure --prefix=/usr/local/gearmand --with-memcached=/usr/local/memcached/bin/memcached; make && make install;
/usr/local/gearmand/sbin/gearmand -d --queue-type=libmemcached --libmemcached-servers=127.0.0.1:11211