corosync+pacemaker+crmsh+DRBD实现数据库服务器高可用集群构建

 

DRBD (DistributedReplicated Block Device) 是 Linux 平台上的分散式储存系统。其中包含了核心模组,数个使用者空间管理程式及 shell scripts,通常用于高可用性(high availability, HA)丛集。DRBD 类似磁盘阵列的RAID 1(镜像),只不过 RAID 1 是在同一台电脑内,而 DRBD 是透过网络。

DRBD 是以 GPL2 授权散布的自由软件。

实验架构图:


.高可用集群构建的前提条件

1.主机名互相解析,实现主机名通信

[[email protected] ~]# vim /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.31.10 node1.stu31.com node1
172.16.31.11 node2.stu31.com node2

复制一份到node2:

[[email protected] ~]# scp /etc/[email protected]:/etc/hosts

2.节点直接实现ssh无密钥通信

节点1:
[[email protected] ~]# ssh-keygen -t rsa -P""
[[email protected] ~]# ssh-copy-id -i.ssh/id_rsa.pub [email protected]
节点2:
[[email protected] ~]# ssh-keygen -t rsa -P""
[[email protected] ~]# ssh-copy-id -i.ssh/id_rsa.pub [email protected]

测试ssh无密钥通信:

[[email protected] ~]# date ; ssh node1 ‘date‘
Fri Jan 2 12:34:02 CST 2015
Fri Jan 2 12:34:02 CST 2015

时间同步,上面两个节点的时间是一致的!

.DRBD软件的安装

1.获取DRBD软件程序,CentOS6.6的内核版本是2.6.32-504

[[email protected] ~]# uname -r
2.6.32-504.el6.x86_64

DRBD已经合并到linux kernel2.6.33及以后内核版本中,这里直接安装管理工具即可,若内核

版本低于2.6.33时请额外安装DRBD内核模块,且与管理工具版本保持一致。

kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm
drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm

此软件包是经过编译源码而成,我提供下载,根据附件下载即可:

2.安装软件包,节点1和节点2都需要安装

安装时间将持续很长时间:

[[email protected] ~]# rpm -ivhdrbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm kmod-drbd84-
8.4.5-504.1.el6.x86_64.rpm
warning:drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm: Header V4 DSA/SHA1 Signature,
key ID baadae52: NOKEY
Preparing...               ########################################### [100%]
  1:drbd84-utils          ########################################### [ 50%]
  2:kmod-drbd84           ########################################### [100%]
Working. This may take some time ...
Done.

3.各节点准备存储设备

节点1和节点2都需要操作:

[[email protected] ~]#  echo -n -e "n\np\n3\n\n+1G\nw\n"|fdisk /dev/sda  
[[email protected] ~]# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3

.配置DRBD

1.DRBD的配置文件:

[[email protected] ~]# vim /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
 
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

DRBD的所有的控制都是在配置文件/etc/drbd.conf中。通常情况下配置文件包含如下内容:

include"/etc/drbd.d/global_common.conf";

include "/etc/drbd.d/*.res";

通常情况下,/etc/drbd.d/global_common.conf包含global和common的DRBD配置部分,而.res文件都包含一个资源的部分。

在一个单独的drbd.conf文件中配置全部是可以实现的,但是占用的配置很快就会变得混乱,变得难以管理,这也是为什么多文件管理作为首选的原因之一。

无论采用哪种方式,需必须保持在各个集群节点的drbd.conf以及其他的文件完全相同。

2.配置DRBD的全局及通用资源配置文件

[[email protected] drbd.d]# cat global_common.conf
# DRBD is the result of over a decade ofdevelopment by LINBIT.
# In case you need professional servicesfor DRBD or have
# feature requests visithttp://www.linbit.com
 
global {
         #用于统计应用各个版本的信息。当新的版本的drbd被安装就会和http server进行联系
。当然也可以禁用该选项,默认情况下是启用该选项的。
       usage-count no;
       # minor-count dialog-refresh disable-ip-verification
}
 
common {
       handlers {
                # These are EXAMPLE handlersonly.
                # They may have severeimplications,
                # like hard resetting the nodeunder certain circumstances.
                # Be careful when chosing yourpoison.
                #一旦节点发生错误就降级
                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";
                #一旦本地io错误的处理是关机
                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 degr-wfc-timeoutoutdated-wfc-timeout wait-after-sb
       }
 
       options {
                # cpu-maskon-no-data-accessible
       }
 
       disk {
                # size on-io-error fencingdisk-barrier disk-flushes
                   #一旦本地磁盘发生IO错误时的操作:拆除
                on-io-error detach;
                # disk-drain md-flushesresync-rate resync-after al-extents
                # c-plan-ahead c-delay-targetc-fill-target c-max-rate
                # c-min-rate disk-timeout
       }
 
       net {
                # protocol timeoutmax-epoch-size max-buffers unplug-watermark
                #资源配饰使用完全同步复制协议(Protocol C),除非另有明确指定;表示
收到远程主机的写入确认后,则认为写入完成.
                protocol C;
                # connect-int ping-intsndbuf-size rcvbuf-size ko-count
                # allow-two-primariescram-hmac-alg shared-secret after-sb-0pri
                #设置主备机之间通信使用的信息算法.
                cram-hmac-alg "sha1";
                #消息摘要认证密钥
                shared-secret "password";
                # after-sb-1pri after-sb-2prialways-asbp rr-conflict
                # ping-timeoutdata-integrity-alg tcp-cork on-congestion
                # congestion-fillcongestion-extents csums-alg verify-alg
                # use-rle
       }
 
       syncer  {
                #设置主备节点同步时的网络速率最大值,单位是字节.
                rate 1000M;
       }
}

