文档章节

Corosync+Pacemaker+DRBD实现MySQL的高可用

小马就是神
 小马就是神
发布于 2016/03/12 23:04
字数 2916
阅读 68
收藏 1

Corosync+Pacemaker+DRBD实现MySQL的高可用

高可用集群方案简介:

  corosync是高可用集群中基础事务层 (Messaging Layer)的一个实现方案与heartbeat的功能类似,主要用来传递集群的事务信息,它在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。Corosync识别节点是通过authkey来实现的,不同于heartbeat v1 v2,Corosync的authkey是通过corosync-keygen命令生成的,具有更高的安全性。

  pacemaker是一个集群资源管理器,从heartbeat v3版本中分裂出来。它利用集群事务层提供的组件对各节点进行资源管理及监控并从节点或资源级别的故障中恢复,以实现群集服务的最大可用性。

DRBD简介:

  DRBD:Distributed Replicated Block Device,分布式复制快设备;DRBD是由内核模块和相关脚本而构成,无共享的、服务器之间镜像块设备内容的存储复制解决方案。

  为什么使用DRBD:以之前的博文中介绍的共享存储NFS服务为例,当前端都是高可用或冗余,但是后端只有NFS服务为其做共享存储,那么存储本身属于单点故障,如果其节点一旦故障,可导致整个架构的瘫痪;所以此时需要对共享存储做高可用。

  工作方式:在每个节点上预留出块级别的存储设备,而后能够实现在节点内核当中启动一个内核模块“drbd”模块,这个模块能够监听在套接字上,这样之后在某个节点中的某个进程试图在drbd的分区中写入数据的时候,这个数据一定会流进内核debd模块之后内核会将数据复制一份并通过本地的tcp/ip协议栈发往另外一个节点的drbd进程,其收到请求后将数据默默的存放在本地的dbd的存储空间中,从而达到一致,所以当写入数据的时候首先会流进本地内核中的drbd模块,其会被分为数据流 一个继续往下存储一个则通过网络发送给另外的drbd节点从而达成数据的冗余。

两种工作模式:

  primary/secondary:主备节点

    primary:读写

    secondary:不允许挂载

      Traditional Filesystem

  primary/primary:双主模型

    primary:读写

      Cluster FileSystem

3种复制模式:

  protocol A:异步复制,数据在本地写成功之后立即返回,数据在发送过程中可能丢失(可靠性最低,性能最好)。

  protocol B:内存同步复制,数据成功发送至从节点后返回,数据尚在从节点的内存中。

  protocol C:同步复制,数据成功发送至从节点,同步到磁盘后才返回(可靠性最高,性能最差)。

  配置DRBD本身并不依赖于其他高可用服务,可以完全手动,只有想让其自动完成提供或降级才需要依赖高可用集群套件,一般来讲DRBD可以与heartbeat 、cman 、crorsync等结合使用。

实验拓扑:

输入图片说明

实验环境:

OS:CentOS_6.7-x86_64
Kernel:2.6.32-431

  注意:drbd服务可通关编译或rpm包安装;本次实验drbd服务通过rpm包安装,由于rpm包最新版本支持内核版本为2.6.32-431,所以实验环境CentOS6.7内核需额外安装;

DRBD,rpm包下载地址:

ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/

CentOS_6,2.6.32-431内核下载地址:

http://vault.centos.org/6.5/os/x86_64/Packages/

Noode1:

IP:eth0,192.168.1.4
VIP:eth0:0,192.168.1.3

Noode2:

IP:eth0,192.168.1.5
VIP:eth0:0,192.168.1.3

NTP:

IP:eth0,192.168.1.4

集群所需资源:VIP、mysqld、DRBD

实验流程:

配置高可用集群的前提:

1、时间必须保持同步:使用ntp服务器;

[root@node0 ~]# yum install ntp
[root@node0 ~]# vim /etc/ntp.conf
restrict 192.168.1.0 mask 255.255.255.0 nomodify
server 127.127.1.0
fudge 127.127.1.0 stratum 1

启动服务:

[root@node0 ~]# chkconfig ntpd on
[root@node0 ~]# service ntpd start

各节点添加对时任务:

[root@node1 ~]# crontab -e
*/5 * * * *	/usr/sbin/ntpdate 192.168.1.4 &> /dev/null

2、节点必须名称互相通信:

编辑/etc/host 解析节点名称:

[root@node0 ~]# vim /etc/hosts
192.168.1.4	node0.chencer.org node0
192.168.1.5	node1.chencer.org node1

3、ssh密钥认证进行通信;

节点间ssh互信认证:

