linux corosync+pacemaker+drbd+mysql配置安装详解

一, 基本环境介绍及基本环境配置

节点1: node1.hulala.com      192.168.1.35     centos6.5_64    添加8G新硬盘
节点2: node1.hulala.com      192.168.1.36     centos6.5_64    添加8G新硬盘
vip   192.168.1.39

节点1与节点2均需配置

修改主机名:

vim /etc/sysconfig/network
HOSTNAME=node1.hulala.com

配置hosts解析:

vim /etc/hosts
192.168.1.35    node1.hulala.com node1
192.168.1.36    node2.hulala.com node1     
同步系统时间:
ntpdate cn.pool.ntp.org
关闭防火墙与SELINUX

service iptables stop
chkconfig iptables off
cat /etc/sysconfig/selinux
SELINUX=disabled

以上配置在两个节点都需要配置,配置完成之后重启两个节点

二:配置ssh互信

[root@node1~]#ssh-keygen -t rsa -b 1024
[root@node1~]#ssh-copy-id root@192.168.1.36
[root@node2~]#ssh-keygen -t rsa -b 1024
[root@node2~]#ssh-copy-id root@192.168.1.35

三:DRBD的安装与配置(node1和node2执行相同操作)

[root@node1~]#wget -c http://elrepo.org/linux/elrepo/el6/x86_64/RPMS/drbd84-utils-8.4.2-1.el6.elrepo.x86_64.rpm
[root@node1~]#wget -c http://elrepo.org/linux/elrepo/el6/x86_64/RPMS/kmod-drbd84-8.4.2-1.el6_3.elrepo.x86_64.rpm
[root@node1~]#rpm -ivh *.rpm

获取一个sha1值做为shared-secret

[root@node1~]#sha1sum /etc/drbd.conf
8a6c5f3c21b84c66049456d34b4c4980468bcfb3  /etc/drbd.conf

创建并编辑资源配置文件:/etc/drbd.d/dbcluster.res

代码如下:

[root@node1~]# vim /etc/drbd.d/dbcluster.res
resource dbcluster {
    protocol C;
    net {
        cram-hmac-alg sha1;
        shared-secret "8a6c5f3c21b84c66049456d34b4c4980468bcfb3";
        after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
        after-sb-2pri disconnect;
        rr-conflict disconnect;
    }
    device    /dev/drbd0;
    disk      /dev/sdb1;
meta-disk internal;
    on node1.hulala.com {
        address   192.168.1.35:7789;
    }
    on node2.hulala.com {
        address   192.168.1.36:7789;
    }
}

以上配置所用参数说明:

RESOURCE: 资源名称
PROTOCOL: 使用协议”C”表示”同步的”,即收到远程的写入确认之后,则认为写入完成.
NET: 两个节点的SHA1 key是一样的
after-sb-0pri : “Split Brain”发生时且没有数据变更,两节点之间正常连接
after-sb-1pri : 如果有数据变更,则放弃辅设备数据,并且从主设备同步
rr-conflict: 假如前面的设置不能应用,并且drbd系统有角色冲突的话,系统自动断开节点间连接
META-DISK: Meta data保存在同一个磁盘(sdb1)
ON <NODE>: 组成集群的节点
将DRBD配置拷贝到node机器:

[root@node1~]#scp /etc/drbd.d/dbcluster.res root@192.168.1.36:/etc/drbd.d/

创建资源及文件系统:

