一、构建节点


#vim /etc/hosts


保证每个节点都是下面的内容:


172.16.4.5no1.corosql.com no1


172.16.4.6no2.corosql.com no2


配置各个节点对应的主机名:


No1:


#vim /etc/sysconfig/network


NETWORKING=yes


HOSTNAME=no1.corosql.com


No2:


#vim /etc/sysconfig/network


NETWORKING=yes


HOSTNAME=no2.corosql.com


配置完成后可以验证一下是否和当前主机名相同


#uname -n


接着建立双机互信


No1:


# ssh-keygen -t rsa


# ssh-copy-id -i ~/.ssh/id_rsa.pub root@no2.cpmysql.com


No2:


# ssh-keygen -t rsa


# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]




还要保证时间同步,可以在每个节点执行下面命令:


#crontab -e


*/3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null


表示每3分钟自动和172.16.0.1主机同步时间



查看时间是否同步(在no1主机上)


#ssh no2 ‘date’;date



二、安装与配置Corosync


crmsh-1.2.6-4.el6.x86_64.rpmpssh-2.3.1-2.el6.x86_64.rpm



1、在两个节点都要安装Corosync


#yum install -y corosync


2、配置文件


#cd /etc/corosync


#cp corosync.conf.example corosync.conf


#vim corosync.conf


找到并修改bindnetaddr的值


secauth: on #启用安全认证功能


bindnetaddr: 172.16.0.0 #通过哪个网段进行通信


mcastaddr: 226.94.111.111 #多播地址(实验时相互影响的时候调整)


然后添加下面的内容


service {


ver:0


name:pacemaker


}


aisexec{


user: root


group: root


}


3、生成节点之间通信时用到的密钥


#corosync-keygen


配置两个节点有相同的配置文件和认证秘钥


#scp -p corosync.conf authkey no2:/etc/corosync/


4、每个节点都要创建集群日志以确保corosync的顺利启动


# mkdir /var/log/cluster


5、关闭两个节点的NetworkManager并且禁止自动启动,打开Network


#chkconfig NetworkManager off


#service NetworkManager stop


#service network start


查看是否开启


#chkconfig --list network



三、安装配置Pacemakercrmsh


安装 (每个节点分别安装)


crmsh官方网站


https://savannah.nongnu.org/forum/forum.php?forum_id=7672


crmsh下载地址


http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/



#yum install -y pacemaker


RHEL自6.4起不再提供集群的命令行配置工具crmsh,转而使用pcs;如果你习惯了使用crm命令,可下载相关的程序包自行安装即可。crmsh依赖于pssh,因此需要一并下载。


# wgetftp://195.220.108.108/linux/opensuse/factory/repo/oss/suse/x86_64/crmsh-1.2.6-0.rc2.1.1.x86_64.rpm


# wget ftp://195.220.108.108/linux/opensuse/factory/repo/oss/suse/noarch/pssh-2.3.1-6.1.noarch.rpm



# yum -y --nogpgcheck localinstall crmsh*.rpm pssh*.rpm



四、启动corosync



# /etc/init.d/corosync start


或者


#service corosync start


启动成功后接着在节点1启动节点2


# ssh no2 "/etc/init.d/corosync start"



查看corosync引擎是否正常启动:


# grep -e "Corosync Cluster Engine" -e "configuration file"/var/log/cluster/corosync.log



查看初始化成员节点通知是否正常发出:


# grep TOTEM /var/log/cluster/corosync.log


检查启动过程中是否有错误产生。下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。


# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources



查看pacemaker是否正常启动:


# grep pcmk_startup /var/log/cluster/corosync.log


启动node2上的corosync


# ssh node2 -- /etc/init.d/corosync start



查看node1上的相关日志。


# tail /var/log/cluster/corosync.log


如果安装了crmsh,可使用如下命令查看集群节点的启动状态:


# crm status



执行ps auxf命令可以查看corosync启动的各相关进程。


corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令验正:


# crm_verify -L -V



禁用stonith:


# crm configure property stonith-enabled=false


使用如下命令查看当前的配置信息:


# crm configure show


node no.magedu.com


node no2.magedu.com


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" #stonith已经被禁用



查看当前集群系统所支持的类型:



# crm ra classes



查看某种类别下的所用资源代理的列表,


# crm ra list lsb