[root@node0 ~]# ssh-keygen -t rsa
[root@node0 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1

配置drbd:

两个节点上提供相同的硬盘分区:

输入图片说明

安装drbd:

[root@node0 drbd]# yum install drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm drbd-8.4.3-33.el6.x86_64.rpm

编辑配置文件:

drbd的配置有三段:

  全局段(global):

  通用配置段(common):为各res提供共享配置;

  资源专用配置段(通过定义资源进行):为特定的res提供专用配置;

[root@node0 ~]# vim /etc/drbd.d/global_common.con
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@node0 ~]# vim /etc/drbd.d/data.res
resource data {
    on  node0.chencer.org  {
        device  /dev/drbd0;
        disk  /dev/sdb1;
        address  192.168.1.4:7789;
        meta-disk internal;
  }
    on  node1.chencer.org  {
        device  /dev/drbd0;
        disk  /dev/sdb1;
        address  192.168.1.5:7789;
        meta-disk internal;
  }
}

将以上两文件复制到另一节点:

[root@node0 ~]# scp /etc/drbd.d/* node1:/etc/drbd.d/

确保两节点drbd服务不会开机自动启动:

[root@node0 ~]# chkconfig drbd off

初始化资源并启动服务:

[root@node0 ~]# drbdadm create-md data

同步资源:

[root@node0 ~]# drbdadm primary --force data
[root@node0 ~]# watch ‘drbd-overview’ 

输入图片说明

输入图片说明

此时在主节点创建文件系统并挂载:

[root@node0 ~]# mke2fs -t ext4 -b 4096 /dev/drbd0
[root@node0 ~]# mkdir /data
[root@node0 ~]# mount /dev/drbd0 /data/

二进制格式安装Mysql-5.5:

解决软件依赖关系:

[root@node0 ]# yum install libaio

创建mysql用户:

[root@node0 ~]# groupadd -g 306 -r mysql
[root@node0 ~]# useradd -u 306 -g 306 -r mysql
[root@node0 mysql]# mkdir /data/mydata
[root@node0 mysql]# chown -R mysql.mysql /data/mydata

二进制安装设置:

[root@node0 ~]# tar xf mysql-5.5.47-linux2.6-x86_64.tar.gz -C /usr/local/
[root@node0 ~]# cd /usr/local/
[root@node0 local]# ln -sv mysql-5.5.47-linux2.6-x86_64 mysql
"mysql" -> "mysql-5.5.47-linux2.6-x86_64"
[root@node0 local]# cd mysql/
[root@node0 mysql]# chown -R root.mysql ./*

导出头文件、库文件、man手册:

[root@node0 mysql]# ln -sv /usr/local/mysql/include /usr/include/mysql
"/usr/include/mysql" -> "/usr/local/mysql/include"
[root@node0 mysql]# vim /etc/ld.so.conf.d/mysql-5.5-x86_64.conf
/usr/local/mysql/lib
[root@node0 mysql]# ldconfig
[root@node0 mysql]# vim /etc/man.config
MANPATH /usr/local/mysql/man

添加并重读环境变量:

[root@node0 mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@node0 mysql]# source /etc/profile.d/mysql.sh

提供配置文件和服务启动脚本:

