corosync+pacemaker+mysql+drbd 实现mysql的高可用

====================================

一、了解各组件是什么以及之间的关系

二、安装高可用集群的提前

三、安装corosync+pacemaker

四、编译安装mysql

五、安装drbd

六、mysql与drbd实现mysql数据的镜像

七、利用crmsh配置mysql的高可用

====================================

环境:

OS:Centos 6.x(redhat 6.x)

kernel:2.6.32-358.el6.x86_64

yum源:

1
2
3
4
5
6
7
8
9
10
11
[centos]
name=sohu-centos
baseurl=http: //mirrors .sohu.com /centos/ $releasever /os/ $basearch
gpgcheck=1
enable =0
gpgkey=http: //mirrors .sohu.com /centos/RPM-GPG-KEY-CentOS-6
[epel]
name=sohu-epel
baseurl=http: //mirrors .sohu.com /fedora-epel/ $releasever/$basearch/
enable =1
gpgcheck=0


拓扑图:

205713233.png

部分软件以附件的形式上传,mysql的源码包软件,网上很容易找


望各位博友带着下面的疑问去实现corosync+pacemaker+mysql+drbd mysql的高可用?

1、corosync是什么?pacemaker是什么?corosync与pacemaker的关系?

2、 mysql与drbd之间的连接关系?

3、 corosync、pacemaker、mysql、drbd之间的关系?

4、提到高可用集群,广大博友们就会想到,高可用集群中资源之间是如何建立关系?各个节点会不会抢占资源使其出现脑裂(split-brain)?

出现脑裂可以有fence设备自行解决


一、了解各组件是什么以及之间的关系

corosynccorosync的由来是源于一个Openais的项目,是Openais的一个子 项目,可以实现HA心跳信息传输的功能,是众多实现HA集群软件中之一,heartbeat与corosync是流行的Messaging Layer (集群信息层)工具。而corosync是一个新兴的软件,相比Heartbeat这款很老很成熟的软件,corosync与Heartbeat各有优势,博主就不在这里比较之间的优势了,corosync相对于Heartbeat只能说现在比较流行。

pacemaker:是众多集群资源管理器(Cluster Resource Manager)CRM中的一个,其主要功能是管理来着集群信息层发送来的信息。Pacemaker是集群的核心,它管理集群和集群信息. 集群信息更新通过Corosync通知到各个节点.

常见的CRM有:

heartbeat v1-->haresources

hearbeat v2--->crm

hearbeat v3---->pacemaker

RHCS(cman)----->rgmanager

如下图corosync与pacemaker之间的关系:

161511846.png


mysql:一个开源的关系型数据库

drbd:DRBD:(distributed replication block device)即分布式复制块设备。它的工作原理是:在A主机上有对指定磁盘设备写请求时,数据发送给A主机的kernel,然后通kernel中的一个模块,把相同的数据传送给B主机的kernel中一份,然后B主机再写入自己指定的磁盘设备,从而实现两主机数据的同步,也就实现了写操作高可用。类似于raid1一样,实现数据的镜像,DRBD一般是一主一从,并且所有的读写操作,挂载只能在主节点服务器上进行,,但是主从DRBD服务器之间是可以进行调换的。

各个组件之间的关系:其实mysql与drbd根本没有半毛钱的关系,而drbd与mysql相结合就有很重要的作用了,因为drbd实现数据的镜像,当drbd的主节点挂了之后,drbd的辅助节点还可以提供服务,但是主节点不会主动的切换到辅助的节点上面去,于是乎,高可用集群就派上用场了,因为资源定义为高可用的资源,主节点出现故障之后,高可用集群可以自动的切换到辅助节点上去,实现故障转移继续提供服务。

二、安装高可用集群的提前准备

1)、hosts文件

1
2
3
4
5
6
7
8
9
10
11
12
      #把主机名改成jie2.com
[root@jie2 ~] # sed -i s/`grep HOSTNAME /etc/sysconfig/network |awk -F '=' '{print $2}'`/jie2.com/g /etc/sysconfig/network
      #把主机名改成jie3.com
[root@jie3 ~] # sed -i s/`grep HOSTNAME /etc/sysconfig/network |awk -F '=' '{print $2}'`/jie3.com/g /etc/sysconfig/network
[root@jie2 ~] # cat >>/etc/hosts << EOF
>172.16.22.2 jie2.com  jie2
>172.16.22.3 jie3.com  jie3
>EOF
[root@jie3 ~] # cat >>/etc/hosts << EOF
>172.16.22.2 jie2.com  jie2
>172.16.22.3 jie3.com  jie3
>EOF

2)、ssh互信

1
2
3
4
[root@jie2 ~] # ssh-keygen -t rsa -P ''
[root@jie2 ~] # ssh-copy-id -i .ssh/id_rsa.pub jie3
[root@jie3 ~] # ssh-keygen -t rsa -P ''
[root@jie3 ~] # ssh-copy-id -i .ssh/id_rsa.pub jie2