# crm ra list ocf heartbeat


# crm ra list ocf pacemaker


# crm ra list stonith



五、DRBD 安装与配置



1、drbd-8.4.3-33.el6.x86_64.rpm


drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm


在两个节点分别安装这两个包


# wget ftp://195.220.108.108/linux/atrpms/el6-x86_64/atrpms/stable/drbd-8.4.3-33.el6.x86_64.rpm


# wget ftp://195.220.108.108/linux/atrpms/el6-x86_64/atrpms/stable/drbd-kmdl-2.6.32-358.6.2.el6-8.4.3-33.el6.x86_64.rpm



# rpm -vih drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm


分别在两个节点创建相同大小为5G的分区(注:分区不要太大)


#fdisk /dev/sda


2、配置


# vim /etc/drbd.d/global_common.conf


**********************************************************************************


global {


usage-count no; #不参加让linbit公司收集目前drbd的使用情况


# minor-count dialog-refresh disable-ip-verification


}


common {


protocol C;


handlers {


# These are EXAMPLE handlers only.


# They may have severe implications,


# like hard resetting the node under certain circumstances.


# Be careful when chosing your poison.



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 {


# fencing resource-only



on-io-error detach;#分离同步错误


}



net {


# protocol timeout max-epoch-size max-buffers unplug-watermark


# connect-int ping-int sndbuf-size rcvbuf-size ko-count


# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri


# after-sb-1pri after-sb-2pri always-asbp rr-conflict


# ping-timeout data-integrity-alg tcp-cork on-congestion


# congestion-fill congestion-extents csums-alg verify-alg


# use-rle


cram-hmac-alg "sha1"; #设置加密算法sha1


shared-secret "mydrbdlab"; #设置加密key



}


syncer {


rate 1000M; #传输速率


}


}


**********************************************************************************


3、定义一个资源/etc/drbd.d/web.res,内容如下:


resource web {


on no1 {


device /dev/drbd0;


disk /dev/sda3;


address 172.16.4.5:7789;


meta-disk internal;


}


on no2 {


device /dev/drbd0;


disk /dev/sda3;


address 172.16.4.6:7789;


meta-disk internal;


}


}


同步配置的文件至另外一个节点。


#cd /etc/drbd.d/


# scp global_common.confweb.res node2:/etcdrbd.d/



4、分别初始化两个节点已定义的资源


# drbdadm create-md drbd


#ssh drbd2 "drbdadm create-md drbd"


5、分别在两个节点上启动服务:


#service drbd start



查看一下状态


# drbd-overview


# cat /proc/drbd



在要设置为Primary的节点上使用如下命令来设置主节点:


# drbdadm -- --overwrite-data-of-peer primary drbd


# drbdadm primary --force drbd



6、同步完成后,在主节点格式化挂载


#mkdir /mydata


# mke2fs -t ext4 /dev/drbd0


# mount /dev/drbd0 /mydata/


#cd /mydata


# ls


lost+found



7、测试验证一下:


# cp /etc/fstab ./


# vim fstab


做一些操作,我们把下面一行删除


proc /proc proc defaults 0 0


# cd


# umount /mnt


将主节点降级


# drbdadm secondary web



将另外的节点进行升级


# drbdadm primary web


挂载后查看文件是否变化


# mount /dev/drbd0 /mnt


# cd /mnt


# vim fstab



发现我们删除的行不再显示,说明看到的是同一个文件


到这里,drbd配置完成。



六、MySQL 安装与配置


安装Mysql


mysql-5.5.33-linux2.6-x86_64.tar.gz



参考前面博客http://qidian510.blog.51cto.com/7319882/1282064


1、在两个节点上分别操作


安装mysql


#useradd -r -u 335 mysql


#tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/


#cd /usr/local/


#ln -sv mysql-5.5.33-linux2.6-x86_64 mysql


#chown -R root:mysql /usr/local/mysql/*

#cd /mydata/

#mkdir data

#chown -R mysql.mysql /mydata/data/

#cd /usr/localmysql


#scripts/mysql_install_db --user=mysql --datadir=/mytada/data


#cp support-files/mysql.server /etc/rc.d/init.d/mysqld


#chkconfig --add mysqld


#cp support-files/my-large.cnf /etc/my.cnf


2、然后编辑配置文件


找到相关设置进行修改操作


thread_concurrency = 4并发核心数, 如果物理核心为2,这里就可以填写4


datadir = /mydata/data


innodb_file_per_table = 1 每表一个表空间


# vim /etc/profile.d/mysql.sh


export PATH=/usr/local/mysql/bin:$PATH


# . /etc/profile.d/mysql.sh


4、启动服务


#service mysqld start


我们配置的主节点在no上,将/dev/drbd1挂载到/mydata/data目录下,连接到mysql查看以前创建的数据存在即可


#mount /dev/drbd0 /mydata/data


停止mysqld并且不让它们开机自动启动


#chkconfig mysqld off


#service mysqld stop


查看默认启动状态


#chkconfig mysqld --list


5、将node2节点上的DRBD设置为主节点并挂载测试



# umount /mydata/


#drbdadm secondary web#将no节点降级


#drbd-overview


#drbdadm primary web#将no2节点升级


#drbd-overview


no2节点操作


#mount /dev/drbd0 /mydata/


#service mysqld start


查看数据是否完整



将两个节点的mysql和drbd都停掉并设定开机不会自动启动


#service mysqld stop


#chkconfig mysqld off


#chkconfig mysqld --list



#service drbd stop


#chkconfig drbd off


#chkconfig drbd --list



七、实现mysql高可用性


1、首先确保两个节点的corosync开启


#service corosync start


查看状态


#crm status


2、定义集群属性


# crm configure


# property stonith-enabled=false #禁止使用stonith


# property no-quorum-policy=ignore#表示对于只有两节点的集群失去了quorum集群服务仍然能够正常运行


# verify #验证是否有错误


# commit #提交定义的内容


3、定义drbd资源


# primitive my_drbd ocf:linbit:drbd params drbd_resource=drbdop monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20 op start timeout=240 op stop timeout=100


上面定义的资源意义:


drbd_resource #资源名称


Start timeout #启动服务的超时时长


stop timeout#关闭服务的超时时长


# master ms_my_drbd my_drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="ture"


master#表示定义主资源


ms_my_drbd #主资源的名称


meta #定义额外的属性


master-max #一个集群上最多运行几个主资源


master-node-max#表示一个节点最多运行几个主资源


clone-max#定义一个群集上最多运行几个clone资源


clone-node-max#表示一个节点上最多运行几个clone资源


notify用于定义当出现故障时,是否通知对方,默认就是ture


# verify


# commit


4、试当节点切换时资源drbd可以实现主从切换(家目录下操作)


# crm node standby #将当前的节点切换成被动节点


# crm node online #让节点上线


# drbd-overview #查看节点以及资源当前的状态



5、定义Filsystem,必须要和drbd的主节点运行在一起,用来挂载数据


# primitive mystore ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext4" op monitor interval=40 timeout=40 op start timeout=60 op stop timeout=60


my_fs#表示资源名称


Inf #表示my_fsms_my_drbd在一起的意愿是百分百


Order #定义哪个资源先运行


# colocation mystore_on_ms_my_drbd inf: mystore ms_my_drbd:Master


# order mystore_after_ms_my_drbd mandatory: ms_my_drbd:start mystore:start


#verify


#commit


6、定义IP资源


# primitive my_ip ocf:heartbeat:IPaddr2 params ip="172.16.4.10" op monitor interval=20 timeout=20 on-fail=restart


#verify



7、将MySQL服务定义成资源


# primitive myserver lsb:mysqld op monitor interval=20 timeout=20 on-fail=restart


# colocation myserver_with_mystore_with_my_ip inf:myserver mystore my_ip



# order mystore_before_myserver inf: mystore:start myserver:start


#mystore先于myserver启动


#order myserver_before_my_ip inf: myserver:start my_ip:start


#myserver先于my_ip启动


#verify


#commit



8、定义完成后进行测试


首先连接到mysql进行用户授权


mysql> grant all on *.* to root@"172.16.%.%" identified by "mypass";


mysql> flush privileges;



在另外的主机上进行测试,我们以172.16.4.11为例,先确保安装mysql客户端


#yum -y install mysql


#mysql -uroot -pmypass -h 172.16.4.11



mysql> show databases;


模拟故障(在no节点上):


# crm node standby


no2上访问数据库,可以访问就表示我们测试成功了