基于zookeeper的主备切换方法_PHP教程

php中文网
发布: 2016-07-12 08:55:43
原创
1349人浏览过

百度虚拟主播
百度虚拟主播

百度智能云平台的一站式、灵活化的虚拟主播直播解决方案

百度虚拟主播 36
查看详情 百度虚拟主播

基于zookeeper的主备切换方法

zookeeper的zoo_ephemeral节点(如果zoo_ephemeral满足不了需求,可以考虑和zoo_sequence结合使用),在会话关闭或过期时,会自动删除,利用这一特性可以实现两个或多节点间的主备切换。


实现方法:
1)在进程启动时调用zookeeper_init()初始化:
bool x::init_zookeeper()
{
// 第一次调用时_clientid总是为null,
// 状态为zoo_expired_session_state时,需要重新调用zookeeper_init,
// 这个时候可传入的_clientid为前一次zookeeper_init()产生的_clientid


// 请注意zookeeper_init()是一个异步调用,返回非null并不表示会话建立成功,
// 只有当zk_watcher中的type为zoo_session_event和state为zoo_connected_state时,
// 才真正表示会话建立成功。
_zhandle = zookeeper_init(zk_hosts, zk_watcher, 5000, _clientid, this, 0);
if (null == _zhandle)
{
mylog_error("init zookeeper failed: %s\n", zerror(errno));
return false;
}


mylog_info("init zookeeper(%s) successfully\n", zk_hosts);
return true;
}


2)进入工作之前,先尝试切换成主,只有成功切换成主后才进入work
bool x::run()
{
while (true)
{
int num_items = 0;
// 备机最简单的方法是每隔一定时间,如1秒就尝试转成master,
// 如果不使用轮询,则可以采用监视_zk_path的方式
mooon::sys::cutils::millisleep(1000);


// 如果不是master,则尝试转成master,如果转成不成功则继续下一次尝试
if (!is_master() && !change_to_master())
continue;


do_work();
}
}


bool x::is_master() const
{
return _is_master;
}


bool x::change_to_master()
{
static uint64_t log_counter = 0; // 打log计数器,备状态时的日志输出


// zoo_ephemeral|zoo_sequence
// _myip为本地ip地址,可以通过它来判断当前谁是master
// _zk_path值示例:/master/test,注意需要先保证/master已存在
int errcode = zoo_create(_zhandle, _zk_path.c_str(), _myip.c_str(), _myip.size()+1, &zoo_open_acl_unsafe, zoo_ephemeral, null, 0);


// (-4)connection loss,比如为zookeeper_init()指定了无效的hosts(一个有效的host也没有)
if (errcode != zok)
{
_is_master = false;


// 减少为备状态时的日志输出
if (0 == log_counter++ % 600)
{
mylog_debug("become master[%s] failed: (%d)%s\n", _zk_path.c_str(), errcode, zerror(errcode));
}


return false;
}
else
{
_is_master = true;
log_counter = 0;
mylog_info("becase master[%s]\n", _zk_path.c_str());


// sleep一下,以便让原master正在进行的完成
mooon::sys::cutils::millisleep(2000);
return true;
}
}


3)当zookeeper会话成功建立或过期时均会触发zk_watcher,可通过type和state来区分
void zk_watcher(zhandle_t *zh, int type, int state, const char *path, void *context)
{
x* x = static_cast(context);
mylog_debug("zh=%p, type=%d, state=%d, context=%p, path=%s\n", zh, type, state, context, path);


// zookeeper_init成功时type为zoo_session_event,state为zoo_connected_state
if ((zoo_session_event == type) && (zoo_connected_state == state))
{
x->on_zookeeper_connected(path);
}
else if ((zoo_session_event == type) && (zoo_expired_session_state == state))
{
// 需要重新调用zookeeper_init(),简单点可以退出当前进程重启
x->on_zookeeper_expired();
}
}


附: zookeeper日志
默认情况下zookeeper日志是输出到stderr,但可以通过zoo_set_log_stream()来定向到自己的日志输出中,还可以使用zoo_set_debug_level()来控制zookeeper的日志级别。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1115820.htmlTechArticle基于zookeeper的主备切换方法 zookeeper的ZOO_EPHEMERAL节点(如果ZOO_EPHEMERAL满足不了需求,可以考虑和ZOO_SEQUENCE结合使用),在会话关闭或过期时...
相关标签:
keep
keep

Keep是一款健身安排,无论是想减肥塑形或增肌,还是寻找健身跑步瑜伽计步等训练计划,你可以随时随地选择课程进行训练!权威教练视频教学,健身干货自由分享!有需要的小伙伴快来保存下载体验吧!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号