3.定义节点存储资源配置文件

一个DRBD设备(即:/dev/drbdX),叫做一个"资源"。里面包含一个DRBD设备的主备节点的的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。

[[email protected] drbd.d]# vim mystore.res
resource mystore {
       #每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置.
       on node1.stu31.com  {
                device /dev/drbd0;
                disk /dev/sda3;
                #设置DRBD的监听端口,用于与另一台主机通信
                address 172.16.31.10:7789;
                meta-disk internal;
       }
 
       on node2.stu31.com  {
                device /dev/drbd0;
                disk /dev/sda3;
                address 172.16.31.11:7789;
                meta-disk internal;
       }
}

配置完成后复制一份到节点2:

[[email protected] drbd.d]# ls
global_common.conf  mystore.res
[[email protected] drbd.d]# scp *node2:/etc/drbd.d/
global_common.conf                            100% 2105     2.1KB/s  00:00   
mystore.res                                   100%  318    0.3KB/s   00:00

4.创建matadata

在启动DRBD之前,需要分别在两台主机的sda分区上,创建供DRBD记录信息的数据块.分别在两台主机上执行:

[[email protected] drbd.d]# drbdadm create-mdmystore
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfullycreated.
 
[[email protected] ~]# drbdadm create-md mystore
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfullycreated.

5.启动DRBD服务

[[email protected] ~]#  /etc/init.d/drbd start
Starting DRBD resources: [
    create res: mystore
  prepare disk: mystore
   adjust disk: mystore
    adjust net: mystore
]
..........
***************************************************************
 DRBD‘s startup script waits for the peernode(s) to appear.
 - Incase this node was already a degraded cluster before the
   rebootthe timeout is 0 seconds. [degr-wfc-timeout]
 - Ifthe peer was available before the reboot the timeout will
  expire after 0 seconds. [wfc-timeout]
  (These values are for resource ‘mystore‘; 0 sec -> wait forever)
 Toabort waiting enter ‘yes‘ [  21]:
.
[[email protected] ~]#
节点2启动drbd:
[[email protected] ~]# /etc/init.d/drbd start
Starting DRBD resources: [
    create res: mystore
  prepare disk: mystore
   adjust disk: mystore
    adjust net: mystore
]
.

6. 查看DRBD的状态,分别在两台主机上执行

[[email protected] ~]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
GIT-hash:1d360bde0e095d495786eaeb2a1ac76888e4db96 build by [email protected],
2015-01-02 12:06:20
 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:1059216

对输出的含义解释如下:

ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,

ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。

Ns表示网络发送的数据包信息。

Dw是磁盘写信息

Dr是磁盘读信息

7.设置主节点

由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下

node1为主节点

#强制设置主节点

[[email protected] ~]# drbdadm primary --forcemystore

查看同步操作:

[[email protected] ~]# drbd-overview

0:mystore/0 SyncSource Primary/Secondary UpToDate/Inconsistent

[=====>..............] sync‘ed: 32.1% (724368/1059216)K

[[email protected] ~]# watch -n1 ‘cat /proc/drbd‘

完成后查看节点状态:

[[email protected] ~]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
GIT-hash:1d360bde0e095d495786eaeb2a1ac76888e4db96 build by [email protected],
2015-01-02 12:06:20
 0:cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
   ns:1059216 nr:0 dw:0 dr:1059912 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:0

8.格式化存储

[[email protected] ~]# mke2fs -t ext4 /dev/drbd0
挂载到一个目录:
[[email protected] ~]# mount /dev/drbd0 /mnt
复制一个文件到mnt:
[[email protected] ~]# cp /etc/issue /mnt
卸载存储:
[[email protected] ~]# umount /mnt

9.切换主节点为备节点,将node2提升为主节点

节点1设置为备节点:
[[email protected] ~]# drbdadm secondary mystore
[[email protected] ~]# drbd-overview
 0:mystore/0 Connected Secondary/Secondary UpToDate/UpToDate
提升节点2为主节点:
[[email protected] ~]# drbdadm primary mystore
[[email protected] ~]# drbd-overview
 0:mystore/0 Connected Primary/Secondary UpToDate/UpToDate

挂载文件系统,查看文件是否存在:

[[email protected] ~]# mount /dev/drbd0 /mnt

[[email protected] ~]# ls /mnt

issue lost+found

注意:

