Ubuntu下beanstalkd无法绑定局域网IP地址以及消息队列beanstalkd上的error: JOB_TOO_BIG的解决
一、ubuntu下beanstalkd无法绑定局域网IP地址
今天因为业务需要,我把之前安装的beanstalkd所绑定的IP地址由127.0.0.1改成局域网IP地址,但是怪了,显示beanstalkd已经启动,查看端口监控也显示IP地址变了,但是使用telnet连接的却依然是连接不上,报错:Unable to connect to remote host: Connection refused。真是奇怪,难道是防火墙的问题?觉得不应该,但还也加上了这个端口的全部accept规则,但是依然不起作用。看来还是得从beanstalkd自身找问题。
过程是这样的:我安装beanstalkd使用的是apt-get方式,beanstalkd的配置文件路径存在于这个路径文件:/etc/default/beanstalkd,修改之后使用service beanstalkd restart进行重启也没有报什么错误。但是就是不起作用。
root@us78:/# cat /etc/default/beanstalkd
## Defaults for the beanstalkd init script, /etc/init.d/beanstalkd on
## Debian systems.
BEANSTALKD_LISTEN_ADDR=10.78.11.12
BEANSTALKD_LISTEN_PORT=11300
root@us78:/# service beanstalkd restart
root@us78:/# telnet 10.78.11.12 11300
Trying 10.78.11.12...
telnet: Unable to connect to remote host: Connection refused
后来了解到,这个问题是因为只要是从debian软件包安装的beantalkd,则它同时带有systemd .service和.socket。 当beantalkd由.socket启动时,无论您如何配置.service,它都会去绑定127.0.0.1。此时通过service beanstalkd status也能看到它会忽略我们配置的IP地址(如下日志),解决办法也很简单,就是移除这个路径/lib/systemd/system/beanstalkd.socket的.socket文件,然后重启systemctl daemon-reload and systemctl restart beanstalkd,即可解决,过程如下:
#service beanstalkd status忽略我们配置的IP地址
asdf beanstalkd[4323]: /usr/bin/beanstalkd: inherited listen fd; ignoring option: -l 10.78.11.12
asdf beanstalkd[4323]: /usr/bin/beanstalkd: inherited listen fd; ignoring option: -p 11300
#查看文件内容:/lib/systemd/system/beanstalkd.socket
root@us78:/etc/default# cat /lib/systemd/system/beanstalkd.socket
[Unit]
Description=Beanstalkd socket
Documentation=man:beanstalkd(1)
Before=sockets.target
[Socket]
ListenStream=127.0.0.1:11300
[Install]
WantedBy=sockets.target
#删除beanstalkd.socket文件并重启
root@us78:/etc/default# mv /lib/systemd/system/beanstalkd.socket /lib/systemd/system/beanstalkd.socket.bak
root@us78:/etc/default# systemctl daemon-reload
root@us78:/etc/default# systemctl restart beanstalkd.
二、消息队列beanstalkd上的error: JOB_TOO_BIG的解决
今天一个处理处理消息队列的程序出现了报错,其中往beanstalkd添加消息的时候出现:Put error: JOB_TOO_BIG in beanstalk-client/src/Client.php:283,出现此报错的原因是往beanstalkd添加的消息个数(待处理)超过了最大限制,限制是多少呢?我们可以使用beanstalkd -z选项的值,默认是(default is 65535)。通过telnet beanstalkd端口查看stats返回结果可以看到,因此这里需要将此配置进行修改。
我的系统是Ubuntu 16.04,beanstalkd是使用apt get install安装的,如果你是命令行启动的话直接加上-z选项即可,但不想改成命令行启动,网上看到用户在启动脚本中添加项成功,我尝试
#添加下面这行并修改DAEMON_OPTS这行,后重启
root@u33:$ vim /etc/init.d/beanstalkd
MAX_JOB_SIZE="-z 524280"
DAEMON_OPTS="-l $BEANSTALKD_LISTEN_ADDR -p $BEANSTALKD_LISTEN_PORT $BEANSTALKD_EXTRA -z 1000000"
root@u33:$ service beanstalkd restart
但telnet通过stats查看仍然没有变化,后看到有DEBIAN用户说在/etc/sysconfig/beanstalkd中添加MAX_JOB_SIZE=-z 524280 选项解决问题,不过我使用的ubuntu,找到/etc/default/beanstalkd配置文件,上篇文章: ubuntu下beanstalkd无法绑定局域网IP地址 刚解决过/etc/default/beanstalkd不生效的问题,在这里添加MAX_JOB_SIZE配置后成功了。
#添加以下行代码执行重启
$ vim /etc/default/beanstalkd
BEANSTALKD_LISTEN_ADDR=0.0.0.0
BEANSTALKD_LISTEN_PORT=11300
#添加以下配置
BEANSTALKD_EXTRA="-z 524280"
root@u33:/# telnet 11.98.127.92 11300
Trying 11.98.127.92...
Connected to 11.98.127.92.
stats
---
total-jobs: 0
max-job-size: 524280
在这里我发现了一个差异,解决这个问题有两种配置:一种是BEANSTALKD_EXTRA=-z 524280,一种是MAX_JOB_SIZE=-z 524280,看这名称有可能是这样,如果在启动脚本中解决应该使用BEANSTALKD_EXTRA,而在配置文件中解决就使用MAX_JOB_SIZE,我的启动起来了,我也没去尝试,其它朋友可以试试是不是这样。