配置环境
内核版本:linux 2.6.32-358.el6.x86_64
一、corosync配置安装
准备工作,两个节点都要做
1、两个节点
172.16.5.11
172.16.5.12
2、两个节点可以互相解析。
# vim /etc/hosts
在后边加上两行
172.16.5.11 www.a.com a
172.16.5.12 www.b.com b
3、双机互信
# ssh-keygen -t rsa -P ‘’ # ssh-copy-id [-i .ssh/id_rsa ] root@a|b
4、时间同步
Ntpdate 时间服务器的ip
安装配置corosync (一般都在节点a上配置)
# yum -y install corosync pacemaker crmsh pssh pcs
(pcs可以不安装,它跟crm都可以作为配置的工具来使用,本文只使用crm)
corosync 集群服务
pacemaker 集群资源管理器
crmsh 提供crm命令
pssh 为crm命令提供命令行接口
crmsh pssh yum源中没有,下载地址
http://ftp.belnet.be/ftp.opensuse.org/repositories/network:/ha-clustering/CentOS_CentOS-6/x86_64/
# cd /etc/corosync # cp corosync.conf.example corosync.conf
接着编辑/etc/corosync/corosync.conf
compatibility: whitetank totem { version: 2 secauth: on(开启,并生成认证文件,不让其他主机随意加入集群) threads: 0 interface { ringnumber: 0 bindnetaddr: 172.16.0.0 (实验中两个节点所在的网段) mcastaddr: 226.194.41.41(多播地址,不建议使用默认地址) mcastport: 5405 ttl: 1 } } logging { fileline: off to_stderr: no to_logfile: yes to_syslog: no logfile: /var/log/cluster/corosync.log(如果没有,手动建立) debug: off timestamp: on logger_subsys { subsys: AMF debug: off } } amf { mode: disabled } service {(定义资源管理服务) ver: 0 name: pacemaker # use_mgmtd: yes } aisexec {(运行corosync的user) user: root group: root }
生成节点间通信时用到的认证密钥文件authkeys
# corosync-keygen
将corosync和authkey复制至b:
# scp -p corosync authkey b:/etc/corosync/
创建corosync生成的日志所在的目录:
# scp -p corosync authkey b:/etc/corosync/
将coorsync加入服务列表,并启动服务
# chkconfig --add corosync # service corosync start
可以到节点b上将服务也启动起来。
# chkconfig --add corosync # service corosync start
corosync默认启用了stonith,而当前集群并没有相应的stonith设备,所以要禁用stonith
# crm configure property stonith-enabled=false
我们使用的是两个节点的高可用,一个挂点,另一个节点就不满足法定票数,所以要设置参数no-quorum-policy="ignore"
# crm configure property no-quorum-policy=”ignorn”
二、接下来对crm命令做一些了解
1、Crm configure 主要是配置资源,实现对资源的增删查改,后面可以跟的命令有:
primitive|location|colocation|order|group|delete|property.......
# crm configure primitive webip(资源名称) ocf:heartbeat:IPaddr params ip=172.16.5.10 # crm configure primitive webserver(资源名称) lsb:httpd # crm configure primitive mystore ocf:heartbeat:Filesystem params device="172.16.100.17:/mydata" directory="/mydata" fstype="nfs" op monitor interval=20 timeout=20 on-fail=restart # pcs resource create mystore ocf:heartbeat:Filesystem params device="172.16.100.17:/mydata" directory="/mydata" fstype="nfs" op monitor interval=20 timeout=20 on-fail=restart # crm configure delete webserver # crm configure primitive # crm configure property(属性) no-quorum-policy=ignore忽略法定票数 # crm configure rsc_defaults resource-stickiness=100定义资源粘性 # crm configure colocation webserver-with-webip INFINITY: webip webserver排列约束infinity(无穷大) # crm configure order webip-before-webserver mandatory: webip webserver顺序约束 Mandatory(强制) # crm configure location prefer-node webserver 200: www.a.com位置约束
一个资源约束到一个节点了,跟他在一起的肯定也会跟着被约束到哪个节点
2、Crm resource 主要是管理资源,实现对资源的启动停止等,后边可以跟的命令有:
Start| stop|restart|status|meta|cleanup|promote......
# crm resource status webip # crm resource stop webip
3、crm ra 显示资源代理类型
# crm ra classes lsb ocf / heartbeat linbit pacemaker redhat service stonith # crm ra help classes list classes and providers(显示资源代理类型) list list RA for a class (and provider) meta,info show meta data for a RA providers show providers for a RA and a class help,? show help (help topics for list of topics) end,cd,up go back one level quit,bye,exit exit the program # crm ra list lsb # crm ra list service=# crm ra list lsb # crm ra list ocf heartbeat # crm ra list ocf pacemaker # crm ra info lsb:httpd # crm list stonith
4、查看corosync引擎是否正常启动:
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
5、查看初始化成员节点通知是否正常发出:
# grep TOTEM /var/log/cluster/corosync.log
6、检查启动过程中是否有错误产生。下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
7、查看pacemaker是否正常启动:
# grep pcmk_startup /var/log/cluster/corosync.log
8、配置集群的工作属性,禁用stonith,corosync默认启用了stonith,而当前集群并没有相应的stonith设备
# crm configure property stonith-enabled=false # crm_verify -L -V可以验证stonith是否可用
crm_verify命令是1.0后的版本的pacemaker提供的基于命令行的集群管理工具;可以在集群中的任何一个节点上执行
9、msyql的nfs文件系统在高可用中挂在不到指定的节点,务必检查该节点的mysql用户id号是否与nfs服务器上的mysql的id号一致
三、对crm有了一定了解之后,就可以添加资源,进行配置了。
我们先添加一个ip资源和httpd资源,简单实现对两个节点的高可用
1、 首先查看一下corosync的状态
# crm status Last updated: Thu Sep 19 21:52:30 2013 Last change: Thu Sep 19 21:52:27 2013 via crmd on www.b.com Stack: classic openais (with plugin) Current DC: www.b.com - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured, 2 expected votes 0 Resources configured. Online: [ www.a.com www.b.com ]
2、定义一个ip资源
# crm configure primitive webip ocf:heartbeat:IPaddr params ip=172.16.5.10
3、定义一个web服务
# crm configure primitive webserver lsb:httpd
4、查看状态
# crm status Last updated: Thu Sep 19 22:11:14 2013 Last change: Thu Sep 19 22:05:28 2013 via cibadmin on www.b.com Stack: classic openais (with plugin) Current DC: www.b.com - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured, 2 expected votes 2 Resources configured. Online: [ www.a.com www.b.com ] webip(ocf::heartbeat:IPaddr):Started www.a.com webserver(lsb:httpd):Started www.b.com
没有定义约束,就会负载均衡
5、约束定义
排列约束:将资源定义|列在一起
顺序约束:顾名思义,资源的启动顺序
位置约束:将资源定义在某一个节点上,不管另一个节点启动与否,只要这个节点启动了,资源就在这个节点上。
定义约束的顺序也是由上到下
排列约束-------》顺序约束-----》位置约束
只有在一起了,才有先后,然后将两者一起放到一个节点上。
6、定义排列约束
# crm configure colocation webip-with-webserver inf: webip webserver
再看
# crm status
会发现,两个资源在同一个节点上了,这是随机的。
7、定义顺序约束
# crm configure order webip-before-webserver mandatory: webip webserver
8、定义位置约束
# crm configure location prefer-node webip 500: www.a.com
Inf是INFINITY 的缩写
Mandatory 是强制的意思
500
三个都是分数,有正负之分。
9、查看配置状态
# crm status
四、详细说一下,如何nfs共享存储,实现mysqld高可用。
首先另起一台机器,作为nfs服务器,提供nfs共享文件。
Nfs服务器ip 172.16.5.100
前提是时间必须与之前的两个节点同步
在nfs服务器上配置导出文件
# vim /etc/exports /mysqldata 172.16.0.0/16(rw,no_root_squash) no_root_squash 不压缩root权限
注意要创建该目录
# mkdir /mysqldata
重新导出文件
# exportfs -arv
-a 操作所有文件系统
-r 重新导出
-v 详细信息
Nfs服务器需要开机自动启动,因为它并不参与集群,只是提供共享文件,不需要心跳链接来管理。
在三个节点上分别创建mysql用户,使得它们拥有同样的id号,以便能够实现id映射,让三台服务器都对mysql都有操作权限。
# useradd -u 306 -r mysql--------三个节点进行同样操作
在两个节点安装mysql的通用二进制包
详细请看http://qiufengsong.blog.51cto.com/7520243/1284355
数据文件,先不要初始化,只创建/mydata目录,之前的过程请看链接中的步骤。
创建目录/mydata,作为数据目录的挂载点,如果原先该目录下已经有文件,将之全部删除,这种方案因该是针对mysql通用二进制包有效,因为它可以初始化数据文件。
# mkdir /mydata
挂载nfs文件到一个节点,创建data目录,修改data权限并初始化mysql
注意:只需要初始化一次就行了,千万不要再去另一个 节点初始化一次了。
# mount 172.16.5.100:/mysqldata /mydata # cd /mydata # mkdir data # chown -R mysql.mysql data # cd /usr/local/mysql # scripts/mysql_install_db --user=mysql --datadir=/mydata/data # cd /mydata/data # chown -R mysql.mysql *
注意:编辑/etc/my.cnf的时候,数据目录一定要写对datadir=/mydata/data,与上边配置的相同即可。
停止mysqld服务,卸载/mydata,将mysql服务设置为开机默认关闭,因为都要受集群的管理。
继着上面配置的corosync集群往下配置,ip资源不需要了,在配置mysqld资源和nfs资源就ok了
定义nfs资源
# crm configure primitive mystore ocf:heartbeat:Filesystem params device="172.16.5.100:/mysqldata" directory="/mydata" fstype="nfs" op monitor interval=20 timeout=20 on-fail="fence"
定义mysqld资源
# crm configure primitive myserver lsb:mysqld
定义约束
# crm configure colocation myserver-with-mystore inf: myserver mystore两个在一起 # crm configure order mystore-before-myserver mandatory: mystore myserver先后 # crm configure location prefer-node1 mystore500: www.a.com
跟上边配置的ip资源在同一个节点,就能使的所有资源都在同一个节点了。500要与上边配置的webip定义的位置约束是相同的分数,不然集群会自动实现负载均衡,将它们分到不同的节点。高可用所有的资源都是运行在同一个节点上的,这一点必须明确。
查看运行状态
# crm status Last updated: Fri Sep 20 10:50:16 2013 Last change: Fri Sep 20 10:49:29 2013 via cibadmin on www.b.com Stack: classic openais (with plugin) Current DC: www.b.com - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured, 2 expected votes 4 Resources configured. Online: [ www.a.com www.b.com ] webip(ocf::heartbeat:IPaddr):Started www.a.com webserver(lsb:httpd):Started www.a.com mystore(ocf::heartbeat:Filesystem):Started www.a.com myserver(lsb:mysqld):Started www.a.com
我们可以再接着模拟一个节点挂掉|停掉,看资源是否转移,这里就不做演示了。
drbd配置
Drbd 分布式复制块设备,作用:相当于一个镜像磁盘,可以将数据在一定时间内复制到自己的设备中来。
这里只做单主模型的介绍。
单主模型:主节点可以实现数据的读写操作,从节点不能读也不能写。
1、安装服务和工具
# rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm
drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。
目前在用的drbd版本主要有8.0、8.2和8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。各版本的功能和配置等略有差异;我们实验所用的平台为x86且系统为rhel5.8,因此需要同时安装内核模块和管理工具。我们这里选用最新的8.3的版本(drbd83-8.3.8-1.el5.centos.i386.rpm和kmod-drbd83-8.3.8-1.el5.centos.i686.rpm),下载地址为:http://mirrors.sohu.com/centos/5.8/extras/i386/RPMS/。
2、配置/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/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; } } 3、定义一个资源/etc/drbd.d/web.res,内容如下: resource mysql { on www.a.com { device /dev/drbd0; disk /dev/sda5; address 172.16.100.15:7789; meta-disk internal; } on www.b.com { device /dev/drbd0; disk /dev/sda5; address 172.16.100.16:7789; meta-disk internal; } }
4、为节点www.b.com提供配置文件
# scp /etc/drbd.d/* www.b.com:/etc/drbd.d/
5、初始化资源,在两个节点分别执行:
# drbdadm create-md mysql
6、启动服务,在两个节点上分别执行:
# chkconfig --add drbd # service drbd start
这里需要注意,一定要两个节点都启动服务,否则,启动服务的那个节点会一直等待下去。
7、查看启动状态:
# cat /proc/drbd # drbd-overview
8、第一次提升一个节点为主节点
# drbdadm -- --overwrite-data-of-peer primary mysql 或者 # drbdadm primary --force mydata
必须是主节点才可以挂载,不是主节点,必须先升级为主节点,才能挂载。
下列命令可以实现主从节点的切换
# drbdadm primary mysql # drbdadm secondary mysql
再次查看
# drbd-overview 0:web SyncSource Primary/Secondary UpToDate/Inconsistent C r---- [============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35
等数据同步完成以后再次查看状态,可以发现节点已经发生变化,且节点已经有了主次:
# drbd-overview 0:web Connected Primary/Secondary UpToDate/UpToDate C r----
9、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
升为主节点----》格式化-----》挂载
格式化只是在配置drbd时候需要,配置高可用的时候肯定格式化好了,而且已经有了mysql的数据文件
# mke2fs -j -L DRBD /dev/drbd0 # mkdir /mnt/drbd # mount /dev/drbd0 /mnt/drbd
五、corosync和drbd一起实现mysql高可用
1、将之前配置的基于nfs的mysqld高可用中的mysqld资源和mystore资源停止删除
# crm resource stop myserver # crm resource stop mystore # crm configure delete myserver # crm configure delete mystore # crm configure show
node www.a.com node www.b.com primitive webip ocf:heartbeat:IPaddr \ params ip="172.16.5.10" primitive webserver lsb:httpd location prefer-node webip 500: www.a.com colocation webip-with-webserver inf: webip webserver order webip-before-webserver inf: webip webserver property $id="cib-bootstrap-options" \ dc-version="1.1.8-7.el6-394e906" \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes="2" \ stonith-enabled="false" \ no-quarum-policy="ignore" \ last-lrm-refresh="1379645241"
2、启动drbd,测试drbd能否正常工作。
# service drbd start 两个节点中都得启动 # drbdadm primary mysql 提升为主节点 # drbd-overview 0:mysql/0 StandAlone Primary/Unknown UpToDate/DUnknown r-----
# mount /dev/drbd0 /mydata # service mysqld start Starting MySQL.. 【OK】
启动mysqld,若可以正常启动,说明,drbd的设备文件可以正常提供服务。
3、停止服务,并让服务开机默认不能启动
# service mysqld stop # chkconfig mysqld off # service drbd stop # chkconfig drbd off
注意,两个节点都得做。
4、定义资源。
Drbd实现的mysql高可用,与nfs实现的mysql的不同之处在于
1、nfs服务的mysql数据磁盘坏掉了,整个集群就挂了,而drbd相当于给数据做了一个备份,一个挂了,另一个还都能用。
2、drbd服务被定义成了一个资源,而nfs没有
3、drbd是服务启动了,文件系统才能挂载,而nfs恰好相反
相同之处在于
两个服务器节点挂了,另一个节点都可以正常工作,所谓高可用嘛。
定义drbd服务资源
# crm configure primitive mybdrbd ocf:linbit:drbd params drbd_resource=mysql op monitor interval="30s" role="Master" timeout="30s" op monitor interval="40s" role="Slave" timeout="30s" op start timeout=240 op stop timeout=100
定义drbd服务的主节点属性,或者说是主从资源
# crm configure master ms_mydrbd mydrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
定义文件系统资源
# crm configure primitive myfs ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext3"
关于drbd服务的约束
# crm configure colocation myfs-with-ms_mydrbd inf: myfs ms_mydrbd:Master # crm configure order myfs_after-ms_mydrbd inf: ms_mydrbd:promote myfs:start # crm configure location prefer-node1 myfs 500: www.a.com
定义mysqld服务
# crm configure primitive myserver lsb:mysqld
关于mysqld服务的约束
#crm configure colocation myfs-with-myserver inf: myfs myserver #crm configure order myfs-before-myserver inf: myfs myserver #crm configure order webip-with-myserver inf: webip myserver # crm status
Last updated: Fri Sep 20 12:34:32 2013 Last change: Fri Sep 20 12:33:40 2013 via cibadmin on www.a.com Stack: classic openais (with plugin) Current DC: www.b.com - partition with quorum Version: 1.1.8-7.el6-394e906 2 Nodes configured, 2 expected votes 6 Resources configured. Online: [ www.a.com www.b.com ] webip(ocf::heartbeat:IPaddr):Started www.a.com webserver(lsb:httpd):Started www.a.com Master/Slave Set: ms_mydrbd [mydrbd] Masters: [ www.a.com ] Slaves: [ www.b.com ] myfs(ocf::heartbeat:Filesystem):Started www.a.com myserver(lsb:mysqld):Started www.a.com
配置mysql的主从复制
概念不要混淆
mysql的主从复制目的是实现读写分离,drbd是实现高可用,读写分离和高可用是不同的概念,不要混淆,它们可以同时配置,精彩内容,敬请期待,下篇博客。。。