(1)mount drbd设备以前必须把设备切换到primary状态。

(2)两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态。

(3)处于secondary状态的服务器上不能加载drbd设备。

(4)主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于网络raid 1。

10.将drbd服务关闭,开机自启动关闭:

节点1:
[[email protected] ~]# service drbd stop
Stopping all DRBD resources: .
[[email protected] ~]# chkconfig drbd off
节点2:
[[email protected] ~]# service drbd stop
Stopping all DRBD resources:
.
[[email protected] ~]# chkconfig drbd off

.corosync+pacemaker+drbd实现mariadb高可用集群

1.安装corosync和pacemaker软件包:节点1和节点2都安装

# yum install corosync pacemaker -y

2.创建配置文件并配置

[[email protected] ~]# cd /etc/corosync/
[[email protected] corosync]# cpcorosync.conf.example corosync.conf
[[email protected] corosync]# cat corosync.conf
# Please read the corosync.conf.5 manualpage
compatibility: whitetank
 
totem {
       version: 2
 
       # secauth: Enable mutual node authentication. If you choose to
       # enable this ("on"), then do remember to create a shared
       # secret with "corosync-keygen".
       #开启认证
       secauth: on
 
       threads: 0
 
       # interface: define at least one interface to communicate
       # over. If you define more than one interface stanza, you must
       # also set rrp_mode.
       interface {
                # Rings must be consecutivelynumbered, starting at 0.
                ringnumber: 0
                # This is normally the*network* address of the
                # interface to bind to. Thisensures that you can use
                # identical instances of thisconfiguration file
                # across all your clusternodes, without having to
                # modify this option.
                #定义网络地址
                bindnetaddr: 172.16.31.0
                # However, if you have multiplephysical network
                # interfaces configured for thesame subnet, then the
                # network address alone is notsufficient to identify
                # the interface Corosync shouldbind to. In that case,
                # configure the *host* addressof the interface
                # instead:
                # bindnetaddr: 192.168.1.1
                # When selecting a multicastaddress, consider RFC
                # 2365 (which, among otherthings, specifies that
                # 239.255.x.x addresses areleft to the discretion of
                # the network administrator).Do not reuse multicast
                # addresses across multipleCorosync clusters sharing
                # the same network.
                #定义组播地址
                mcastaddr: 239.224.131.31
                # Corosync uses the port youspecify here for UDP
                # messaging, and also theimmediately preceding
                # port. Thus if you set this to5405, Corosync sends
                # messages over UDP ports 5405and 5404.
                #信息传递端口
                mcastport: 5405
                # Time-to-live for clustercommunication packets. The
                # number of hops (routers) thatthis ring will allow
                # itself to pass. Note thatmulticast routing must be
                # specifically enabled on mostnetwork routers.
                ttl: 1
       }
}
 
logging {
       # Log the source file and line where messages are being
       # generated. When in doubt, leave off. Potentially useful for
       # debugging.
       fileline: off
       # Log to standard error. When in doubt, set to no. Useful when
       # running in the foreground (when invoking "corosync -f")
       to_stderr: no
       # Log to a log file. When set to "no", the "logfile"option
       # must not be set.
       #定义日志记录存放
       to_logfile: yes
       logfile: /var/log/cluster/corosync.log
       # Log to the system log daemon. When in doubt, set to yes.
       #to_syslog: yes
       # Log debug messages (very verbose). When in doubt, leave off.
       debug: off
       # Log messages with time stamps. When in doubt, set to on
       # (unless you are only logging to syslog, where double
       # timestamps can be annoying).
       timestamp: on
       logger_subsys {
                subsys: AMF
               debug: off
       }
}
 
#以插件方式启动pacemaker:
service {
       ver:    0
       name:   pacemaker
}

3.生成认证密钥文件:认证密钥文件需要1024字节,手动写入太麻烦了,我们可以下载程序包来实现写满内存的熵池实现,

[[email protected] corosync]# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from/dev/random.
Press keys on your keyboard to generateentropy.
Press keys on your keyboard to generateentropy (bits = 128).
Press keys on your keyboard to generateentropy (bits = 192).
Press keys on your keyboard to generateentropy (bits = 256).
Press keys on your keyboard to generateentropy (bits = 320).
Press keys on your keyboard to generateentropy (bits = 384).
Press keys on your keyboard to generateentropy (bits = 448).
Press keys on your keyboard to generateentropy (bits = 512).
Press keys on your keyboard to generateentropy (bits = 576).
Press keys on your keyboard to generateentropy (bits = 640).
Press keys on your keyboard to generateentropy (bits = 704).
Press keys on your keyboard to generate entropy(bits = 768).
Press keys on your keyboard to generateentropy (bits = 832).
Press keys on your keyboard to generateentropy (bits = 896).
Press keys on your keyboard to generateentropy (bits = 960).
Writing corosync key to/etc/corosync/authkey.

随便下载神马程序都行!

完成后将配置文件及认证密钥复制一份到节点2:

