博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
corosync+pacemaker 双节点脑裂问题
阅读量:7079 次
发布时间:2019-06-28

本文共 3110 字,大约阅读时间需要 10 分钟。

hot3.png

0.引入

   corosync作为HA方案中成员管理层(membership layer),负责集群成员管理、通信方式(单播、广播、组播)等功能,pacemaker作为CRM层。在利用corosync+pacemaker 主备模式实践中,遇到一个问题,即脑裂问题。何谓脑裂: 在HA集群中,节点间通过心跳线进行网络通信,一旦心跳网络异常。导致成员互不相认,各自作为集群中的DC,这样资源同时会在主、备两节点启动。脑裂是corosync还是pacemaker导致的呢?一开始我认为是corosync,原因在于心跳端导致corosync不能正常通信。后来发现在pacemaker官网有找到脑裂(split-brain)的方案。pacemaker作为crm,主责是管理资源,还有一个作用是选择leader。

1.方案

  在[1](http://drbd.linbit.com/users-guide-emb/s-configure-split-brain-behavior.html)文中给出了一种解决方法。本文中讨论另一种方法,即为pacemaker配置抢占资源。原理在于,pacemaker 可以定义资源的执行顺序。如果将独占资源放在最前面,后面的资源的启动则依赖与它,成也独占资源,败也独占资源。当心跳网络故障时候,谁先抢占到该资源,该节点就接管服务资源,提供服务。这种方案必须解决两个问题,一是必须定义一个抢占资源,二是自定义pacemaker RA,去抢夺资源。

2. 定义抢占资源

   本文利用互斥锁来实现独占资源。具体由python实现一个简单的web服务,提供lock,unlock,updatelock服务。

__author__ = 'ZHANGTIANJIONG629'import BaseHTTPServerimport threadingimport timelock_timeout_seconds = 8lock = threading.Lock()lock_client_ip = ""lock_time = 0class LockService(BaseHTTPServer.BaseHTTPRequestHandler):    def do_GET(self):        '''define url route'''        pass    def lock(self, client_ip):        global lock_client_ip        global lock_time        # if lock is free        if lock.acquire():            lock_client_ip = client_ip            lock_time = time.time()            self.send_response(200, 'ok')            self.close_connection            return            # if current client hold lock,updte lock time        elif lock_client_ip == client_ip:            lock_time = time.time()            self.send_response(200, 'ok,update')            self.close_connection            return        else:            # lock timeout,grab lock            if time.time() - lock_time > lock_timeout_seconds:                lock_client_ip = client_ip;                lock_time = time.time()                self.send_response(200, 'ok,grab lock')                self.close_connection                return            else:                self.send_response(403, 'lock is hold by other')                self.close_connection    def update_lock(self, client_ip):        global lock_client_ip        global lock_time        if lock_client_ip == client_ip:            lock_time = time.time()            self.send_response(200, 'ok,update')            self.close_connection            return        else:            self.send_response(403, 'lock is hold by other')            self.close_connection            return    def unlock(self, client_ip):        global lock_client_ip        global lock_time        if lock.acquire():            lock.release()            self.send_response(200, 'ok,unlock')            self.close_connection            return        elif lock_client_ip == client_ip:            lock.release()            lock_time = 0            lock_client_ip = ''            self.send_response(200, 'ok,unlock')            self.close_connection            return        else:            self.send_response(403, 'lock is hold by other')            self.close_connection            returnif __name__ == '__main__':    http_server = BaseHTTPServer.HTTPServer(('127.0.0.1', '88888'), LockService)    http_server.serve_forever()

下一篇介绍自定义RA脚本。

转载于:https://my.oschina.net/hanhanztj/blog/515065

你可能感兴趣的文章
Apple Swift编程语言入门教程
查看>>
iOS 数据解析
查看>>
GPUImage学习一
查看>>
当生活变成了生存,知识也就背上了灰色的沉重。。。
查看>>
关于多线程变量共享问题_改进
查看>>
QSpinBox
查看>>
Activity和Window之间的关系
查看>>
微服务架构
查看>>
有关Ossim 4.8系统首次登陆设置密码失败问题的解决方法
查看>>
简单快速的上手使用gitbash
查看>>
neo4j开发
查看>>
系统规划笔记
查看>>
jtds用PreparedStatement查询大数据时慢的问题(轉)
查看>>
jsp中include指令静态导入和动态导入的区别详解
查看>>
Java构造和解析Json数据的两种方法详解一
查看>>
CopyOnWriteArrayList
查看>>
mysql数据库详解(续二)
查看>>
我的友情链接
查看>>
通过简单设置让CACTI支持中文显示
查看>>
WAF+SLB负载不均衡案例分享
查看>>