corosync+pacemaker 双节点脑裂问题

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 BaseHTTPServer
import threading
import time
lock_timeout_seconds = 8
lock = threading.Lock()
lock_client_ip = ""
lock_time = 0
class 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
            return
if __name__ == ‘__main__‘:
    http_server = BaseHTTPServer.HTTPServer((‘127.0.0.1‘, ‘88888‘), LockService)
    http_server.serve_forever()

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

时间: 2024-11-05 20:49:03

corosync+pacemaker 双节点脑裂问题的相关文章

【翻译自mos文章】12c rac中,当脑裂发生时,哪个节点会幸存下来?

来源于: 12c: Which Node Will Survive when Split Brain Takes Place [1951726.1] 12c rac中,当脑裂发生时,哪个节点会幸存下来? 适用于: Oracle Database - Enterprise Edition - Version 12.1.0.2 and later Information in this document applies to any platform. 目的: 理解 从12.1.0.2开始,当脑裂发

【翻译自mos文章】在网络流量变大(比如rman duplicat 一个active database)之后,由于脑裂导致节点重启

在网络流量变大(比如rman duplicat 一个active database)之后,由于脑裂导致节点重启 来源于: The node reboots due to split brain during increased network traffic like rman duplicating an active database (文档 ID 985123.1) 适用于: Oracle Server - Enterprise Edition - Version: 11.1.0.7 to

corosync+pacemaker and drbd实现mysql高可用集群

DRBD:Distributed Replicated Block Device 分布式复制块设备,原理图如下 DRBD 有主双架构和双主架构的,当处于主从架构时,这个设备一定只有一个节点是可以读写的,另外的节点是不可读的,连挂载都不可能,只有一个节点是主的,其它节 点都是从的.当做为主主架构时,需要达到几个条件,1.在高可用集群中启用DRBD;  2. 启用分布式文件锁功能,即需要把磁盘格式化为集群文件系统(如GFS2,OCFS2等):3. 把DRBD做成资源. 数据的存储过程: 当某个进程存

corosync+pacemaker+crmsh+DRBD实现数据库服务器高可用集群构建

  DRBD (DistributedReplicated Block Device) 是 Linux 平台上的分散式储存系统.其中包含了核心模组,数个使用者空间管理程式及 shell scripts,通常用于高可用性(high availability, HA)丛集.DRBD 类似磁盘阵列的RAID 1(镜像),只不过 RAID 1 是在同一台电脑内,而 DRBD 是透过网络. DRBD 是以 GPL2 授权散布的自由软件. 实验架构图: 一.高可用集群构建的前提条件 1.主机名互相解析,实现

CoroSync+Pacemaker实现web高可用

一.简介 CoroSync最初只是用来演示OpenAIS集群框架接口规范的一个应用,可以说CoroSync是OpenAIS的一部分,但后面的发展明显超越了官方最初的设想,越来越多的厂商尝试使用CoroSync作为集群解决方案.如Redhat的RHCS集群套件就是基于CoroSync实现. CoroSync只提供了message layer,而没有直接提供CRM,一般使用Pacemaker进行资源管理. CoroSync和Pacemaker的配合使用有2种方式:①Pacemaker以插件形式使用

drbd+corosync+pacemaker构建高可用MySQL集群

一.drbd简介 drbd全称Distributed Replicated Block Device,为分布式复制块设备,基于软件实现的,不共享任何东西的,通过复制的方式构建镜像模式工作的磁盘,类似于raid1,但不同于raid的是,drbd实现了跨主机镜像块数据.drbd工作原理:由工作于内核层次的drbd,将要写入本地磁盘的数据镜像一份发往本地网卡,由本地网卡发往另一台drbd主机的本地磁盘存储.因此,drbd的两个主机的,磁盘存储一模一样,从而实现分布式复制块设备的实现.drbd进程对磁盘

corosync+pacemaker实验记录

OS: RHEL 6.5 64bitcorosync: 1.4.7 --yum方式安装pacemaker: 1.1.2 --作为corosync依赖包自动安装 pacemaker是heartbeat发展到3.0独立出来的产物,红帽6.0系列上,使用yum安装corosync,默认会安装pacemaker作为CRM. pacemaker常用配置工具:crmsh pcscrmsh需要独立安装rpm包 主要配置文件: /etc/corosync/corosync.conf /etc/crm/crm.c

高可用分布式存储(Corosync+Pacemaker+DRBD+MooseFS)

========================================================================================= 一.服务器分布及相关说明 ========================================================================================= 1.服务器信息 2.总体架构   3.网络参数 4.元数据节点上需要额外部署的服务 Corosync + Pace

使用corosync +pacemaker 搭建apache HA服务

系统版本:CentOS release 6.5 软件版本:pacemaker-1.1.12-4.el6.x86_64 corosync-1.4.7-1.el6.x86_64 httpd-2.2.15-39.el6.centos.x86_64 crmsh-2.1-1.6.x86_64 centos6.X 系统如果想要使用YUM直接安装需要添加epel源: rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-