[[email protected] corosync]# scp authkeycorosync.conf node2:/etc/corosync/
authkey                                      100%  128     0.1KB/s  00:00   
corosync.conf                                 100% 2724     2.7KB/s  00:00

4.启动corosync服务:

[[email protected] corosync]# service corosyncstart
Starting Corosync Cluster Engine(corosync):               [  OK  ]
 
[[email protected] ~]# service corosync start
Starting Corosync Cluster Engine(corosync):               [  OK  ]

5.查看日志:

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

节点1的启动日志:

[[email protected] corosync]# grep -e"Corosync Cluster Engine" -e "configuration file"
/var/log/cluster/corosync.log
Jan 02 14:20:28 corosync [MAIN  ] Corosync Cluster Engine (‘1.4.7‘): startedand
ready to provide service.
Jan 02 14:20:28 corosync [MAIN  ] Successfully read main configuration file
‘/etc/corosync/corosync.conf‘.

节点2的启动日志:

[[email protected] ~]# grep -e "CorosyncCluster Engine" -e "configuration file"
/var/log/cluster/corosync.log
Jan 02 14:20:39 corosync [MAIN  ] Corosync Cluster Engine (‘1.4.7‘): startedand
ready to provide service.
Jan 02 14:20:39 corosync [MAIN  ] Successfully read main configuration file
‘/etc/corosync/corosync.conf‘.

查看关键字TOTEM,初始化成员节点通知是否发出:

[[email protected] corosync]# grep"TOTEM" /var/log/cluster/corosync.log
Jan 02 14:20:28 corosync [TOTEM ]Initializing transport (UDP/IP Multicast).
Jan 02 14:20:28 corosync [TOTEM ]Initializing transmit/receive security:
libtomcrypt SOBER128/SHA1HMAC (mode 0).
Jan 02 14:20:28 corosync [TOTEM ] Thenetwork interface [172.16.31.10] is now up.
Jan 02 14:20:28 corosync [TOTEM ] Aprocessor joined or left the membership and a
new membership was formed.
Jan 02 14:20:37 corosync [TOTEM ] Aprocessor joined or left the membership and a
new membership was formed.

查看监听端口5405是否开启:

[[email protected] ~]# ss -tunl |grep 5405
udp   UNCONN     0      0           172.16.31.10:5405                  *:*    
udp   UNCONN     0      0        239.224.131.31:5405                 *:*

查看错误日志:

