前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php使用zookeeper扩展,当zookeeper有节点挂掉时PHP会报错

php使用zookeeper扩展,当zookeeper有节点挂掉时PHP会报错

原创
作者头像
conanma
发布2021-12-05 23:09:20
3690
发布2021-12-05 23:09:20
举报
文章被收录于专栏:正则正则

公司网站用zookeeper 管理配置文件,php 用 zookeeper扩展 从ZK 获取配置文件,平时使用没问题。本周的时候监控脚本报警,有部分网页提示500错误,查看日志显示zk连接失败,telnet 各个zk节点,发现2个zk 节点当机,让OP启动zk节点,网站恢复正常。

先解决了线上的报错,开始查找问题,在开发机装了zookeeper,启动3个zk节点,建立了一个伪集群,停掉其中一个节点,刷新页面偶尔报500错误,现在可以确定zk有节点挂掉 ,网站就会出问题。可是如果zk 节点挂掉,扩展应该自动去尝试另外一个节点,为什么脚本不会自动重新连接呢

第一个想法是php的zk 扩展版本太低,有BUG, 原来zk扩展用的是 0.5.0 , 看了下 pecl https://pecl.php.net/package/zookeeper 发现有新的稳定版 0.6.4 一路 phpize, configure ,make ,顺利安装 ,重启php-fpm 刷新网页,问题依旧,-_-!.

升级大法不好用,开始各种的查资料,看php官方的方法....

新建一个最小zookeeper连接php脚本

代码语言:javascript
复制
<?php
Zookeeper::setDebugLevel(Zookeeper::LOG_LEVEL_DEBUG);  //开启zookeeper扩展日志
$server = '10.60.0.185:2184,10.60.0.185:2182,10.60.0.185:2183';
$zk = new Zookeeper($server);
echo $zk->get('/aaa/bbb/v1.0/ccc/db.cluster.host.write');

执行代码

发现随机到死的节点 zk报错:

代码语言:javascript
复制
ZOO_ERROR@handle_socket_error_msg@1699: Socket [10.60.0.185:2184] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
php 报错
PHP Fatal error:  Uncaught ZookeeperConnectionException: connection loss in /root/test1.php:15
Stack trace:
#0 /root/test1.php(15): Zookeeper->get('/xdfapp/okay-we...')
#1 {main}
  thrown in /root/test1.php on line 15

修改代码,中间加usleep(1000);
<?php
Zookeeper::setDebugLevel(Zookeeper::LOG_LEVEL_DEBUG);  //开启zookeeper扩展日志
$server = '10.60.0.185:2184,10.60.0.185:2182,10.60.0.185:2183';
$zk = new Zookeeper($server);
usleep(1000);  //脚本暂停1毫秒
echo $zk->get('/aaa/bbb/v1.0/ccc/db.cluster.host.write');

重新执行代码 可以自动重连了 2019-07-02 07:55:38,916:23909(0x7f087dc72700):ZOO_ERROR@handle_socket_error_msg@1699: Socket [10.60.0.185:2184] zk retcode=-4, errno=111(Connection refused): server refused to accept the client

2019-07-02 07:55:38,916:23909(0x7f0885eaf7c0):ZOO_DEBUG@zoo_awexists@2841: Sending request xid=0x5d1b0dfb for path [/xdfapp/okay-web/v1.0/unchange/db.cluster.host.write] to 10.60.0.185:2183

2019-07-02 07:55:38,917:23909(0x7f087dc72700):ZOO_INFO@check_events@1705: initiated connection to server [10.60.0.185:2183]

2019-07-02 07:55:38,940:23909(0x7f087dc72700):ZOO_INFO@check_events@1752: session establishment complete on server [10.60.0.185:2183], sessionId=0x3009bdc75ee0174, negotiated timeout=4000 猜测连接重试是一个异步的过程,如果不加sleep zk 还没来得急重连,就已经开始获取数据,报连接丢失,有空的时候再研究下zk扩展代码。。。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档