设为首页 收藏本站
查看: 229|回复: 0

[经验分享] 基于Corosync + Pacemaker+DRBD实现MySQL高可用集群

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-6-12 08:16:54 | 显示全部楼层 |阅读模式

前言

在众多的高可用集群解决方案中,除了Heartbeat之外,Corosync也能提供类似于Heartbeat一样的功能,而且目前RedHat官方提供的高可用集群解决方案的程序包都以Corosync为主,所以在未来的日子Corosync会逐渐取代Heartbeat。本文带来的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解决方案。

相关介绍

Corosync

Corosync是从OpenAIS中分支出来的一个项目,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。Corosync识别节点是通过authkey来实现的,不同于heartbeat v1 v2,Corosync的authkey是通过corosync-keygen命令生成的,具有更高的安全性。

Corosync目前有两个主流的版本:v1和v2,两个版本差别较大,v1没有有投票功能,需要借助cman实现,v2支持投票功能。

Pacemaker

Pacemaker是从heartbeat v3版本中分裂出来专门用于管理高可用集群的组件,功能十分强大。它利用集群基础构件(OpenAIS 或heartbeat)提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复,以实现群集服务(亦称资源)的最大可用性。

DRBD


DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。可以把它看作是一种网络RAID。

DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机,另一个主机再将数据存到自己的磁盘中。

下面是DRBD的系统结构图

wKioL1V36A3QKrZ4AAF1PGQOynA481.jpg

高可用解决方案

实验拓扑

wKioL1V5pjrh9bYgAAC-G2KpHdE000.jpg

实验环境

node1:172.16.10.123 MariaDB DRBD CentOS6.6

node2:172.16.10.124 MariaDB DRBD CentOS6.6

VIP:192.168.1.121

配置过程


配置HA的前提:

时间同步、基于主机名互相通信、SSH互信

请确保两个节点时间同步,可用ntpdate向时间服务器同步

1
[iyunv@node1 ~]# ntpdate cn.pool.ntp.org



基于主机名互相通信

1
2
3
4
5
6
7
8
9
10
11
12
[iyunv@node1 ~]# vim /etc/hosts
  
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
  