[[email protected] ~]# grep ERROR/var/log/cluster/corosync.log
#警告信息:将pacemaker以插件运行的告警,忽略即可
Jan 02 14:20:28 corosync [pcmk  ] ERROR: process_ais_conf: You haveconfigured a
cluster using the Pacemaker plugin for Corosync.The plugin is not supported in this
environment and will be removed very soon.
Jan 02 14:20:28 corosync [pcmk  ] ERROR: process_ais_conf:  Please see Chapter 8 of
‘Clusters from Scratch‘(http://www.clusterlabs.org/doc) for details on using
Pacemaker with CMAN
Jan 02 14:20:52 [6260] node1.stu31.com    pengine:  notice: process_pe_message:    
  Configuration ERRORs found during PE processing.  Please run "crm_verify -L" to
identify issues.
Jan 02 14:20:52 [6260] node1.stu31.com    pengine:  notice: process_pe_message:    
  Configuration ERRORs found during PE processing.  Please run "crm_verify -L" to
identify issues.
[[email protected] ~]# crm_verify -L -V   
#无stonith设备的警告信息,可以忽略            
  error: unpack_resources:    Resource start-up disabled since no STONITH
resources have been defined
  error: unpack_resources:    Either configure some or disable STONITH with the
stonith-enabled option
  error: unpack_resources:     NOTE:Clusters with shared data need STONITH to
ensure data integrity
Errors found during check: config not valid

.集群配置工具安装:crmsh软件安装

1.配置yum源:我这里存在一个完整的yum源服务器

[[email protected] yum.repos.d]# vimcentos6.6.repo
[base]
name=CentOS $releasever $basearch on localserver 172.16.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-$basearch/
gpgcheck=0
 
[extra]
name=CentOS $releasever $basearch extras
baseurl=http://172.16.0.1/centos/$releasever/extras/$basearch/
gpgcheck=0
 
[epel]
name=Fedora EPEL for CentOS$releasever$basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/fedora-epel/$releasever/$basearch/
gpgcheck=0
 
[corosync2]
name=corosync2
baseurl=ftp://172.16.0.1/pub/Sources/6.x86_64/corosync/
gpgcheck=0

复制一份到节点2:

[[email protected] ~]# scp /etc/yum.repos.d/centos6.6.reponode2:/etc/yum.repos.d/
centos6.6.repo                                100%  521    0.5KB/s   00:00

2.安装crmsh软件,2各节点都安装

# yum install -y crmsh
# rpm -qa crmsh
crmsh-2.1-1.6.x86_64

3.去除上面的stonith设备警告错误:

[[email protected] ~]# crm
crm(live)# configure
crm(live)configure# propertystonith-enabled=false
crm(live)configure# verify
#双节点需要仲裁,或者忽略(会造成集群分裂)
crm(live)configure# propertyno-quorum-policy=ignore
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node node1.stu31.com
node node2.stu31.com
property cib-bootstrap-options:        dc-version=1.1.11-97629de        cluster-infrastructure="classic openais (with plugin)"        expected-quorum-votes=2        stonith-enabled=false        no-quorum-policy=ignore

无错误信息输出了:

[[email protected] ~]# crm_verify -L -V
[[email protected] ~]#

.DRBD定义为集群服务

1.按照集群服务的要求,首先确保两个节点上的drbd服务已经停止,且不会随系统启动而自动启动:

[[email protected] ~]# drbd-overview
 0:mystore/0 Unconfigured . .
[[email protected] ~]# chkconfig --list drbd
drbd           0:off   1:off  2:off   3:off   4:off  5:off   6:off

2.配置drbd为集群资源:

提供drbd的RA目前由OCF归类为linbit,其路径为/usr/lib/ocf/resource.d/linbit/drbd。我们可以使用如下命令来查看此RA及RA的meta信息:

[[email protected] ~]# crm ra classes
lsb
ocf / heartbeat linbit pacemaker
service
stonith
[[email protected] ~]# crm ra list ocf linbit
drbd

下面命令可以查看详细信息

[[email protected] ~]# crm ra info ocf:linbit:drbd

输出内容略

drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。

开始定义集群资源:

[[email protected] ~]# crm configure
crm(live)configure# primitive mydrbdocf:linbit:drbd params drbd_resource="mystore"
op monitor role=Slave interval=20stimeout=20s op monitor role=Master interval=10s
timeout=20s op start timeout=240s op stoptimeout=100s
crm(live)configure# verify
将集群资源设置为主从模式:
crm(live)configure# ms ms_mydrbd mydrbdmeta master-max="1" master-node-max="1"
clone-max="2"clone-node-max="1" notify="true"
crm(live)configure# verify
crm(live)configure# show
node node1.stu31.com
node node2.stu31.com
primitive mydrbd ocf:linbit:drbd        params drbd_resource=mystore        op monitor role=Slave interval=20s timeout=20s        op monitor role=Master interval=10s timeout=20s        op start timeout=240s interval=0        op stop timeout=100s interval=0
ms ms_mydrbd mydrbd        meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1notify=true
property cib-bootstrap-options:        dc-version=1.1.11-97629de        cluster-infrastructure="classic openais (with plugin)"        expected-quorum-votes=2        stonith-enabled=false        no-quorum-policy=ignore
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status
Last updated: Sat Jan  3 11:22:54 2015
Last change: Sat Jan  3 11:22:50 2015
Stack: classic openais (with plugin)
Current DC: node1.stu31.com - partitionwith quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
2 Resources configured
 
 
Online: [ node1.stu31.com node2.stu31.com ]
 
 Master/Slave Set: ms_mydrbd [mydrbd]
    Masters: [ node2.stu31.com ]
    Slaves: [ node1.stu31.com ]

#master-max:有几个主资源master-node-max: 1个节点上最多运行的主资源

#clone-max:有几个克隆资源clone-node-max:1个节点上最多运行的克隆资源

#主从资源也是克隆资源的一种的,只不过它有主从关系

查看drbd的主从状态:

[[email protected] ~]# drbd-overview
 0:mystore/0 Connected Secondary/Primary UpToDate/UpToDate
 
[[email protected] ~]# drbd-overview
 0:mystore/0 Connected Primary/Secondary UpToDate/UpToDate

将node2降级成从节点并上线:

[[email protected] ~]# crm node standby
[[email protected] ~]# drbd-overview
 0:mystore/0 Unconfigured . .
[[email protected]ode2 ~]# crm node online
[[email protected] ~]# drbd-overview 
 0:mystore/0  Connected Secondary/Primary UpToDate/UpToDate

那么node1就成为主节点了:

[[email protected] ~]# drbd-overview
 0:mystore/0 Connected Primary/Secondary UpToDate/UpToDate

3.定义DRBD存储自动挂载,主节点在哪里,存储就在哪里,需要定义约束

crm(live)# configure
crm(live)configure# primitive myfsocf:heartbeat:Filesystem params device=/dev/drbd0
directory=/mydata fstype="ext4"op monitor interval=20s timeout=40s op start
timeout=60s op stop timeout=60s
crm(live)configure# verify
#定义协同约束,主节点在哪里启动,存储就跟随主节点
crm(live)configure# colocation myfs_with_ms_mydrbd_masterinf: myfs ms_mydrbd:Master
#定义顺序约束,主角色提升完成后才启动存储
crm(live)configure# orderms_mydrbd_master_before_myfs inf: ms_mydrbd:promote
myfs:start
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status
Last updated: Sat Jan  3 11:34:23 2015
Last change: Sat Jan  3 11:34:12 2015
Stack: classic openais (with plugin)
Current DC: node1.stu31.com - partitionwith quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
3 Resources configured
 
 
Online: [ node1.stu31.com node2.stu31.com ]
 
 Master/Slave Set: ms_mydrbd [mydrbd]
    Masters: [ node1.stu31.com ]
    Slaves: [ node2.stu31.com ]
 myfs  (ocf::heartbeat:Filesystem):   Started node1.stu31.com

可以知道主节点是node1,存储也是挂载在节点1上的。

查看挂载的目录:文件存在,挂载成功

[[email protected] ~]# ls /mydata
issue lost+found

主从资源,文件系统挂载都完成了,下面就开始安装mariadb数据库了!

.安装mariadb数据库

1.初始化安装mariadb必须在主节点进行:

创建用户mysql管理数据库及配置数据存储目录权限为mysql,两个节点都需要创建用户

# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql

获取mariadb的二进制安装包:

mariadb-10.0.10-linux-x86_64.tar.gz

解压至/usr/local目录中:

[[email protected] ~]# tar xfmariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/

创建软链接:

[[email protected] ~]# cd /usr/local
[[email protected] local]# ln -svmariadb-10.0.10-linux-x86_64/ mysql

在挂载的DRBD存储上创建数据库数据存放目录:

# chown -R mysql:mysql /mydata/

进入安装目录:

[[email protected] local]# cd mysql
[[email protected] mysql]# pwd
/usr/local/mysql
[[email protected] mysql]# chown -R root:mysql ./*

初始化安装mariadb:

[[email protected] mysql]#scripts/mysql_install_db --user=mysql --datadir=/mydata/data

安装完成后查看数据存放目录:

[[email protected] mysql]# ls /mydata/data/
aria_log.00000001  ibdata1     ib_logfile1  performance_schema
aria_log_control   ib_logfile0 mysql        test

安装成功!

mariadb配置文件的存放,如果我们希望一个节点的配置文件更改后,备节点同步更新,那么配置文件需要存放在drbd存储上是最合适的!

[[email protected] mysql]# mkdir /mydata/mysql/
[[email protected] mysql]# chown -R mysql:mysql  /mydata/mysql/
[[email protected] mysql]# cp support-files/my-large.cnf /mydata/mysql/my.cnf
[[email protected] mysql]# vim  /mydata/mysql/my.cnf
[mysqld]
port            = 3306
datadir = /mydata/data
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU‘s*2 forthread_concurrency
thread_concurrency = 8
innodb_file_per_table = on
skip_name_resolve = on

在本地创建软链接指向配置文件目录:

[[email protected] ~]# ln -sv /mydata/mysql/etc/mysql
`/etc/mysql‘ -> `/mydata/mysql‘

服务脚本的创建:

[[email protected] mysql]# cpsupport-files/mysql.server /etc/init.d/mysqld
[[email protected] mysql]# chkconfig --add mysqld

启动服务测试:

[[email protected] mysql]# service mysqld start
Starting MySQL.                                           [  OK  ]

登录mysql创建数据库:

[[email protected] mysql]#/usr/local/mysql/bin/mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.10-MariaDB-log MariaDBServer
 
Copyright (c) 2000, 2014, Oracle, SkySQL Aband others.
 
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ toclear the current input statement.
 
MariaDB [(none)]> create databasetestdb;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> \q
Bye

停止mysql服务器:

[[email protected] mysql]# service mysqld stop
Shutting down MySQL..                                      [ OK  ]

2.节点2也要配置mariadb

切换node1为从节点:

[[email protected] ~]# crm node standby
[[email protected] ~]# crm status
Last updated: Sat Jan  3 12:21:38 2015
Last change: Sat Jan  3 12:21:34 2015
Stack: classic openais (with plugin)
Current DC: node1.stu31.com - partitionwith quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
3 Resources configured
 
 
Node node1.stu31.com: standby
Online: [ node2.stu31.com ]
 
 Master/Slave Set: ms_mydrbd [mydrbd]
    Masters: [ node2.stu31.com ]
    Stopped: [ node1.stu31.com ]
 myfs  (ocf::heartbeat:Filesystem):   Started node2.stu31.com

让node1从节点上线:

[[email protected] ~]# crm node online
[[email protected] ~]# crm status
Last updated: Sat Jan  3 12:21:52 2015
Last change: Sat Jan  3 12:21:48 2015
Stack: classic openais (with plugin)
Current DC: node1.stu31.com - partitionwith quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
3 Resources configured
 
 
Online: [ node1.stu31.com node2.stu31.com ]
 
 Master/Slave Set: ms_mydrbd [mydrbd]
    Masters: [ node2.stu31.com ]
    Slaves: [ node1.stu31.com ]
 myfs  (ocf::heartbeat:Filesystem):   Started node2.stu31.com

mariadb程序包解压:

[[email protected] ~]# tar xfmariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local
[[email protected] ~]# cd /usr/local
[[email protected] local]# ln -sv mariadb-10.0.10-linux-x86_64/mysql
`mysql‘ ->`mariadb-10.0.10-linux-x86_64/‘
[[email protected] local]# cd mysql
[[email protected] mysql]# chown -R root:mysql ./*

不需要初始化安装了!

查看节点2的存储挂载完成与否:

[[email protected] local]# ls /mydata/data/
aria_log.00000001  ib_logfile1        mysql-bin.index     testdb
aria_log_control   multi-master.info  mysql-bin.state
ibdata1            mysql              performance_schema
ib_logfile0        mysql-bin.000001   test

成功挂载:

只需要服务脚本了:

[[email protected] mysql]# cpsupport-files/mysql.server /etc/init.d/mysqld
[[email protected] mysql]# chkconfig --add mysqld
[[email protected] mysql]# chkconfig mysqld off

创建软链接将存储的配置文件定位到/etc/下,方便mysql启动:

[[email protected] ~]# ln -sv /mydata/mysql//etc/mysql
`/etc/mysql‘ -> `/mydata/mysql/‘

启动mysqld服务:

[[email protected] ~]# service mysqld start
Starting MySQL...                                         [  OK  ]
[[email protected] ~]# /usr/local/mysql/bin/mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.10-MariaDB-log MariaDBServer
 
Copyright (c) 2000, 2014, Oracle, SkySQL Aband others.
 
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ toclear the current input statement.
 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.04 sec)
 