创建分区(未格式化过)
在node1和node2上创建LVM分区:
[root@node1~]#fdisk /dev/sdb
在node1和node2上给资源(dbcluster)创建meta data:
[root@node1~drbd]#drbdadm create-md dbcluster
激活资源(node1和node2都得查看)
– 首先确保drbd module已经加载
查看是否加载:
# lsmod | grep drbd
若未加载,则需加载:
# modprobe drbd
# lsmod | grep drbd
drbd                  317261  0
libcrc32c               1246  1 drbd
– 启动drbd后台进程:
[root@node1 drbd]# drbdadm up dbcluster
[root@node2 drbd]# drbdadm up dbcluster
查看(node1和node2)drbd状态:
[root@node2 drbd]# /etc/init.d/drbd status
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@Build64R6, 2012-09-06 08:16:10
m:res        cs         ro                   ds                         p  mounted  fstype
0:dbcluster  Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
从上面的信息可以看到,DRBD服务已经在两台机器上运行,但任何一台机器都不是主机器(“primary” host),因此无法访问到资源(block device).
开始同步:
仅在主节点操作(这里为node1)
[root@node1 drbd]# drbdadm — –overwrite-data-of-peer primary dbcluster
查看同步状态:
[root@node1 drbd.d]# cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by dag@Build64R6, 2012-09-06 08:16:10
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
 ns:8297248 nr:0 dw:0 dr:8297912 al:0 bm:507 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
上面的输出结果的一些说明:
cs (connection state): 网络连接状态
ro (roles): 节点的角色(本节点的角色首先显示)
ds (disk states):硬盘的状态
复制协议: A, B or C(本配置是C)
看到drbd状态为”cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate”即表示同步结束.
也可以这样查看drbd状态:
[root@centos193 drbd]# drbd-overview
  0:dbcluster/0  Connected Secondary/Primary UpToDate/UpToDate C r—–
创建文件系统:
在主节点(Node1)创建文件系统:
[root@node1 drbd]# mkfs -t ext4 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
…….
180 days, whichever comes first.  Use tune2fs -c or -i to override.
注:没必要在辅节点(Node2)做同样的操作,因为DRBD会处理原始磁盘数据的同步.
另外,我们也不需要将这个DRBD系统挂载到任何一台机器(当然安装MySQL的时候需要临时挂载来安装MySQL),因为集群管理软件会处理.还有要确保复制的文件系统仅仅挂载在Active的主服务器上.

三:mysql的安装

1,在node1和node2节点安装mysql:
yum install mysql* -y
2.node1和node2都操作停止mysql服务
[root@node1~]# service mysql stop
Shutting down MySQL.        [  OK  ]
3.node1和node2都操作创建数据库目录并将该目录权限属主修改为mysql
[root@host1 /]# mkdir -p /mysql/data
[root@host1 /]# chown -R mysql:mysql /mysql
4,关闭mysql临时挂载DRBD文件系统到主节点(Node1):
[root@node1 ~]# mount /dev/drbd0  /mysql/
5.node1和node2都操作修改my.cnf文件修改
在[mysqld]下添加新的数据存放路径
datadir=/mysql/data
7.将默认的数据路径下的所有文件和目录cp到新的目录下(node2不用操作)
[root@host1 mysql]#cd /var/lib/mysql
[root@host1 mysql]#cp -R * /mysql/data/
node1和node2都操作这里注意copy过去的目录权限属主需要修改为mysql,这里直接修改mysql目录即可.
[root@host1 mysql]# chown -R mysql:mysql /mysql
8.启动node1上的mysql进行登陆测试
[root@host1 mysql]# mysql
9.在节点Node1卸载DRBD文件系统
[root@node1 ~]# umount /var/lib/mysql_drbd
[root@node1 ~]# drbdadm secondary dbcluster
将DRBD文件系统挂载节点Node2
[root@node2 ~]# drbdadm primary dbcluster
[root@node2 ~]# mount /dev/drbd0 /mysql/
节点Node2上配置MySQL并测试
[root@node1 ~]# scp node2:/etc/my.cnf /etc/my.cnf
[root@node2 ~]# chown mysql /etc/my.cnf
[root@node2 ~]# chmod 644 /etc/my.cnf
10. node2上做mysql登陆测试
[root@node2 ~]# mysql
11.在Node2上卸载DRBD文件系统,交由集群管理软件Pacemaker来管理
[root@node2~]# umount /var/lib/mysql_drbd
[root@node2~]# drbdadm secondary dbcluster
[root@node2~]# drbd-overview
  0:dbcluster/0  Connected Secondary/Secondary UpToDate/UpToDate C r—–
[root@node2~]#

四:Corosync和Pacemaker的安装配置(node1和node2都需安装)