[iyunv@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
  
[iyunv@node1 ~]# uname -n
node1.scholar.com
  
#两个节点都需如上操作



SSH互信

1
2
3
4
5
6
7
[iyunv@node1 ~]# ssh-keygen -t rsa -P ''
[iyunv@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[iyunv@node2 ~]# ssh-keygen -t rsa -P ''
[iyunv@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[iyunv@node1 ~]# date; ssh node2 'date' #测试
Wed Jun 10 16:27:47 CST 2015
Wed Jun 10 16:27:47 CST 2015



安装所需程序包

1
2
3
4
5
6
7
8
9
10
11
12
13
#安装corosync + pacemaker,pacemaker依赖于corosync,会一并安装
[iyunv@node1 ~]# yum install pacemaker -y
#安装pacemaker配置接口,crmsh依赖于pssh,单独安装需解决依赖关系,需suse官方源
[iyunv@node1 ~]# yum install crmsh  -y
#安装drbd
[iyunv@node1 ~]# yum install gcc gcc-c++ glibc flex kernel-devel kernel-headers -y
[iyunv@node1 ~]# tar xf drbd-8.4.3.tar.gz
[iyunv@node1 ~]# cd drbd-8.4.3
[iyunv@node1 drbd-8.4.3]# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-km
[iyunv@node1 drbd-8.4.3]# make && make install
[iyunv@node1 drbd-8.4.3]# modprobe drbd

#两个节点都执行以上操作



Corosync配置

修改配置文件

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
[iyunv@node1 ~]# cd /etc/corosync/
[iyunv@node1 corosync]# mv corosync.conf.example corosync.conf
[iyunv@node1 corosync]# vim corosync.conf

# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {                           #心跳信息传递层
    version: 2                    #版本
    secauth: 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
}



生成认证文件

1
2
3
4
5
6
[iyunv@node1 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.
Press keys on your keyboard to generate entropy (bits = 736).
########此时拼命敲键盘产生随机数###########



将配置文件及认证文件同步给另一个节点

wKiom1V4OdySmnRGAAB0r6Kc0xw187.jpg

安装mysql

wKiom1V4L3-RQw1uAAIhc3sefyA788.jpg

1
2
3
4
5
6
[iyunv@node1 ~]# vim /etc/mysql/my.cnf

datadir = /mydata/data
log-bin=/mydata/binlogs/

#两个节点都执行以上操作



DRBD配置

准备DRBD分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[iyunv@node1 ~]# fdisk sdb
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +10G

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[iyunv@node1 ~]# partx -a /dev/sdb

#另一个节点也执行此操作



修改配置文件

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
[iyunv@node1 ~]# vim /etc/drbd.d/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/dr
bd/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/dr
bd/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-em
ergency-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;
        }
}

[iyunv@node1 ~]# vim /etc/drbd.d/mydata.res
#定义一个资源/etc/drbd.d/mydata.res,内容如下
resource mydata {
  on node1 {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   172.16.10.123:7789;
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   172.16.10.124:7789;
    meta-disk internal;
  }
}



将配置文件同步给另一个节点

wKioL1V4UJfhbM1AAABp-76DDgk070.jpg

初始化资源并启动服务

1
2
3
4
[iyunv@node1 ~]# drbdadm create-md mydata
[iyunv@node1 ~]# service drbd start

#两个节点都要执行以上操作



同步资源

wKioL1V4VG6gw7WZAADakBB5yAs650.jpg

1
#以上操作只在一个节点进行



格式化DRBD分区

wKioL1V4VpTS7Pg3AAJPeDUxUIA065.jpg

1
#以上操作只在一个节点执行



挂载DRBD分区初始化数据库

wKiom1V4VtPRgNO0AAEfrAWLf28388.jpg

1
2
3
4
[iyunv@node1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydat
a/data/  --basedir=/usr/local/mysql

#初始化操作只执行一次即可



测试数据是否同步

wKiom1V4XzPz6Zy1AAKFzOtRi8g157.jpg

在另一个节点上测试

wKioL1V4ZLXgEIpkAAEODvl2Tjs259.jpg

wKiom1V4Z73w9K8FAAHqte9wnkc356.jpg

数据同步成功,接下来关闭所有服务

wKioL1V4agXQo68rAAC0ds3FKMc278.jpg

1
#另一个节点也关闭服务,确保开机不会自启




配置corosync资源,实现高可用

定义DRBD资源

wKiom1V5C1DDskqPAAEX_5fXlYU231.jpg

定义DRBD主从资源

wKioL1V5D3fDlsghAAB5wuBi7JA473.jpg

定义mysql所需资源

wKioL1V5lTjDcZdKAAF4yd2iP9M715.jpg

定义组及各资源约束关系

wKioL1V5lWCR4IAkAAESwMFL5wA847.jpg

查看所有资源信息

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
crm(live)configure# show

node node1.scholar.com
node node2.scholar.com
primitive mydrbd ocf:linbit:drbd \
        params drbd_resource=mydata \
        op monitor role=Master interval=10s timeout=20s \
        op monitor role=Slave interval=20s timeout=20s \
        op start timeout=240s interval=0 \
        op stop timeout=100s interval=0
primitive myfs Filesystem \
        params device="/dev/drbd0" directory="/mydata" fstype=ext4 \
        op monitor interval=20s timeout=60s \
        op start timeout=60s interval=0 \
        op stop timeout=60s interval=0
primitive myserver lsb:mysqld \
        op monitor interval=30s timeout=20s
primitive myvip IPaddr \
        params ip=192.168.1.121 \
        op monitor interval=30s timeout=20s
group myservice myvip myfs myserver
ms ms_mydrbd mydrbd \
        meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation myfs_with_ms_mydrbd_master inf: myfs ms_mydrbd:Master
colocation myserver_with_myfs inf: myserver myfs
order myfs_after_ms_mydrbd_master Mandatory: ms_mydrbd:promote myfs:start
property cib-bootstrap-options: \
        dc-version=1.1.11-97629de \
        cluster-infrastructure="classic openais (with plugin)" \
        expected-quorum-votes=2 \
        stonith-enabled=false \
        no-quorum-policy=ignore \
        last-lrm-refresh=1434014581



查看集群运行状态

wKiom1V5nf7iChkoAAHNkAUJ07Q305.jpg

授权一个远程用户做测试

wKioL1V5oV7zCASWAAHGr9VX8QU704.jpg

在其他主机登陆测试

wKioL1V5ooTwYAhRAAJS9u69YSM669.jpg

此时模拟主节点故障

wKiom1V5ofXgT4KXAAIB-YkIxmA713.jpg

此时,资源被转移到了node2上,继续用远程主机登陆测试

wKioL1V5pDrxbELwAAIHEc1amgs841.jpg

数据没有受到任何影响,高可用目的实现,至此,基于Corosync + Pacemaker+DRBD的MySQL高可用集群实验完成

The end

本次实验就进行到这里了,实验过程出现了一个奇葩问题,至今不知何故,朋友们如果配置过程中遇到问题欢迎留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-76364-1-1.html 上篇帖子: 修改mysql的数据库名字 下篇帖子: Mysql主从复制(数据故障恢复恢复)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表