MariaDB [(none)]> grant all on *.* to‘root‘@‘172.16.%.%‘ identified by ‘oracle‘;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [(none)]> \q
Bye

可以看出数据库是有testdb的!!!

同步过来了!我们授权一下远程客户端可以登录!

两个节点都安装好了mariadb,

.定义mariadb数据库集群服务资源

[[email protected] ~]# crm
crm(live)# configure
#定义数据库集群的VIP
crm(live)configure# primitive myipocf:heartbeat:IPaddr params ip="172.16.31.166" op
monitor interval=10s timeout=20s
crm(live)configure# verify
#定义数据库集群的服务资源mysqld
crm(live)configure# primitive myserverlsb:mysqld op monitor interval=20s
timeout=20s
crm(live)configure# verify
#将资源加入资源组,进行结合资源在一起
crm(live)configure# group myservice myipms_mydrbd:Master myfs myserver
ERROR: myservice refers to missing objectms_mydrbd:Master
INFO: resource references incolocation:myfs_with_ms_mydrbd_master updated
INFO: resource references inorder:ms_mydrbd_master_before_myfs updated
#定义资源顺序约束,启动好myfs资源后再启动myserver资源:
crm(live)configure# ordermyfs_before_myserver inf: myfs:start myserver:start
crm(live)configure# verify
#所有都定义完成后就提交!可能mysql服务启动有点慢,等一下即可!
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status
Last updated: Sat Jan  3 13:42:13 2015
Last change: Sat Jan  3 13:41:48 2015
Stack: classic openais (with plugin)
Current DC: node1.stu31.com - partitionwith quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
5 Resources configured
 
 
Online: [ node1.stu31.com node2.stu31.com ]
 
 Master/Slave Set: ms_mydrbd [mydrbd]
    Masters: [ node2.stu31.com ]
    Slaves: [ node1.stu31.com ]
 Resource Group: myservice
    myip      (ocf::heartbeat:IPaddr):       Started node2.stu31.com
    myfs      (ocf::heartbeat:Filesystem):   Started node2.stu31.com
    myserver   (lsb:mysqld):   Started node2.stu31.com

