• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 基于zookeeper的主备切换方法

基于zookeeper的主备切换方法

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了zookeeper,zookeeper原理,zookeeper安装,dubbo zookeeper,zookeeper下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

基于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<X*>(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的日志级别。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 基于zookeeper的主备切换方法

相关文章

  • 2017-05-26HTPC+NAS+ROUTER(wifi)的实现
  • 2017-05-26安卓生成二维码 ==。以及中文乱码问题,安卓生成中文乱码
  • 2017-05-26LinearLayout嵌套,linearlayout
  • 2017-05-26手动配置 Android SDK,配置androidsdk
  • 2017-05-26开启新的activity获取它的返回值,activity获取返回值
  • 2017-05-26组件RecyclerView的应用(一),组件recyclerview
  • 2017-05-26Android动画原理总结
  • 2017-05-26【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件讲解(13)
  • 2017-05-26活动的生命周期系列(一)返回栈,生命周期系列
  • 2017-05-26Nginx反向代理导致大文件下载失败

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)
    • Android学习笔记-TextView(文本框)(一),android-textview
    • getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir(),mediacachefiles
    • OpenDigg安卓开源项目月报201704,opendigg安卓201704
    • ListView 添加 HeaderView常见错误,listviewheaderview
    • Android 环境搭建 以及 第一个android 程序的编写,搭建android
    • 小明学习Linux运维实战演练
    • [Android]Activity的生命周期
    • 实现图片拖动,图片拖动
    • androidStudio通过svn进行版本控制,androidstudiosvn

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有