一、搭建环境
2台虚拟机
操作系统centos6.3
二、ip地址规划
node1 172.30.82.45
node2 172.30.82.58
VIP 172.30.82.61
三、注意:
1、设置各个节点间的时间同步,ntpdate 172.30.82.254 &>/dev/null
2、基于hosts文件实现能够互相用主机名访问,修改/etc/hosts文件
172.30.82.45node1
172.30.82.58node2
node1上执行:
ssh-keygen -t rsa -P ""
ssh-copy-id -i ~/.ssh/id_rsa.pub node2
node2上执行:
ssh-keygen -t rsa -P ""
ssh-copy-id -i ~/.ssh/id_rsa.pub node1
3、确保uname -n结果与主机名相同
4、清空iptatables规则
iptabesl -L;chkconfig iptabels off
5、关闭selinux,setenfroce 0
四、安装相关软件
yum update -y pssh-2.3.1-4.1.x86_64.rpm crmsh-2.1-1.6.x86_64.rpm python-pssh-2.3.1-4.1.x86_64.rpm下载地址 http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/ yum install corosync pacemaker –y yum install -y python-dateutil python-lxml redhat-rpm-config cluster-glue cluster-glue-libs resource-agents yum --nogpgcheck localinstall pssh-2.3.1-4.1.x86_64.rpm crmsh-2.1-1.6.x86_64.rpm python-pssh-2.3.1-4.1.x86_64.rpm rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm ssh node2 'rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm' ssh node2 'yum update -y' yum install drbd84-utils kmod-drbd84 -y ssh node2 'yum install drbd84-utils kmod-drbd84 -y' modprobe drbd ssh node2 'modprobe drbd'
五、修改配置文件
1、拷贝配置文件
cp /etc/corosync.conf.example /etc/corosync.conf
2、生成autokeys文件
corosync-keygen
3、修改corosync.conf
totem { version: 2 secauth: off #是否开启秘钥认证 threads: 0 #发送集群节点认证信息使用的进程数 interface { ringnumber: 0 #为避免冗余环路设定的所在的网络接口 bindnetaddr: 172.30.82.0 #集群所在网络 mcastaddr: 239.238.16.1 #集群通告组播地址 mcastport: 5405 #服务端口 ttl: 1 } } logging { fileline: off #日志是否打印行号 to_stderr: no #是否输出标准错误(到显示器) to_logfile: yes #定义日志 logfile: /var/log/corosync.log to_syslog: no #是否开启系统日志 debug: off timestamp: on logger_subsys { subsys: AMF debug: off } } service { #服务启动时启动pacemaker ver: 0 name: pacemaker }
修改drbd配置文件
drbd有3个配置文件/etc/drbd.conf主配置文件,主配置文件包含了
/etc/drbd.d/global_common.conf,drdb启动配置文件
/etc/drbd.d/mydrdb.res(此文件需自己创建),drdb资源配置文件
/etc/drbd.d/global_common.conf #global配置段 global { usage-count no; #装机量统计 } #common配置段,该配置段不是必须的,但可以用来设定多个resource共有的选项,以减少重复性工作。该配置段中又包含如下配置段:disk、net、startup、syncer和handlers common { protocol C; #为保证数据同步安全drbd有3种协议 #protocol A 异步复制协议,数据写入本地磁盘,且拷贝数据进入本地tcp缓存区,认为主节点的本地操作完成,这种模式,在发生强制故障转移的时候可能发生数据丢失的现象。协议A常用在长距离复制环境中。当它和DRBD代理结合使用的时候,它成为一个有效的灾难恢复解决方案。 #protocol B 内存同步复制协议,本地磁盘写入完成,且拷贝数据到达对等节点的内存缓存区,认为主节点本地写操作完成。如果节点同时停电,主节点的数据存储将发生不可逆的损坏,大部分最近在主节点中写入完成的数据可能会丢失。 #protocol C #同步复制协议,只有当本地磁盘和远程磁盘都确认写入完成时,就认为在主节点的本地写操作完成。结果,即使一个节点崩溃,也不会丢失任何数据。唯一丢失数据的可能是两个节点同时崩溃。 handlers { pri-on-incon-degr "/usr/local/drbd/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/local/drbd/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/local/drbdlib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; } startup { } options { } #disk配置段,该配置段用来精细地调节drbd底层存储的属性,这是一个非常重要的配置段,如果底层设备(磁盘)发生了错误或损坏,该配置段将按照设定的策略发生作用 #detach:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作。在diskless mode下,只要还有网络连接,drbd将从secondarynode读写数据,而不需要failover, 该策略导致一定的损失,但好处也很明显,drbd服务不会中断。官方推荐和默认策略 disk { on-io-error detach; } net { cram-hmac-alg "sha1"; 数据同步家吗 shared-secret "lskdjflsf"; 加密密码 } #syncer配置段,该配置段用来更加精细地调节服务的同步进程 #rate:设置同步时的速率,所谓有效可用带宽,是指网络带宽和磁盘读写速度中的最小者,官方提示速率的设定,最好设为有效可用带宽的30% syncer { rate 1000M; } } /etc/drbd.d/mydrbd.res 配置文件说明 resource mydrbd { 定义资源名 on node1 { device /dev/drbd1; #node1节点上drdb设备为/dev/drbd1,我的理解,这是drdb用来截获内存缓存数据的虚拟设备 disk /dev/magevg/magelv; #lvm磁盘设备 address 172.30.82.45:7789; #drbd运行地址及端口 meta-disk internal; #元数据是否卸载本地 } on node2 { device /dev/drbd1; disk /dev/magevg/magelv; address 172.30.82.58:7789; meta-disk internal; } }
配置完成后将corosync 及drbd的配置文件拷贝到另一节点
scp /etc/{corosync.conf,corosync-keygen} node2:/etc/ scp /etc/drbd.d/{global_common.conf,mydrdb.res} node2:/etc/drbd.d
六、启动服务并测试
a、drbd服务启动及测试
1)在node1,node2上分别创建lvm磁盘设备
fdisk /dev/sdb1 n p 1 +500M t 8e w /dev/sdb2 同上 pvcreate /dev/sdb{1,2} vgcreate -s 16M magevg /dev/sdb{1,2} pvcreate -L 992M -n magelv magevg
2)初始化资源,启动服务,在Node1和Node2上分别执行:
# drbdadm create-md mydrdb /etc/init.d/drbd start
3)查看启动状态:
[root@node1]# cat /proc/drbd version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2015-05-27 23:04:23 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1060184
两个节点都是 Secondary/Secondary 状态
也可以通过如下命令查看drbd状态
[root@node1 sbin]# drbd-overview 0:mydrbd/0 Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
4)将node1节点设置为Primary,执行如下命令:
[root@node1 sbin]# drbdadm -- --overwrite-data-of-peer primary mydrbd
查看状态,可以发现数据同步过程开始
[root@node1 sbin]# drbd-overview 0:mydrbd/0 SyncSource Primary/Secondary UpToDate/Inconsistent C r---n- [====>...............] sync'ed: 26.3% (782680/1060184)K
数据同步完成
[root@node1 sbin]# drbd-overview 0:web Connected Primary/Secondary UpToDate/UpToDate C r---- drbd 处于主从状态Primary/Secondary
5)创建文件系统:
文件系统只能在primary节点上挂载,因此只能在主节点上对drbd设备格式化
mkfs -t ext4 /dev/drbd1 mkdir /mnt/drbd mount /dev/drbd1 /mnt/drbd
在drbd设备上新建测试文件
touch /mnt/drbd/{a,b,c}
6)切换primary和secondary节点
对pri/sec模型的drbd,在某一时刻只能由一个节点为primary,因此要切换两个节点角色,只能将原来的primary节点设置为secondary后,才能将原来的secondary节点设置为primary:
umount /mnt/drbd drbdadm secondary mydrbd
主节点上查看drbd状态:
[root@node1 ~]# drbd-overview 0:mydrbd/0 Connected Secondary/Secondary UpToDate/UpToDate C r-----
从节点上查看drbd状态:
[root@node2 ~]# drbd-overview 0:mydrbd/0 Connected Secondary/Secondary UpToDate/UpToDate C r-----
让从节点成为主节点,drbd8.4第一次设置某节点成为主节点的命令:
[root@node2 var]# drbdadm primary --force mydrbd
若不是第一次将从节点设为主节点可以使用如下命令:
drbdadm primary mydrbd mount /dev/drbd1 /mnt/drbd
查看挂载设备文件
[root@node2 drbd]# ll /mnt/drbd -rw-r--r-- 1 root root 0 6? 4 16:20 a -rw-r--r-- 1 root root 0 6? 4 16:20 b -rw-r--r-- 1 root root 0 6? 4 16:20 c
DRBD启动测试已经完成
卸载文件系统,降级node2到secondary状态,为高可用准备
umount /mnt/drbd [root@node2 sbin]# drbdadm secondary mydrbd
在node1,node2上分别执行
chkconfig drbd off
b、corosync 启动测试
1)在node1上执行
service corosync start ssh node2 'service corosync start'
注意:启动node2需要在node1上使用如上命令进行,不要在node2节点上直接启动;
查看corosync引擎是否正常启动
[root@node1 corosync]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/corosync.log May 19 23:11:05 corosync [MAIN ] Corosync Cluster Engine exiting with status 0 at main.c:2055. May 19 23:11:46 corosync [MAIN ] Corosync Cluster Engine ('1.4.7'): started and ready to provide service. May 19 23:11:46 corosync [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'
查看初始化成员节点通知是否正常发出:
[root@node1 corosync]# grep TOTEM /var/log/corosync.log May 19 19:59:44 corosync [TOTEM ] Initializing transport (UDP/IP Multicast). May 19 19:59:44 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0). May 19 19:59:44 corosync [TOTEM ] The network interface [172.30.82.45] is now up. May 19 19:59:44 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
检查启动过程中是否有错误产生:
[root@node1 corosync]# # grep ERROR: /var/log/corosync.log
查看pacemaker是否正常启动:
May 19 23:11:46 corosync [pcmk ] info: pcmk_startup: CRM: Initialized May 19 23:11:46 corosync [pcmk ] Logging: Initialized pcmk_startup May 19 23:11:46 corosync [pcmk ] info: pcmk_startup: Maximum core file size is: 18446744073709551615 May 19 23:11:46 corosync [pcmk ] info: pcmk_startup: Service: 9 May 19 23:11:46 corosync [pcmk ] info: pcmk_startup: Local hostname: node1
使用如下命令查看集群节点的启动状态:
[root@node1 corosync]# crm status Last updated: Wed May 20 00:10:38 2015 Last change: Tue May 19 22:49:50 2015 Stack: classic openais (with plugin) Current DC: node1 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 2 Resources configured Online: [ node1 node2 ]
七、安装mysql数据库到/mnt/drdb下,在node1、node2上执行,注意配置文件的一致性
tar -zxvf mysql-5.1.41.tar.gz cd mysql-5.1.41 ./configure --prefix=/mnt/drbd/mysqld make && make install cp /mnt/drbd/mysqld/share/mysql/my-huge.cnf /etc/my.cnf useradd -s /sbin/nologin mysql /mnt/drbd/mysqld/bin/mysql_install_db --basedir=/mnt/drbd/mysqld --datadir=/mnt/drbd/mysqld/data --user=mysql chown -R mysql.root /mnt/drbd/mysqld scp /mnt/drbd/mysqld/share/mysql/mysql.server /etc/init.d chkconfig --add mysqld chkconfig mysqld off
八、集群资源配置
crm(live)configure# property stonith-enabled=false 定义不启用stonith设备 crm(live)configure# property no-quorum=ignore 当一台高可用服务不可用,集群的默认的仲裁机制为ignore(集群是2台服务器的必须使用此选项) crm(live)configure# rsc_defaults resource-stickiness=100 定义默认的资源粘性 crm(live)configure#primitive mysqldrbd ocf:linbit:drbd params drbd_resource=mydrbd op start timeout=240 op stop timeout=100 op monitor role=node1 interval=20 timeout=30 op monitor role=node2 interval=30 timeout=30 说明:mysqldrbd 定义一个集群资源,集群资源的代理是ocf下linbit提供的drbd服务,drbd服务要提供本身的资源mydrbd,资源名定义为drbd_resource,op是对drbd的一些动作、监控的时间限定,role指定了资源的所在主机的角色 定义drbd的高可用,首先定义drbd为基本资源,之后定义drbd为克隆的主从资源 注意:这里只有linbit没有beartbeat,corosync1.4以前的版本有heartbeat crm(live)configure#ms ms_mysqldrbd mysqldrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true 说明:ms定义mysqldrbd为主从资源,资源名为ms_mysqldrbd,主从资源一定是克隆类型的,meta对克隆资源的限定 master-max=1 最多个克隆资源被提升为主资源状态(只能由一个克隆资源被提升为主资源) master-node-max=1 运行主资源的有几个节点(运行主资源的必须只有一个节点) clone-max=2 一个资源克隆了几份,集群有几个节点就克隆几份 clone-node-max=1 每个节点最多可以运行几个克隆资源 notify=ture 发生故障是否向管理员发起通告 crm(live)configure# primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd1 directory=/mnt/drbd fstype=ext4 op start timeout=60 op stop timeout=60 定义集群文件系统的存储资源,通过ocf下heartbeat下的Filesystem代理,params指定文件系统的参数,device要挂载的硬件,directory挂载目录,op挂载时间超时设置 crm(live)configure# colocation mystore_with_ms_mysqldrbd inf: mystore ms_mysqldrbd:node1 colocation排列约束指定资源之间的粘合,约束名为mystore_with_ms_mysqldrbd(可以随便起名) inf: 资源约束分数为正无穷,永远在一起 mystore 与 ms_mysqldrbd 在一起,ms_mysqldrbd 为参照的对象(也就是说它是主体) crm(live)configure# order mystore_after_ms_mysqldrbd mandatory: ms_mysqldrbd:promote mystore:start order 定义资源的启动顺序名mystore_after_ms_mysqldrbd mandatory: 强制启动顺序 ms_mysqldrbd:promote 先启动 mystore:start 后启动 crm(live)configure# primitive mysqld lsb:mysqld 定义数据库服务资源 crm(live)configure#colocation mysqld_with_mystore inf: mysqld mystore 定义数据库资源约束,数据库服务要与文件系统在一起 crm(live)configure#order mysqd_after_mystore Mandatory: mystore mysqld 数据库运行在文件系统之后 约束关系可以通过xml文件分析查看 crm(live)configure#show xml crm(live)configure#primitive params ip=172.30.82.42 nic=eth0 cidr_netmask=255.255.255.0 定义一个虚拟ip集群资源 crm(live)configure#crm(live)configure#colocation myip_with_ms_mysqldrdb inf: ms_mysqldrbd:Master myip 定义虚拟ip要与主资源运行在一起
九、资源自动切换
node1上执行 [root@node1 mysql]# crm status Last updated: Thu Jun 4 17:02:13 2015 Last change: Thu Jun 4 16:19:45 2015 Stack: classic openais (with plugin) Current DC: node1 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 5 Resources configured Online: [ node1 node2] Master/Slave Set: ms_mysqldrbd [mysqldrbd] Masters: [ node1 ] Stopped: [ node2 ] mystore (ocf::heartbeat:Filesystem): Started node1 mysqld (lsb:mysqld): Started node1 myip (ocf::heartbeat:IPaddr): Started node1
测试是否可以连接数据库
mysql -uroot -h172.30.82.61 show databases;
切换节点:
[root@node1 mysql]# crm node standby [root@node2 drbd]# crm status Last updated: Thu Jun 4 17:09:03 2015 Last change: Thu Jun 4 17:08:58 2015 Stack: classic openais (with plugin) Current DC: node1 - partition with quorum Version: 1.1.11-97629de 2 Nodes configured, 2 expected votes 5 Resources configured Node node1: standby Online: [ node2 ] Master/Slave Set: ms_mysqldrbd [mysqldrbd] Masters: [ node2 ] Stopped: [ node1 ] mystore (ocf::heartbeat:Filesystem): Started node2 mysqld (lsb:mysqld): Started node2 myip (ocf::heartbeat:IPaddr): Started node2
测试是否可以连接数据库
mysql -uroot -h172.30.82.61 show databases;
申明,学了马哥教育视频最终完成了这篇博客,因为环境不同所以在软件安装及配置上遇到了很多麻烦,感悟是看会了与做对了差距不是一点点