启动完成后,我们在远程客户端上连接数据库进行测试:

[[email protected] ~]# mysql -h 172.16.31.166 -uroot -poracle
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.5-10.0.10-MariaDB-logMariaDB Server
 
Copyright (c) 2000, 2013, Oracle and/or itsaffiliates. All rights reserved.
 
Oracle is a registered trademark of OracleCorporation and/or its
affiliates. Other names may be trademarksof their respective
owners.
 
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ toclear the current input statement.
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.05 sec)
 
mysql> use testdb
Database changed
mysql> create table t1 (id int);
Query OK, 0 rows affected (0.18 sec)
 
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| t1               |
+------------------+
1 row in set (0.01 sec)
 
mysql> \q
Bye

将节点2切换为备节点,让node1成为主节点:

[[email protected] ~]# crm node standby

输入切换指令后我们监控node1转换成主节点的过程:

查看节点1的集群状态信息:

[[email protected] ~]# crm status
Last updated: Sat Jan  3 13:59:38 2015
Last change: Sat Jan  3 13:48:49 2015
Stack: classic openais (with plugin)
Current DC: node1.stu31.com - partitionwith quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
5 Resources configured
 
 
Node node2.stu31.com: standby
Online: [ node1.stu31.com ]
 
 Master/Slave Set: ms_mydrbd [mydrbd]
    Masters: [ node1.stu31.com ]
    Stopped: [ node2.stu31.com ]
 Resource Group: myservice
    myip      (ocf::heartbeat:IPaddr):       Started node1.stu31.com
    myfs      (ocf::heartbeat:Filesystem):   Started node1.stu31.com
    myserver   (lsb:mysqld):   Started node1.stu31.com

