公司网站用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脚本
<?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报错:
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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有