[root@node0 mysql]# mkdir /etc/mysql
[root@node0 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
[root@node0 mysql]# vim /etc/mysql/my.cnf
[mysqld]
datadir = /data/mydata
thread_concurrency = 2
[root@node0 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node0 mysql]# chmod +x /etc/rc.d/init.d/mysqld

加入服务列表,保证开机不自动启动:

[root@node0 mysql]# chkconfig --add mysqld
[root@node0 mysql]# chkconfig mysqld off

在drbd主节点初始化数据:

[root@node0 mysql]# scripts/mysql_install_db --user=mysql --datadir=/data/mydata/

测试启动数据库:

[root@node0 mysql]# service mysqld start
Starting MySQL... SUCCESS!

为数据库创建并授权测试用户:

[root@node0 mysql]# mysql
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on *.* to root@'192.168.1.%' identified by 'rootroot';
Query OK, 0 rows affected (1.65 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

切换至另一节点测试:

[root@node0 mysql]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@node0 mysql]# umount /data/
[root@node0 mysql]# drbdadm secondary data

[root@node1 mysql]# drbdadm primary data
[root@node1 mysql]# drbd-overview
  0:data/0  Connected Primary/Secondary UpToDate/UpToDate C r-----

挂载并启动服务:

[root@node1 mysql]# mkdir /data
[root@node1 mysql]# mount /dev/drbd0 /data/
[root@node1 mysql]# service mysqld start
Starting MySQL... SUCCESS!

连接测试数据库:

[root@node1 mysql]# mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.34 sec)

停止服务,并卸载存储:

[root@node1 mysql]# service mysqld stop
Shutting down MySQL. SUCCESS! 
[root@node1 mysql]# umount /data/
[root@node1 mysql]# service drbd status

[root@node0 mysql]# service drbd stop

安装配置corosync+pacemaker+crmsh:

  注意:RHEL自6.4起不再提供集群的命令行配置工具crmsh,转而使用pcs;可添加以下repo源,下载并安装crmsh;crmsh依赖于corosync和pacemaker,所以要先安装corosync和pacemaker;注意同时配置好epel源。

[root@node0 ~]# cat /etc/yum.repos.d/networkha-clusteringStable.repo 
[network_ha-clustering_Stable]
name=Stable High Availability/Clustering packages (CentOS_CentOS-6)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/
enabled=1
gpgcheck=0
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/repodata/repomd.xml.key

安装corosync+pacemaker+crmsh:

[root@node0 ~]# yum install corosync pacemaker crmsh
[root@node0 ~]# rpm -ql corosync | less
/etc/corosync    \\:配置文件目录;
/etc/corosync/corosync.conf.example.udpu    \\:配置文件模板

生成认证文件:

[root@node0 corosync]# corosync-keygen

编辑配置文件:

[root@node0 ~]# cd /etc/corosync/
[root@node0 corosync]# cp corosync.conf.example.udpu corosync.conf
[root@node0 corosync]# vim corosync.conf
compatibility: whitetank
totem {
    version: 2
    secauth: off
    interface {
        member {
            memberaddr: 192.168.1.4
        }
        member {
            memberaddr: 192.168.1.5
        }
        ringnumber: 0
        bindnetaddr: 192.168.1.0
        mcastaddr: 239.255.1.1
        mcastport: 5405
        ttl: 1
    }
    transport: udpu
}
logging {
    fileline: off
    to_logfile: no
    to_syslog: yes
    logfile: /var/log/cluster/corosync.log
    debug: off
    timestamp: on
    logger_subsys {
        subsys: AMF
        debug: off
    }
}

为pacemaker提供配置文件:

[root@node0 corosync]# vim service.d/pcmk
service {
    # Load the Pacemaker Cluster Resource Manager
    name: pacemaker
    ver: 1
}

将以上文件复制给另一节点:

[root@node0 corosync]# scp -r authkey corosync.conf service.d node1:/etc/corosync/

两节点启动corosync和pacemaker服务:

[root@node0 corosync]# service corosync start;service pacemaker start;ssh node1 'service corosync start;service pacemaker start'

查看当前状态:

[root@node0 corosync]# crm status
Last updated: Sun Jan 24 17:36:46 2016
Last change: Sun Jan 24 17:36:34 2016
Stack: classic openais (with plugin)
Current DC: node1.chencer.org - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured

Online: [ node0.chencer.org node1.chencer.org ]

配置集群的工作属性:

而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用;并且因为双节点,所以忽略法定数:

[root@node0 ~]# crm    \\:进入交互式命令界面;
crm(live)# configure    \\:进入configure模式;
crm(live)configure# property stonith-enabled=false    \\:禁用stonith
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify    \\:检查配置;
crm(live)configure# commit    \\:保存配置;

添加资源:

配置DRBD资源:

crm(live)configure# primitive drbd ocf:linbit:drbd params drbd_resource=data op monitor role=Master interval=10s timeout=20s op monitor role=Slave interval=20s timeout=30s op start timeout=240s op stop timeout=100s
crm(live)configure# master ms_drbd drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
crm(live)configure# verify

添加资源:VIP、Filesystem、mysqlserver

crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.1.3 op monitor interval=10s timeout=20s
crm(live)configure# primitive data ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data" fstype="ext4" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s
crm(live)configure# primitive mysql lsb:mysqld op monitor interval=20s timeout=30s
crm(live)configure# verify

定义各种资源约束:

crm(live)configure# colocation data_with_ms_drbd inf: data ms_drbd:Master
crm(live)configure# colocation vip_with_data inf: vip data
crm(live)configure# colocation mysql_with_data inf: mysql data
crm(live)configure# order data_after_ms_drbd inf: ms_drbd:promote data:start
crm(live)configure# order vip_after_data inf: data vip
crm(live)configure# order mysql_after_vip inf: vip mysql
crm(live)configure# verify
crm(live)configure# commit

查看所有资源:

crm(live)configure# show
node node0.chencer.org
node node1.chencer.org
primitive data Filesystem \
    params device="/dev/drbd0" directory="/data" fstype=ext4 \
    op monitor interval=20s timeout=40s \
    op start timeout=60s interval=0 \
    op stop timeout=60s interval=0
primitive drbd ocf:linbit:drbd \
    params drbd_resource=data \
    op monitor role=Master interval=10s timeout=20s \
    op monitor role=Slave interval=20s timeout=30s \
    op start timeout=240s interval=0 \
    op stop timeout=100s interval=0
primitive mysql lsb:mysqld \
    op monitor interval=20s timeout=30s
primitive vip IPaddr \
    params ip=192.168.1.3 \
    op monitor interval=10s timeout=20s
ms ms_drbd drbd \
    meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
colocation data_with_ms_drbd inf: data ms_drbd:Master
colocation mysql_with_data inf: mysql data
colocation vip_with_data inf: vip data
order data_after_ms_drbd inf: ms_drbd:promote data:start
order mysql_after_vip inf: vip mysql
order vip_after_data inf: data vip
property cib-bootstrap-options: \
    dc-version=1.1.11-97629de \
    cluster-infrastructure="classic openais (with plugin)" \
    expected-quorum-votes=2 \

启动资源组,查看资源状态:

crm(live)# resource start mysqlservice
crm(live)# status

输入图片说明

连接数据库测试:

[root@node2 ~]# mysql -h192.168.1.3 -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database tdb;
Query OK, 1 row affected (0.03 sec)

转移资源,测试链接数据库:

crm(live)# node standby
crm(live)# status 

![enter description here][6]

[root@node2 ~]# mysql -h192.168.1.3 -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| tdb                |
| test               |
| testdb             |
+--------------------+
6 rows in set (0.06 sec)

数据同步成功。

© 著作权归作者所有

小马就是神
粉丝 62
博文 53
码字总数 96195
作品 0
昌平
程序员
私信 提问
构建高性能MYSQL集群系统总结

MYSQL高可用集群方案总结 一,常见的高可用MYSQL解决方案 高可用解决方案: 1,数据共享或同步数据,数据共享可通过SAN(Storage Area Network)来实现,数据同步可通过rsync软件或DRDB技术来...

高好亮
2017/03/01
0
0
mysql数据库高可用解决方案

MySQL数据库作为最基础的数据存储服务之一,在整个系统中有着非常重要的地位,因此要求其具备高可用性是无可厚非的。有很多解决方案能实现不同的SLA(服务水平协定),这些方案可以保证数据库...

Foundation
2015/12/09
88
0
常见的高可用MySQL解决方案

MySQL数据库作为最基础的数据存储服务之一,在整个系统中有着非常重要的地位,因此要求其具备高可用性是无可厚非的。有很多解决方案能实现不同的SLA(服务水平协定),这些方案可以保证数据库...

tianfuguoss
2015/12/01
226
0
常见的高可用MySQL解决方案

MySQL数据库作为最基础的数据存储服务之一,在整个系统中有着非常重要的地位,因此要求其具备高可用性是无可厚非的。有很多解决方案能实现不同的SLA(服务水平协定),这些方案可以保证数据库...

南非蚂蚁
2015/11/30
0
0
MySQL高可用在网易的最佳应用与实践

本文根据DBAplus社群第102期线上分享整理而成。 主题简介: 1、常见的MySQL高可用架构 2、分布式数据库高可用实践 3、基于keepalive的MySQL高可用改造 大家好,我是来自杭州研究院的潘威,今...

潘威
2017/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦

全文共6706字,预计学习时长12分钟或更长 近日,《狮子王》热映,其逼真的外形,几乎可以以假乱真,让观众不禁大呼:awsl,这也太真实了吧! 实体模型、CGI动画、实景拍摄、VR等技术娴熟运用...

读芯术
26分钟前
1
0
C#经典面试题100道

1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34......

元歌
29分钟前
0
0
重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native C...

阿里云云栖社区
31分钟前
1
0
LeetCode 160: 相交链表 Intersection of Two Linked Lists

爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点。 Write a program to find the node at which the intersection of two singly linked lists begins. 如下面的两个链...

iCodeBugs
33分钟前
2
0
hadoop yarn漏洞 8088端口进入挖矿病毒处理记录

早上发现服务器cpu使用异常 进程如图所示 按照挖矿病毒的套路 肯定是定时任务不停地执行脚本 遂查看定时任务 进入/var/spool/cron 查看定时任务 发现里面有一个root文件 定时任务每分钟执行一...

詹姆斯-高斯林
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部