再次远程连接数据库测试:

[[email protected] ~]# mysql -h 172.16.31.166 -uroot -poracle
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.5-10.0.10-MariaDB-logMariaDB Server
 
Copyright (c) 2000, 2013, Oracle and/or itsaffiliates. All rights reserved.
 
Oracle is a registered trademark of OracleCorporation and/or its
affiliates. Other names may be trademarksof their respective
owners.
 
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ toclear the current input statement.
 
mysql> use testdb;
Reading table information for completion oftable and column names
You can turn off this feature to get aquicker startup with -A
 
Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| t1               |
+------------------+
1 row in set (0.00 sec)
 
mysql> \q
Bye

测试成功,同步完成!

至此,corosync+pacemaker+crmsh+DRBD实现数据库服务器高可用性集群的搭建就完成了!!!

时间: 2024-10-12 18:54:16

corosync+pacemaker+crmsh+DRBD实现数据库服务器高可用集群构建的相关文章

heartbeat v1(CRM)+DRBD实现数据库服务器高可用集群搭建

一. 方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自动切换到备机上继续提供服务,当主数据库修复完毕,又将服务切回继续由主mysql提供服务. 二. 方案优缺点 优点:安全性高.稳定性高.可用性高,出现故障自动切换, 缺点:只有一台服务器提供服务,成本相对较高.不方便扩展.可能会发生脑裂. 三. 方案架构图 四.  方案适用场景 本方案适用于数据库访

基于drbd的mariaDB 的高可用集群

Distributed Replicated Block Device(DRBD)是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案. 数据镜像:实时.透明.同步(所有服务器都成功后返回).异步(本地服务器成功后返回) DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃. 在DRBD中,资源是特指某复制的存储设备的所有方面.包括资源名称.DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可

heartbeat 配置两台web服务器高可用集群案例

通过heartbeat 配置两台web服务器高可用集群案例: 拓扑: web1:192.168.0.101 hostname: web1.example.com web2:192.168.0.102 hostname:web2.example.com vip:192.168.0.254 nfs服务器:192.168.0.100(存放web页面) 注意: 1主机名要与uname -n 保持一致 2.web1与web2主机的date时间保持同步 3.web1与web2,ssh双机互信通信 4.关闭i

corosync+pacemaker+mysql+drbd 实现mysql的高可用

corosync corosync的由来是源于一个Openais的项目,是Openais的一个子 项目,可以实现HA心跳信息传输的功能,是众多实现HA集群软件中之一,heartbeat与corosync是流行的Messaging Layer (集群信息层)工具.而corosync是一个新兴的软件,相比Heartbeat这款很老很成熟的软件,corosync与Heartbeat各有优势,博主就不在这里比较之间的优势了,corosync相对于Heartbeat只能说现在比较流行. pacemaker

Corosync+Pacemaker+DRBD实现MariaDB的高可用集群

Corosync简介 Corosync是高可用集群中基础事务层 (Messaging Layer)的一个实现方案与heartbeat的功能类似,主要用来传递集群的事务信息,但是Corosync的功能更加强大,正在逐渐地取代heartbeat.Corosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等. Pacemaker简介 Pacemaker是一个集群资源管理器,从heartbeat v3版本中分裂出来,功能强大.它利用集群事务层提供的组件对各节点进行资源管理及监控

利用heartbeat的ldirectord实现ipvs的高可用集群构建

集群架构拓扑图: 网络规划: 两台LVS server:(两台LVS也可以为用户提供错误页面) node1:172.16.31.10 node2:172.16.31.11 VIP:172.16.31.180 ipvs规则内包含2台Real Server:(后面的RS指的就是后端的web服务器) rs1:172.16.31.13 rs2:172.16.31.14 我们还需要错误页面提供者:我们选择LVS作为sorry server,所有的real server不可用时就指向这个sorry serv

MySQL数据库——MHA高可用集群架构(实战!!!)

MHA 简介 (1)简介 目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. (2)该软件由两部分组成 MHA Manager(管理节点)和MHA Node(数据节点)

部署数据库的高可用集群和性能调优

IP规划角色 IP地址 主机名Master 数据库服务器 192.168.4.51 master51备用 1 master 数据库服务器 192.168.4.52 master52备用 2 master 数据库服务器 192.168.4.53 master53第 1 台 slave 服务器 192.168.4.54 slave54第 2 台 slave 服务器 192.168.4.55 slave55Mha_manager 服务器 192.168.4.56 mgm56VIP 地址 192.168

activitmq+keepalived+nfs 非zk的高可用集群构建

nfs 192.168.10.32 maast 192.168.10.4 savel 192.168.10.31 应对这个需求既要高可用又要消息延迟,只能使用变态方式实现 nfs部署 #yum install nfs-utils rpcbind #vim /etc/exports /data/activemq 192.168.10.31(rw,sync,no_root_squash,no_all_squash) /data/activemq 192.168.10.4(rw,sync,no_roo