3)、关闭NetworkManger

1
2
3
4
5
6
[root@jie2 ~] # chkconfig --del NetworkManager
[root@jie2 ~] # chkconfig NetworkManager off
[root@jie2 ~] # service NetworkManager stop
[root@jie3 ~] # chkconfig --del NetworkManager
[root@jie3 ~] # chkconfig NetworkManager off
[root@jie3 ~] # service NetworkManager stop


4)、时间同步(博主用的是自己的ntp时间服务器)

1
2
[root@jie2 ~] #ntpdate 172.16.0.1
[root@jie3 ~] #ntpdate 172.16.0.1


三、安装corosync+pacemaker

1)、安装corosync+pacemaker

1
2
3
4
5
6
     #节点jie2.com的操作
[root@jie2 ~] # yum -y install corosync pacemaker
[root@jie2 ~] # yum -y --nogpgcheck install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm   #提供crmsh命令接口的软件
     #节点jie3.com的操作
[root@jie3 ~] # yum -y install corosync pacemaker
[root@jie3 ~] # yum -y --nogpgcheck install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm

2)、修改配置文件和生成认证文件

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
       #节点jie2.com的操作
[root@jie2 ~] # cd /etc/corosync/
[root@jie2 corosync] # mv corosync.conf.example corosync.conf
[root@jie2 corosync] # vim corosync.conf
# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {                            #心跳信息传递层
     version: 2                     #版本
     secauth: on                    #认证信息  一般on
     threads: 0                     #线程
     interface {                    #定义心跳信息传递的接口
         ringnumber: 0
         bindnetaddr: 172.16.0.0    #绑定的网络地址,写网络地址
         mcastaddr: 226.94.1.1      #多播地址
         mcastport: 5405            #多播的端口
         ttl: 1                     #生存周期
     }
}
logging {                          #日志
     fileline: off
     to_stderr: no                  #是否输出在屏幕上
     to_logfile:  yes                #定义自己的日志
     to_syslog: no                  #是否由syslog记录日志
     logfile:  /var/log/cluster/corosync .log   #日志文件的存放路径
     debug: off
     timestamp: on                  #时间戳是否关闭
     logger_subsys {
         subsys: AMF
         debug: off
     }
}
amf {
     mode: disabled
}
service {
      ver: 0
      name: pacemaker    #pacemaker作为corosync的插件进行工作
}
aisexec {
      user: root
      group: root
}
[root@jie2 corosync] #  scp corosync.conf jie3:/etc/corosync/
##把节点jie2.com的配置文件copy到jie3.com中

认证文件

1
2
3
4
5
6
7
8
      #节点jie2.com的操作
[root@jie2 corosync] # corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits  for  key from  /dev/random .
Press keys on your keyboard to generate entropy (bits = 152).
      #遇到这个情况,表示电脑的随机数不够,各位朋友可以不停的随便敲键盘,或者安装软件也可以生成随机数
[root@jie2 corosync] # scp authkey jie3:/etc/corosync/
      #把认证文件也复制到jie3.com主机上

3)、开启服务和查看集群中的节点信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
          #节点jie2.com的操作
[root@jie2 ~] # service corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]
[root@jie2 ~] # crm status
Last updated: Thu Aug  8 14:43:13 2013
Last change: Sun Sep  1 16:41:18 2013 via crm_attribute on jie3.com
Stack: classic openais (with plugin)
Current DC: jie3.com - partition with quorum
Version: 1.1.8-7.el6-394e906
2 Nodes configured, 2 expected votes
Online: [ jie2.com jie3.com ]
          #节点jie3.com的操作
[root@jie3 ~] # service corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]
[root@jie3 ~] # crm status
Last updated: Thu Aug  8 14:43:13 2013
Last change: Sun Sep  1 16:41:18 2013 via crm_attribute on jie3.com
Stack: classic openais (with plugin)
Current DC: jie3.com - partition with quorum
Version: 1.1.8-7.el6-394e906
2 Nodes configured, 2 expected votes
Online: [ jie2.com jie3.com ]


