配置环境

内核版本: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

corosyncauthkey复制至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

3crm 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配置集群的工作属性,禁用stonithcorosync默认启用了stonith,而当前集群并没有相应的stonith设备


# crm configure property stonith-enabled=false
# crm_verify -L -V可以验证stonith是否可用

crm_verify命令是1.0后的版本的pacemaker提供的基于命令行的集群管理工具;可以在集群中的任何一个节点上执行


9msyqlnfs文件系统在高可用中挂在不到指定的节点,务必检查该节点的mysql用户id号是否与nfs服务器上的mysqlid号一致





三、对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

InfINFINITY 的缩写

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



五、corosyncdrbd一起实现mysql高可用


1、将之前配置的基于nfsmysqld高可用中的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的不同之处在于


1nfs服务的mysql数据磁盘坏掉了,整个集群就挂了,而drbd相当于给数据做了一个备份,一个挂了,另一个还都能用。


2drbd服务被定义成了一个资源,而nfs没有


3drbd是服务启动了,文件系统才能挂载,而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是实现高可用,读写分离和高可用是不同的概念,不要混淆,它们可以同时配置,精彩内容,敬请期待,下篇博客。。。