安装Pacemaker必须依赖:
[root@node1~]#yum -y install automake autoconf libtool-ltdl-devel pkgconfig python glib2-devel libxml2-devel libxslt-devel python-devel gcc-c++ bzip2-devel gnutls-devel pam-devel libqb-devel
安装Cluster Stack依赖:
[root@node1~]yum -y install clusterlib-devel corosynclib-devel
安装Pacemaker可选依赖:
[root@node1~]yum -y install ncurses-devel openssl-devel cluster-glue-libs-devel docbook-style-xsl

Pacemaker安装:

[root@node1~]yum -y install pacemaker

crmsh安装:

[root@node1~]wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo
[root@node1~]yum -y install crmsh

1,配置corosync
Corosync Key
– 生成节点间安全通信的key:
[root@node1~]# corosync-keygen
– 将authkey拷贝到node2节点(保持authkey的权限为400):
[root@node~]# scp /etc/corosync/authkey node2:/etc/corosync/
2,[root@node1~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
编辑/etc/corosync/corosync.conf:

代码如下:

# Please read the corosync.conf.5 manual page
compatibility: whitetank
aisexec {
        user: root
        group: root
}
totem {
        version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.1.0
mcastaddr: 226.94.1.1
mcastport: 4000
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}

– 创建并编辑/etc/corosync/service.d/pcmk,添加”pacemaker”服务
[root@node1~]# cat /etc/corosync/service.d/pcmk
service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 1
}
将上面两个配置文件拷贝到另一节点
[root@node1]# scp /etc/corosync/corosync.conf node2:/etc/corosync/corosync.conf
[root@node1]# scp /etc/corosync/service.d/pcmk node2:/etc/corosync/service.d/pcmk
3,启动corosync和Pacemaker
 分别在两个节点上启动corosync并检查.
[root@node1]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]
[root@node1~]# corosync-cfgtool -s
Printing ring status.
Local node ID -1123964736
RING ID 0
id = 192.168.1.189
status = ring 0 active with no faults
[root@node2]# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]
– 在两节点上分别启动Pacemaker:
[root@node1~]# /etc/init.d/pacemaker start
Starting Pacemaker Cluster Manager:                        [  OK  ]
[root@node2~]# /etc/init.d/pacemaker start
Starting Pacemaker Cluster Manager:

资源配置

配置资源及约束                 
配置默认属性
查看已存在的配置:
[root@node1 ~]# crm configure show
node node1.hulala.com
node node2.hulala.com
property $id="cib-bootstrap-options" dc-version="1.1.8-7.el6-394e906" cluster-infrastructure="classic openais (with plugin)" expected-quorum-votes="2"
禁止STONITH错误:
[root@node1 ~]# crm configure property stonith-enabled=false
[root@node1 ~]# crm_verify -L
让集群忽略Quorum:
[root@node1~]# crm configure property no-quorum-policy=ignore
防止资源在恢复之后移动:
[root@node1~]# crm configure rsc_defaults resource-stickiness=100
设置操作的默认超时:
[root@node1~]# crm configure property default-action-timeout="180s"
设置默认的启动失败是否为致命的:
[root@node1~]# crm configure property start-failure-is-fatal="false"
配置DRBD资源
– 配置之前先停止DRBD:
[root@node1~]# /etc/init.d/drbd stop
[root@node1~]# /etc/init.d/drbd stop
– 配置DRBD资源:
[root@node1~]# crm configure
crm(live)configure# primitive p_drbd_mysql ocf:linbit:drbd params drbd_resource="dbcluster" op monitor interval="15s" op start timeout="240s" op stop timeout="100s"
– 配置DRBD资源主从关系(定义只有一个Master节点):
crm(live)configure# ms ms_drbd_mysql p_drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
– 配置文件系统资源,定义挂载点(mount point):
crm(live)configure# primitive p_fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/var/lib/mysql_drbd/" fstype="ext4"
配置VIP资源
crm(live)configure# primitive p_ip_mysql ocf:heartbeat:IPaddr2 params ip="192.168.1.39" cidr_netmask="24" op monitor interval="30s"
配置MySQL资源
crm(live)configure# primitive p_mysql lsb:mysql op monitor interval="20s" timeout="30s" op start interval="0" timeout="180s" op stop interval="0" timeout="240s"
组资源和约束
通过”组”确保DRBD,MySQL和VIP是在同一个节点(Master)并且确定资源的启动/停止顺序.
启动: p_fs_mysql–>p_ip_mysql->p_mysql
停止: p_mysql–>p_ip_mysql–>p_fs_mysql
crm(live)configure# group g_mysql p_fs_mysql p_ip_mysql p_mysql
组group_mysql永远只在Master节点:
crm(live)configure# colocation c_mysql_on_drbd inf: g_mysql ms_drbd_mysql:Master
MySQL的启动永远是在DRBD Master之后:
crm(live)configure# order o_drbd_before_mysql inf: ms_drbd_mysql:promote g_mysql:start