四、编译安装mysql(两个节点的操作过程都是一样)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      #节点jie2.com的操作
#1)、解压编译安装
[root@jie2 ~] # tar xf mysql-5.5.33.tar.gz
[root@jie2 ~] # yum -y groupinstall "Development tools" "Server Platform Development"
[root@jie2 ~] # cd mysql-5.5.33
[root@jie2 mysql-5.5.33] # yum -y install cmake
[root@jie2 mysql-5.5.33] # cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR= /mydata/data   -DSYSCONFDIR= /etc  \
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system \
-DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR= /tmp/mysql .sock \
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
[root@jie2 mysql-5.5.33] # make && make install
#2)、建立配置文件和脚本文件
[root@jie2 mysql-5.5.33] # cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf
[root@jie2 mysql-5.5.33] # cp /usr/local/mysql/support-files/mysql.server  /etc/rc.d/init.d/mysqld
[root@jie2 mysql-5.5.33] # cd /usr/local/mysql/
[root@jie2 mysql] # useradd -r -u 306 mysql
[root@jie2 mysql] # chown -R root:mysql ./*
#3)、关联系统识别的路径
[root@jie2 mysql] #echo "PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysqld.sh
[root@jie2 mysql] #source /etc/profile.d/mysqld.sh
[root@jie2 mysql] #echo "/usr/local/mysql/lib" >/etc/ld.so.conf.d/mysqld.conf
[root@jie2 mysql] #ldconfig -v | grep mysql
[root@jie2 mysql] #ln -sv /usr/local/mysql/include/ /usr/local/mysqld


先别初始化数据库,安装drbd把drbd挂载到目录下,然后初始化数据库把数据库的数据存放到drbd挂载的目录。

五、安装drbd

安装rpm包的drbd软件必须保证找相同内核版本的drbd-kmdl软件

1)、先划分一个分区,此分区做成drbd镜像(RHEL 6.x的重新格式化一个新的分区之后要重启系统)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        #节点jie2.com的操作
[root@jie2 ~] # fdisk /dev/sda
Command (m  for  help): n
Command action
    e   extended
    p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (7859-15665, default 7859):
Using default value 7859
Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +5G
Command (m  for  help): w
          #节点jie3.com的操作
[root@jie3 ~] # fdisk /dev/sda
Command (m  for  help): n
Command action
    e   extended
    p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (7859-15665, default 7859):
Using default value 7859
Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +5G
Command (m  for  help): w


2)、安装drbd和修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#1)、安装drbd
      #节点jie2.com的操作
[root@jie2 ~] # rpm -ivh drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm
warning: drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm: Header V4 DSA /SHA1  Signature, key ID 66534c2b: NOKEY
Preparing...                 ################################# [100%]
[root@jie2 ~] # rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm
warning: drbd-8.4.3-33.el6.x86_64.rpm: Header V4 DSA /SHA1  Signature, key ID 66534c2b: NOKEY
Preparing...                 ################################## [100%]
      #节点jie3.com的操作
[root@jie3 ~] # rpm -ivh drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm
warning: drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm: Header V4 DSA /SHA1  Signature, key ID 66534c2b: NOKEY
Preparing...                 ################################# [100%]
[root@jie3 ~] # rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm
warning: drbd-8.4.3-33.el6.x86_64.rpm: Header V4 DSA /SHA1  Signature, key ID 66534c2b: NOKEY
Preparing...                 ################################## [100%]
#2)、修改drbd的配置文件
       #节点jie2.com的操作
[root@jie2 ~] # cd /etc/drbd.d/
[root@jie2 drbd.d] # cat global_common.conf  #全局配置文件
global {
         usage-count no;
         # minor-count dialog-refresh disable-ip-verification
}
common {
         protocol C;
         handlers {
                 pri-on-incon-degr  "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f" ;
                 pri-lost-after-sb  "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f" ;
                 local -io-error  "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f" ;
                 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                 # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                 # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                 # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                 # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
         }
         startup {
                 #wfc-timeout 120;
                 #degr-wfc-timeout 120;
         }
         disk {
                 on-io-error detach;
                 #fencing resource-only;
         }
         net {
                 cram-hmac-alg  "sha1" ;
                 shared-secret  "mydrbdlab" ;
         }
         syncer {
                 rate 1000M;
         }
}
[root@jie2 drbd.d] # cat mydata.res #资源配置文件
resource mydata {
   on jie2.com {
     device     /dev/drbd0 ;
     disk       /dev/sda3 ;
     address   172.16.22.2:7789;
     meta-disk internal;
   }
   on jie3.com {
     device     /dev/drbd0 ;
     disk       /dev/sda3 ;
     address   172.16.22.3:7789;
     meta-disk internal;
   }
}
     #把配置文件copy到节点jie3.com上面
[root@jie2 drbd.d] # scp global_common.conf mydata.res jie3:/etc/drbd.d/


3)、初始化drbd的资源并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
      #节点jie2.com的操作
#创建drbd的资源
[root@jie2 ~] # drbdadm create-md mydata
Writing meta data...
initializing activity log
NOT initializing bitmap
lk_bdev_save( /var/lib/drbd/drbd-minor-0 .lkbd) failed: No such  file  or directory
New drbd meta data block successfully created.   #提示已经创建成功
lk_bdev_save( /var/lib/drbd/drbd-minor-0 .lkbd) failed: No such  file  or directory
#启动服务
[root@jie2 ~] # service drbd start