基于DRBD构建高可用主从MySQL服务器
前言:构建双节点高可用Mysql服务器,用DRBD个人感觉是比较合适的,只需要两台Server即可,用IP SAN的话先不说SAN的设备,主机也得需要4台,NFS是行不通的。目标:两台mysql服务器基于drbd构建高可用主从服务器,平时DR1服务器接受请求,DR2基于DRBD数据备份,当DR1出现问题时,DR2接替DR1的工作接受用户请求。
规划:
[*]DR1:172.16.1.16 hostname dr1.laoguang.me
[*]
[*]DR2:172.16.1.17 hostname dr2.laoguang.me
[*]
[*]VIP:172.16.1.1
环境:RedHat5.8 内核:2.6.18-308.el5Selinux已经关闭Yum 配置完好
注:如果没说在哪台机器上配置则默认是dr1
一.配置准备工作,hostname设置,/etc/hosts解析的与对方hostname -n 一致,ssh互信,时间统一
1.1 hostname设置在dr1上演示设置
[*]hostname dr1.laoguang.me
[*]vi /etc/hosts##添加如下解析
[*]172.16.1.16 dr1.laoguang.me dr1
[*]172.16.1.17 dr2.laoguang.me dr2
1.2 ssh互信设置dr1上演示
[*]ssh-keygen -t rsa -P "" ##回车,生成密钥在/root/.ssh下
[*]ssh-copy-id -i /root/.ssh/id_rsa.pub dr2 ##公钥拷贝到dr2上,再次登录dr2不需要密码
[*]同样dr2也这么设置
1.3 同步时间(如果有NTP就同步NTP的时间)
[*]date -s 20121127;ssh dr2 'date -s 20121127'
二.dr1,dr2上安装DRBD
DRBD分为两部分,一部分是工作内核中的模块部分,一部分是工件在用户空间的管理工具,2.6.33以后的内核中已经集成了DRBD的模块,只安装管理工具即可,旧内核需要为内核打补丁才可以,有爱好者把补丁做成了rpm包名字为kmod-drbd,安装它即可,补丁包一定与内核版本一致。下面安装与软件。
2.1 dr1,dr2安装内核补丁与软件 kmod-drbd83-8.3.8-1.el5.centos.i686.rpm,drbd83-8.3.8-1.el5.centos.i386.rpm
[*]rpm -ivh kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
[*]rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm
[*]rpm -ql drbd83 ##查看生成文件
2.2 配置DRBD(注如果没说在哪台机器上配置则默认是dr1)
/etc/drbd.conf 为主配置文件,它把/etc/drbd.d下子配置文件包含进来,通过查看drbd.conf我们可以发现一样例文件/usr/share/doc/drbd83-8.3.8/drbd.conf,用它覆盖这个空的配置文件。
[*]cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/
编辑/etc/drbd.d/global_common.conf 这个全局配置文件如下:
[*] global {
[*] usage-count no;
[*] # minor-count dialog-refresh disable-ip-verification
[*] }
[*]
[*] common {
[*] protocol C;
[*]
[*] handlers {
[*] 用默认即可
[*] }
[*]
[*] startup {
[*] #wfc-timeout 120;
[*] #degr-wfc-timeout 120;
[*] }
[*]
[*] disk {
[*] on-io-error detach; ##IO错误的处理方法
[*] #fencing resource-only;
[*] }
[*]
[*] net {
[*] cram-hmac-alg "sha1"; ##指定校验算法,校验是为保证数据完整
[*] shared-secret "laoguang.me";##指定校验密码
[*] }
[*]
[*] syncer {
[*] rate 1000M; ##指定同步时用多少带宽
[*] }
[*] }
2.3 dr1,drs上创建大小一样的分区,不演示了
dr1上的为/dev/sda5 1G ##注:记的partprobe,不要格式化
dr2上的为/dev/sda5 1G
2.4 为DRBD添加磁盘资源
[*]vim /etc/drbd.d/mysql.res
[*] resource mysql {
[*] on dr1.laoguang.me {
[*] device /dev/drbd0; ##DRBD用的设备
[*] disk /dev/sda5; ##映射的磁盘
[*] address 172.16.1.16:7789;##drbd启动后监听端口7789
[*] meta-disk internal; ##元数据存放
[*] }
[*] on dr2.laoguang.me {
[*] device /dev/drbd0;
[*] disk /dev/sda5;
[*] address 172.16.1.17:7789;
[*] meta-disk internal;
[*] }
[*] }
2.5 拷贝到时dr2上一份
[*]scp -r /etc/drbd.* dr2:/etc/
2.6 dr1,dr2上初始化drbd资源,并启动服务
[*]drbdadm create-md mysql ##如果没出现successful可能是你没有partprobe哦
[*]service drbd start
[*]drbd-overview##查看起动状态
[*]0:mysqlConnected Secondary/Secondary Inconsistent/Inconsistent C r----
2.7 将其中dr1节点先设置为Primary,让磁盘同步一次
[*]drbdsetup /dev/drbd0 primary –o
[*]drbd-overview ##查看状态,可知dr2开始同步dr1的数据,等待同步完成
[*]0:mysqlSyncSource Primary/Secondary UpToDate/Inconsistent C r----
[*][==>.................] sync'ed: 15.3% (841880/987896)K delay_probe: 11
2.8 格式化drbd0,挂载使用。注意,由于没有锁管理,所以不要同时挂载使用,一般只有primaty可使用
[*]mke2fs -j -L DRBD /dev/drbd0
[*]mkdir /data/mydata -pv ##dr1,dr2都建立该目录,为以后mysql安装准备
[*]mount /dev/drbd0 /data/mydata
[*]cd /data/mydata##查看是否成功,建立文件测试能否同步
[*]cp /etc/fstab .
[*]umount /data/mydata
[*]drbdadm secondary mysql##把自己转换为Secondary
[*]dr2上操作:
[*]drbdadm primary mysql ##dr2切换为Primary
[*]mount /dev/drbd0 /data/mydata##挂载,并查看是否有数据
[*]ls /data/mydata
到此DRBD设置完毕。一会儿我们会把drbd定义为资源,所以禁止drbd开机启动
[*]chkconfig drbd off
三.dr1,dr2上安装Mysql
primary切换到dr1,挂载drbd0到/data/mydata,开始安装Mysql,本段不再演示,如有需要去看http://laoguang.blog.51cto.com/6013350/1039208
主要更改datadir到 /data/mydata ,另外注意dr1,dr2的mysql用户uid,gid须一致
安装完测试能否启动,如果能,请继续。
停止mysql,卸载drbd,primary切换到dr2,挂载drbd0到/data/mydata,mysql不需要初始化了,拷贝配置文件,启动脚本即可。测试能否启动
不许mysql开机启动
[*]chkconfig mysqld off
四.基于corosync,pacemaker部署高可用集群
4.1 安装covosync,pacemaker及依赖包
[*] ls ##查看当前目录下的所有包,http://clusterlabs.org/rpm/下载适合你平台的包
[*] cluster-glue-1.0.6-1.6.el5.i386.rpm
[*] cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
[*] corosync-1.2.7-1.1.el5.i386.rpm
[*] corosynclib-1.2.7-1.1.el5.i386.rpm
[*] heartbeat-3.0.3-2.3.el5.i386.rpm ##安装heartbeat是因为pacemake会依赖它的某些库
[*] heartbeat-libs-3.0.3-2.3.el5.i386.rpm
[*] libesmtp-1.0.4-5.el5.i386.rpm
[*] pacemaker-1.1.5-1.1.el5.i386.rpm
[*] pacemaker-cts-1.1.5-1.1.el5.i386.rpm
[*] pacemaker-libs-1.1.5-1.1.el5.i386.rpm
[*] perl-TimeDate-1.16-5.el5.noarch.rpm
[*] resource-agents-1.0.4-1.1.el5.i386.rpm
------------------------------centos5.x x86_64bit安装方法----------------------------
[*]rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
[*]wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
[*]yum -y install heartbeat-stonith
[*]yum -y install pacemaker corosync
--------------------------------------------------------------------------------------
安装它们
[*]yum -y --nogpgcheck localinstall *.rpm ##必须在rpm所在目录哦
4.1 修改covosync配置文件
[*]cd /etc/corosync
[*] mv corosync.conf.example corosync.conf
[*] vi corosync.conf
[*] totem {
[*] version: 2
[*] secauth: on ##启用认证,不能让其它主机随意加入集群
[*] threads: 0
[*] interface {
[*] ringnumber: 0
[*] bindnetaddr: 172.16.0.0##绑定端口
[*] mcastaddr: 226.94.11.19##组播地址,建议修改
[*] mcastport: 5405 ##组播端口
[*] }
[*] }
[*]
[*] logging { ##定义日志
[*] fileline: off
[*] to_stderr: no
[*] to_logfile: yes ##日志写入独立file
[*] to_syslog: no ##不用写到syslog中了
[*] logfile: /var/log/cluster/corosync.log ##日志path,需要手动建立
[*] debug: off ##调试
[*] timestamp: on
[*] logger_subsys {
[*] subsys: AMF
[*] debug: off
[*] }
[*] }
[*]
[*] amf {
[*] mode: disabled
[*] }
[*] service { ##定义资源管理服务
[*] ver: 0
[*] name: pacemaker ##启动pacemaker
[*] }
[*] aisexec { ##运行corosync的user
[*] user: root
[*] group: root
[*] }
4.2 建立日志目录,建立认证密钥
[*]mkdir /var/log/cluster ##dr2中也建立
[*]corosync-keygen ##生成密钥
[*]##配置文件同步到dr2上一份
[*]scp -p authkey corosync.conf dr2:/etc/corosync/
4.3 dr1,dr2启动corysync,等待一会儿查看状态
[*]service corysync start
[*]crm status ##查看状态,如果显示Online: [ dr2.laoguang.me dr1.laoguang.me ] 则正常
4.4 定义covosync的一些属性,我们没有stonith设备,我们就两个节点,假如一个挂点quorum就不会大于1/2,集群还运行于否
[*]crm ##进入crn命令行,以后管理集群就靠它了
[*]crm(live)# configure ##进入配置状态
[*]crm(live)configure# property no-quorum-policy="ignore" ##定义quorum不足一半时继续运行
[*]crm(live)configure# property stonith-enabled="false" ##禁用stonish,生产环境中应该定义的
[*]crm(live)configure# verify ##校验是否有语法错误
[*]crm(live)configure# commit ##没有错误,提交
[*]crm(live)configure# show ##查看
4.5 定义drbd为主从资源
[*]crm(live)configure# primitive Mysql_DRBD ocf:linbit:drbd \
[*]params drbd_resource=mysql op start timeout=240 op stop timeout=100
[*]##先定义为本地资源,指定资源类型,资源name,指定用的RA,后面的是RA的语法需要
[*]##drbd_resource是指你定义的drbd的名字
[*]crm(live)configure# master Ms_Mysql_DRBD Mysql_DRBD meta \
[*]master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
[*]##master关键字定义主从资源,后面指定资源name,meta 指定额外参选数,master-max指定最多有几个master,
[*]##master-node-max指定一个节点最多运行几个master,clone-max指定有几个clone资源,
[*]##clone-node-max指定一个节点最多运行几个clone资源,notify指当出现故障时是否通知对方
[*]crm(live)configure# verify
[*]crm(live)configure# commit
[*]crm(live)configure# quit
[*]drbd-overview ##查看drbd是不是启动了
4.6 定义Filesystem资源
定义Filesystem挂载
[*]crm(live)configure# primitive MysqlFS ocf:heartbeat:Filesystem params \
[*]device=/dev/drbd0 directory=/data/mydata fstype="ext3" op start timeout=60 \
[*]op stop timeout=60
挂载的drbd的一方必须是primary的主机,所以我们还得定义排列约束,Filesystem必须挂载到drbd的primary上,drbd服务必须先于Filesystem启动
[*]crm(live)configure# colocation MysqlFS_with_Ms_Mysql_master inf: MysqlFS Ms_Mysql_DRBD:Master
[*]crm(live)configure# order MysqlFS_after_Ms_Mysql_DRBD inf: Ms_Mysql_DRBD:promote MysqlFS:start
[*]crm(live)configure# verify
[*]crm(live)configure# commit
[*]crm(live)configure# show 查看CIB库
[*]crm(live)configure# quit
[*]crm_mon##查看资源运行状况
[*]mount 查看master上drbd0挂载上没有
4.7 定义Mysql资源,定义顺序约束与排列约束
[*] crm(live)configure# primitive Mysql_Server lsb:mysqld
[*] crm(live)configure# order Mysql_Server_after_MysqlFS inf: MysqlFS Mysql_Server
[*] crm(live)configure# colocation Mysql_Server_with_MysqlFS inf: Mysql_Server MysqlFS
[*] crm(live)configure# verify
[*] crm(live)configure# commit
[*] crm(live)configure# quit
[*] crm status
[*] # crm status
[*] ============
[*] Last updated: Wed Nov 28 15:11:26 2012
[*] Stack: openais
[*] Current DC: dr1.laoguang.me - partition with quorum
[*] Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
[*] 2 Nodes configured, 2 expected votes
[*] 3 Resources configured.
[*] ============
[*]
[*] Online: [ dr2.laoguang.me dr1.laoguang.me ]
[*]
[*] Master/Slave Set: Ms_Mysql_DRBD
[*] Masters: [ dr2.laoguang.me ]
[*] Slaves: [ dr1.laoguang.me ]
[*] MysqlFS (ocf::heartbeat:Filesystem): Started dr2.laoguang.me
[*] Mysql_Server (lsb:mysqld): Started dr2.laoguang.me
4.8 定义一个IP资源并定义顺序、排列约束
[*] crm(live)configure# primitive Mysql_IP ocf:heartbeat:IPaddr params ip=172.16.1.1
[*] crm(live)configure# colocation Mysql_IP_with_Mysql_Server inf: Mysql_IP Mysql_Server
[*] crm(live)configure# order Mysql_IP_after_Mysql_Server inf: Mysql_Server Mysql_IP
[*] crm(live)configure# verify
[*] crm(live)configure# commit
[*] crm(live)configure# quit
[*] crm status
[*] # crm status
[*] ============
[*] Last updated: Wed Nov 28 15:17:03 2012
[*] Stack: openais
[*] Current DC: dr1.laoguang.me - partition with quorum
[*] Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
[*] 2 Nodes configured, 2 expected votes
[*] 4 Resources configured.
[*] ============
[*]
[*] Online: [ dr2.laoguang.me dr1.laoguang.me ]
[*]
[*] Master/Slave Set: Ms_Mysql_DRBD
[*] Masters: [ dr2.laoguang.me ]
[*] Slaves: [ dr1.laoguang.me ]
[*] MysqlFS (ocf::heartbeat:Filesystem): Started dr2.laoguang.me
[*] Mysql_Server (lsb:mysqld): Started dr2.laoguang.me
[*] Mysql_IP (ocf::heartbeat:IPaddr): Started dr2.laoguang.me
4.9 资源定义完毕,简单的集群构建完毕,测试能否正常转移
由4.8可知Master为dr2,我们在dr2上转移测试
[*]crm node standby
[*]crm status ##查看Master是否变为了dr1
继续测试,休眠dr1虚拟机,看能否转移到时dr2
mysql中建立数据库与表格,standby测试数据是否能同步
到此实验结束。做个实验也许1个小时能完成,但写成文档却花了半天时间。
页:
[1]