配置检查和提交

crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# quit

查看集群状态和failover测试

状态查看:
[root@node1 mysql]# crm_mon -1r
Failover测试:
将Node1设置为Standby状态
[root@node1 ~]# crm node standby
过几分钟查看集群状态(若切换成功,则看到如下状态):
[root@node1 ~]# crm status
将Node1恢复online状态:
[root@node1 mysql]# crm node online
[root@node1 mysql]# crm status

(0)

相关推荐

  • linux shell进度条实现方法

    直接看代码吧,很简单 复制代码 代码如下: #!/bin/bash b=''i=0while [ $i -le  100 ]do    printf "progress:[%-50s]%d%%\r" $b $i    sleep 0.1    i=`expr 2 + $i`            b=#$bdoneecho

  • Linux下Makefile的automake生成全攻略

    文/余涛 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用"./configure","make","ma

  • Linux下简易进度条的实现代码

    在生活中,进度条是很常见的,那么,进度条是如何实现的呢? 首先,进度条的动态是利用人眼视觉暂留效果的.实际上是如下过程: 先输出:[=     ]表示进度是1%,刷新之后 再输出:[==    ]......由于刷新的很快,所以看起来像是等号不断向后增加,直到进度完成. 在写这个程序之前我们需要了解一下的知识: 1.缓冲区 缓冲区分为无缓冲.行缓冲.全缓冲. 无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr. 行缓冲:表示的是输入输出遇到换行才执行真正的I/O操

  • 详解linux下make命令的使用方法

    本文我们将用一些实例来讨论 make 命令背后的工作机制. Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标.这些目标通常存放在以 "Makefile" 来命名的特殊文件中,同时文件也包含与目标相对应的操作.更多信息,阅读关于 Makefiles 如何工作的系列文章. 当 make 命令第一次执行时,它扫描 Makefile 找到目标以及其依赖.如果这些依赖自身也是目标,继续为这些依赖扫描 Makefile 建立其依赖关系,然后编译它们.一旦主依

  • Linux/Unix环境下的make命令详解

    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难.而make工具则可自动完成编译工作,并且可以

  • 关于Linux下对于makefile的理解

    什么是makefile呢?在Linux下makefile我们可以把理解为工程的编译规则.一个工程中源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译,那些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可执行操作系统的命令. makefile带来的好处就是---"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开

  • Linux用make指令编译进度条程序

    本文实例为大家分享了Linux下写一个简单进度条的具体代码,供大家参考,具体内容如下 首先建立一个新的文件,touch progress_bar.c 执行该vim progress_bar.c命令,写进度条的程序.写进一个进度条程序: #include<stdio.h> #include<unistd.h> #include<string.h> void progress() { int i = 0; char bar[102]; memset(bar,0,102*si

  • Linux/Unix环境下的Make和Makefile详解

    Linux/Unix环境下的Make和Makefile详解 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简

  • Linux Makefile与Shell的问题

    大概只要知道Makefile的人,都知道Makefile可以调用Shell脚本.但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂.你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下.   示例一: 复制代码 代码如下: if [ "$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "b

  • 实例详解Linux下的Make命令

    前言 无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员 来说简直就是一场灾难.而make工具则可自动完成编译

随机推荐