Linux集群之corosync+pacemaker+drbd实现MySQL高可用

 

一、drbd简介

  drbd即Distributed Replicated Block Device(分布式磁盘块设备),drbd一个基于软件实现的,不共享任何东西,通过复制的方式在存储之间构建所谓镜像模式机制的磁盘,从而使得一个数据可以存储为多份, drbd的核心功能是在内核中实现。

 

二、drbd原理

wKioL1Vuyx3y1GSyAAzluG3wNgU194.bmp

  每一个主机都提供一个块设备,块的大小是一模一样的,当主机上的进程需要存储数据时,需要向内核申请,任何用户空间的进程都没有直接操作硬件的权限,事实上驱动磁盘是在内核靠驱动程序来实现的,任何一个进程存储数据,都是通过发起系统调用来实现的(这就是IO),对于drbd来讲,它就是在内核中把系统调用与驱动程序之间添加了一个新的层次,在另外一个节点也是一模一样的;当进程需要存储数据时,存储请求发给内核,内核中有一个层,在接受请求以后,本来应该是通过调度器交由驱动程序往磁盘中写数据的,但这时它经由drbd层,drbd不对此数据做任何修改,它只是把数据复制一份副本,完成兵分两路,即drbd将一份数据送往磁盘驱动,由磁盘驱动来完成本地的存储,另一个份将送往本地的网卡,通过网卡发往对端节点,对端节点接收到数据之后,它知道是drbd通信的,由此就送往drbd模块,drbd收到以后,把数据送往驱动程序,驱动程序完成对磁盘的操作。

  它不能两边同时的写数据,通常情况下一个为主的,一个为从的,进程也只能运行在一个节点上,完成读写操作;当一个节点出现故障时,可以把另一个节点提升为主节点,同样的可以提供服务,但此时不能往另一个节点同步数据,如果当另一个节点上线时,新上线的只能做为从节点,来完成数据的同步;

  如果要想让两个节点同时工作的话,只有构建成高可用集群,使用分布式集群系统,两个节点互为主/主,即为互备;

 

三、架构布置

服务器:CentOS 6.6 x86_64;

数据库IP地址即VIP:172.16.9.100;

两个节点分别是:node-02、node-03;相应的IP地址分别为:172.16.9.82,172.16.9.83;

网关服务器:提供时间服务器,网关地址为:172.16.0.1

MySQL版本:mariadb-5.5.43-linux-x86_64.tar.gz

corosync版本:corosync-1.4.7-1.el6.x86_64

pacemaker版本:pacemaker-1.1.12-4.el6.x86_64

crmsh版本:crmsh-2.1-1.6.x86_64.rpm

crmsh依赖包:pssh-2.3.1-2.el6.x86_64.rpm

drbd版本:drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm

drbd内核补丁:kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm

 

四、实验拓扑

wKioL1Vuy3XyRzCgAAVSnCqdVNE573.bmp


  使用两台主机分别在两台主机新建一个分区,此分区用于存储MySQL数据库文件,在两个节点分别安装corosync、pacemaker和drbd用于实现MySQL的高可用,通过crmsh程序对pacemaker进行配置,当其中一个节点出现问题时用于前端访问的VIP地址将被移到另一个节点上,并挂载drbd同步的分区数据库存储文件,然后启动MySQL数据库程序,以实现在两个节点上实现MySQL高可用。

  现在我们要将drbd配置成corosync集群可用的一个资源,drbd比较的特别它有两个服务,在两个节点上都要运行为主从备份,要把drbd配置成clone资源来进行使用,是一个特殊的clone类型为主从类型。

 

五、准备工作

  在构建高可用集群服务器时需要做四个准备工作,分别是:

①节点间时间必须同步:使用ntp协议实现;

②节点间需要通过主机名互相通信,必须解析主机至IP地址;

   (a)建议名称解析功能使用hosts文件来实现;

   (b)通信中使用的名字与节点名字必须保持一致:“uname -n”命令,或“hostname”展示出的名字保持一致;

③考虑仲裁设备是否会用到;

④建立各节点之间的root用户能够基于密钥认证;

1)配置节点时间同步

配置时间同步使用ntpdate命令,建立一个定时任务,实现周期性的时间同步

[root@node-02 ~]# ntpdate 172.16.0.1
 3Jun 08:56:53 ntpdate[1655]: step time server 172.16.0.1 offset 22520.390088 sec
[root@node-02 ~]# crontab -l
*/3 * * * * /usr/sbin/ntpdate 172.16.0.1&>/dev/null
[root@node-03 ~]# /usr/sbin/ntpdate172.16.0.1
 3Jun 08:57:50 ntpdate[2094]: step time server 172.16.0.1 offset 23311.837688 sec
[root@node-03 ~]# crontab -l
*/3 * * * * /usr/sbin/ntpdate 172.16.0.1&>/dev/null


2)节点间基于主机名互相通信,在/etc/hosts文件中进行配置

[root@node-02 ~]# cat /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.0.1 server.magelinux.com server
172.16.9.82 node-02 node2
172.16.9.83 node-03 node3
[root@node-03 ~]# cat /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomainlocalhost6 localhost6.localdomain6
172.16.0.1 server.magelinux.com server
172.16.9.82 node-02 node2
172.16.9.83 node-03 node3


3)节点之间基于root用户的密钥认证

[root@node-02 ~]# ssh-keygen -t rsa 
Generating public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
93:c1:f9:42:63:cd:2c:98:b3:a9:ef:7e:02:24:db:f2root@node-02
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|      + =       |
|     + O +      |
|  ..  * *       |
|  =  o S .      |
|  oo.   o       |
|  o..           |
|   E.. .        |
|    o+o         |
+-----------------+
[root@node-02 ~]# ssh-copy-id -i.ssh/id_rsa.pub node3
Warning: Permanently added 'node3' (RSA) tothe list of known hosts.
root@node3's password: 
Now try logging into the machine, with"ssh 'node3'", and check in:
 
 .ssh/authorized_keys
 
to make sure we haven't added extra keysthat you weren't expecting.
 
[root@node-03 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
b7:b1:3b:ca:78:9c:bc:72:0e:a0:18:a6:8d:ac:d0:99root@node-03
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|.. .   S o      |
|+* + .  . +     |
|=.E  .o .o      |
|o    .+* ..     |
|.    .==o..     |
+-----------------+
[root@node-03 ~]# 
[root@node-03 ~]#  ssh-copy-id -i .ssh/id_rsa.pub node2
root@node2's password: 
Now try logging into the machine, with"ssh 'node2'", and check in:
 
 .ssh/authorized_keys
 
to make sure we haven't added extra keysthat you weren't expecting.

 

测试节点间是否名密钥登陆

[root@node-02 ~]# ssh node3
Last login: Wed Jun  3 12:28:06 2015 from 172.16.9.9
[root@node-03 ~]# exit
logout
Connection to node3 closed.
[root@node-02 ~]#
[root@node-03 ~]# ssh node2
Last login: Wed Jun  3 12:41:17 2015 from 172.16.9.9
[root@node-02 ~]# exit
logout
Connection to node2 closed.
[root@node-03 ~]#

 

六、安装配置HA程序

6.1 安装corosync和pacemaker程序

  在配置好yum源之后直接安装corosync和pacemaker程序,分别两个节点上执行yum 命令安装

yum install corosync pacemaker -y


6.2 corosync默认配置文件解释

corosync程序安装后配置文件所在目录为/etc/corosync目录下,启动程序/etc/init.d/corosync.

[root@node-02 ~]# cd /etc/corosync/
[root@node-02 corosync]# ls
corosync.conf.example  corosync.conf.example.udpu  service.d uidgid.d
[root@node-02 corosync]# cpcorosync.conf.example corosync.conf
[root@node-02 corosync]# egrep  -v "#|^$" corosync.conf
compatibility: whitetank    #是否兼容whitetank
totem {    #用于定义底层信息层是如何通信的相关属性
    version:2      #定义版本号
    secauth:off    #是否启用安全认证功能,启用后要使用corosync-keygen命令生成密钥
    threads:0      #工作时所使用的线程数,“0”表示不基于线程模型,而是进程模型
    interface{ #定义多个接口之间,基于哪个地址,哪个多播地址,监听什么端口完成多播通信;
        ringnumber:0       #环数,有点类型于TTL值对方是否回传
        bindnetaddr:192.168.1.0        #多播地址监听的IP网络地址
        mcastaddr:239.255.1.1      #多播地址
        mcastport:5405             #多播地址监听的端口
        ttl:1                  #指明TTL值
    }
}
logging {       #定义日志相关属性
    fileline:off       #
    to_stderr:no       #是否把日志输出为标准输出即屏幕
    to_logfile:yes #开启记录在日志文件中
    logfile:/var/log/cluster/corosync.log
    to_syslog:yes  #是否发往系统的日志文件中
    debug:off
    timestamp:on       #是否在日志文件中开启时间戳功能,建议不开启
    logger_subsys{ #日志文件是否记录子系统
        subsys:AMF
        debug:off
    }
}


6.3 配置pacemaker

  pacemaker与corosync结合运行pacemaker的运行方式有两种,一种是作为corosync的插件运行,另一种是以独立的守护进程运行,以CentOS 6中建议以插件的方式运行,不过这样日志中可能会用警告,可以忽略的。在corosync.conf文件后面添加如下内容:

service {
       ver:    0
       name:   pacemaker
       use_mgmtd:yes
}
 
aisexec {
       user:   root
       grout:  root
}


6.4 为corosync提供密钥文件,它需要在/dev/random中读取1024个随机数

[root@node-02 corosync]# corosync-keygen 
Corosync Cluster Engine Authentication keygenerator.
Gathering 1024 bits for key from/dev/random.
Press keys on your keyboard to generateentropy.
Press keys on your keyboard to generateentropy (bits = 176).

#此时已经卡住了,说没有这么多个随机数,可以在打开一个终端,不断的敲击键盘,不过这么有一点的久,你可以在ftp下载一个大的文件,这样会产生大量的IO。


6.5 corosync+pacemaker最终配置文件

[root@node-02 corosync]# egrep  -v "#|^$" corosync.conf
compatibility: whitetank
totem {
    version:2
    secauth:on
    threads:0
    interface{
        ringnumber:0
        bindnetaddr:172.16.0.0
        mcastaddr:239.255.9.9
        mcastport:5405
        ttl:1
    }
}
logging {
    fileline:off
    to_stderr:no
    to_logfile:yes
    logfile:/var/log/cluster/corosync.log
    to_syslog:no
    debug:off
    timestamp:on
    logger_subsys{
        subsys:AMF
        debug:off
    }
}
service {
       ver:    0
       name:   pacemaker
       use_mgmtd:yes
}
aisexec {
       user:   root
       grout:  root
}


6.6 将配置文件和密钥文件同步至node3节点

[root@node-02 corosync]# scp authkeycorosync.conf node3:/etc/corosync/
authkey                                                              100%  128    0.1KB/s   00:00    
corosync.conf                                                        100% 2794    2.7KB/s   00:00


6.7 启动corosync服务

[root@node-02 corosync]# service corosyncstart;ssh node3 'service corosync start'
Starting Corosync Cluster Engine(corosync):               [ OK  ]
Starting Corosync Cluster Engine(corosync): [  OK  ]


6.8 安装crmsh

  把准备好的程序直接使用yum进行安装,这样可以解决依赖关系,在生产环境中只需要选择一台节点上进行安装,在这里我们在两个节点上都进行安装,以方便测试。

[root@node-02 ~]# yum installcrmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm  -y

 

七、安装配置drbd

  安装drbd需要向内核打补丁,所以要下载与内核版本相同的内核补丁,需要在两个节点都进行安装。

7.1 安装drbd程序

  这里只演示在节点node2上安装的过程

[root@node-02 ~]# uname  -r
2.6.32-504.el6.x86_64
[root@node-02 ~]# rpm -ivhdrbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpmkmod-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.


7.2 drbd配置文件global_common.conf解释

  drbd安装完成之后将会生成/etc/drbd.conf和/etc/drbd.d/目录,在drbd.conf文件就写了两行包含drbd.d中的文件,所以主配置文件在/etc/drbd.d/目录中。

[root@node-03 ~]# cd /etc/drbd.d/
[root@node-03 drbd.d]# catglobal_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 {
    usage-countyes;    #是否启用让drbd官方进行用户使用统计,建议为no
    #minor-count dialog-refresh disable-ip-verification
}
 
common {
    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{   #定义drbd启动时双方等待处理的方式
        #wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
    }
 
    options{   #定义同步时属性
        #cpu-mask on-no-data-accessible
    }
 
    disk{  #使用的磁盘
        #size on-io-error fencing disk-barrier disk-flushes
        #disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-targetc-fill-target c-max-rate
                # c-min-rate disk-timeout
    }
 
    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
    }
}


7.3 修改global_common.conf文件

[root@node-03 drbd.d]# egrep -v"#|^$" global_common.conf 
global {
    usage-countno;
}
common {
    handlers{
    }
    startup{
    }
    options{
    }
    disk{
        on-io-error detach;         #当磁盘IO错误时直接卸载磁盘
    }
    net{
        cram-hmac-alg  "sha1";      #使用通信的加密算法
        shared-secret  "3GQ3aD7DSEY";   #通信的加密密钥,建议使用opensslrand -base64  #生成
    }
    syncer{
        rate1000M;         #数据同步使用的带宽
    }
}


7.4 创建分区

  分别在两个节点上创建两个分区,分区的大小应该保持一致,只用创建分区不用格式化。如新建一个/dev/sda3大小为5G。

[root@node-02 ~]# fdisk -l /dev/sda
 
Disk /dev/sda: 128.8 GB, 128849018880 bytes
255 heads, 63 sectors/track, 15665cylinders
Units = cylinders of 16065 * 512 = 8225280bytes
Sector size (logical/physical): 512 bytes /512 bytes
I/O size (minimum/optimal): 512 bytes / 512bytes
Disk identifier: 0x00090ed9
 
  Device Boot      Start         End      Blocks  Id  System
/dev/sda1  *           1          26      204800  83  Linux
Partition 1 does not end on cylinderboundary.
/dev/sda2              26        7859   62914560   8e  Linux LVM
/dev/sda3            7859        8512    5252256   83  Linux


7.5 定义drbd的资源文件

样本配置文件解释:

resource web {      #定义资源使用resource关键字,web是资源名,不能使用空格字符
  onnode1.magedu.com { #指明在每个节点上的设备属性
   device    /dev/drbd0;   #设置名是什么
   disk      /dev/sda5;    #使用哪个磁盘分区设备当作drbd
   address   172.16.100.7:7789;    #此节点将监听的IP地址和端口
   meta-disk internal;     #指明drbd的源数据存放位置,internal表示磁盘自身
  }
  onnode2.magedu.com {
   device    /dev/drbd0;
   disk      /dev/sda5;
   address   172.16.100.8:7789;
   meta-disk internal;
  }
}


drbd的资源文件需要在/etc/drbd.d/*.res结尾的文件,这里定义一个mysql.res的文件

[root@node-03 drbd.d]# cat mysql.res
resource mystore {
    device/dev/drbd0;
    disk/dev/sda3;
    meta-diskinternal;
    onnode-02 {
        address 172.16.9.82:7789;
    }
    onnode-03 {
        address172.16.9.83:7789;
    }
}


7.6 把配置的文件同步至另一个节点

[root@node-03 drbd.d]# ls
global_common.conf  mysql.res
[root@node-03 drbd.d]# scp -rpglobal_common.conf mysql.res node2:/etc/drbd.d/
global_common.conf                                 100% 2097     2.1KB/s  00:00    
mysql.res                                         100%  169     0.2KB/s  00:00    
[root@node-02 drbd.d]# ls
global_common.conf  mysql.res


7.7 初始化drbd

  初始化drbd需要在每个节点上都要执行一次,以实现节点间的数据一致性。这里在node3节点上演示。

[root@node-03 drbd.d]# drbdadm create-mdmystore
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfullycreated.


7.8 启动drbd

  启动drbd时它需要等待对端启动,双方才能启动成功。

[root@node-02 ~]# service drbd start; sshnode3 'service drbd start'


7.9 查看drbd状态

[root@node-02 ~]# 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:5252056

从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:

# drbdadm primary --force RESCOURCE

这里将node2设置为主节点,操作如下:

[root@node-02 ~]#  drbdadm primary --force mystore
[root@node-02 ~]# 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:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
   ns:2867864 nr:0 dw:0 dr:2868896 al:0 bm:0 lo:0 pe:2 ua:1 ap:0 ep:1 wo:foos:2385880
    [=========>..........]sync'ed: 54.7% (2328/5128)M
    finish:0:01:04 speed: 37,088 (36,744) K/sec


#查看状态时发现两分节点上的磁盘分区已经开始同步了,此时需要等待一下,具体的时间将会根据分区大小来定,同步完状态如下:

[root@node-02 ~]# 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:5252056 nr:0 dw:0 dr:5252728 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:0


7.10 格式化主节点上的/dev/drbd0

[root@node-02 ~]# mke2fs -t ext4 /dev/drbd
drbd/ drbd0  
[root@node-02 ~]# mke2fs -t ext4 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
328656 inodes, 1313014 blocks
65650 blocks (5.00%) reserved for the superuser
First data block=0
Maximum filesystem blocks=1346371584
41 block groups
32768 blocks per group, 32768 fragments pergroup
8016 inodes per group
Superblock backups stored on blocks: 
    32768,98304, 163840, 229376, 294912, 819200, 884736
 
Writing inode tables: done

                 

八、安装布置MySQL数据库

  MySQL使用的是MairaDB的数据库,只有在两个节点中的其中一个节点初始化数据库就行,因为两个节点都是共享提供的一个数据库文件,如安装初始化数据库在node2上进行操作,在node3节点上不用初始化数据库其它操都是一样的,这里就不给出操作过程。

8.1 创建MariaDB运行的用户

[root@node-02 ~]# useradd -r -u 336 mysql
[root@node-02 ~]# id mysql
uid=336(mysql) gid=336(mysql)groups=336(mysql)


8.2 挂载/dev/drbd0分区到数据库目录

[root@node-02 ~]# mkdir /data/data -p
[root@node-02 ~]# mount /dev/drbd0 /data
[root@node-02 ~]# chown -R mysql.mysql /data/data/
#注意:在node3安装MySQL时需要做如下操作:
[root@node-02 ~]# drbdadm secondary mystore
[root@node-02 ~]# drbd-overview 
 0:mystore/0 Connected Secondary/Secondary UpToDate/UpToDate
把node-03变成主节点:
[root@node-03 ~]# drbdadm primary mystore

然后在进行挂载操作,切记,node3节点上不要初始化数据库,因为两边的数据已经是同步的。


8.3 解压MariaDB程序包到/usr/local目录下

[root@node-2 tools]# tar xfmariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/


8.4 创建软链接

[root@node-2 tools]# cd /usr/local/
[root@node-2 local]# ln -smariadb-5.5.43-linux-x86_64/ mysql


8.5 初始化数据库

[root@node-2 local]# cd mysql
[root@node-2 mysql]# chown -R  root.mysql ./*
[root@node-2 mysql]#scripts/mysql_install_db --datadir=/data/data --user=mysql


8.6 提供MySQL的主配置文件

[root@node-2 mysql]# mkdir /etc/mysql
[root@node-2 mysql]# cpsupport-files/my-large.cnf /etc/mysql/my.cnf


8.7 编辑/etc/mysql/my.cnf配置文件

在/etc/mysql/my.cnf配置文件中在[mysqld]标签中添加数据库存放目录。

datadir = /data/data
innodb_file_per_table= on
skip_name_resolve = on


8.8 为MySQL提供服务脚本

[root@node-2 mysql]# cpsupport-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node-2 mysql]# chmod +x/etc/rc.d/init.d/mysqld
[root@node-2 mysql]# chkconfig --add mysqld
[root@node-2 mysql]# chkconfig mysqld off


8.9 启动MariaDB服务进行测试

[root@node-02 mysql]# service mysqld start
Starting MySQL....                                         [  OK  ]
[root@node-02 mysql]# bin/mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.43-MariaDB-log MariaDBServer
 
Copyright (c) 2000, 2015, Oracle, MariaDBCorporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' toclear the current input statement.
 
MariaDB [(none)]> create database node2;
Query OK, 1 row affected (0.03 sec)
 
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| node2              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)
 
MariaDB [(none)]> exit
Bye


8.10 停止MySQL服务,卸载/data

[root@node-02 mysql]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]
[root@node-02 mysql]# umount /data

 

九、配置高可用的MySQL

9.1 初始化配置

[root@node-02 ~]# crm   #切换至crm命令提示符
crm(live)# configure    #切换至配置模式
crm(live)configure# property stonith-enabled=false  #禁用stonith设备,因为我们这里没有stonith设备所有要禁用
crm(live)configure# propertyno-quorum-policy=ignore   #忽略集群中当节点数小于等于quorum,节点数将无法运行,默认是stop
crm(live)configure# verify  #检验语法
crm(live)configure# commit  #提交并保存服务立即生效


9.2 配置VIP资源

crm(live)configure# primitive mysqlipocf:heartbeat:IPaddr \
params ip=172.16.9.100 nic=eth0cidr_netmask=16 \
op monitor interval=10s timeout=20s
 crm(live)configure# verify
#primitive  :配置主资源即基本资源
#mysqlip    :资源名,为VIP的地址
# ocf:heartbeat:IPaddr  :表示为ocf风格的heartbeat中的IPaddr,用于设置IP地址
#parmas :参数,即ocf:heartbeat:IPaddr选项中的要进行配置的值
#ip=172.16.9.100    :设置IP地址为172.6.9.100
#nic    :把VIP设置在哪块网卡上,可省
#cidr_netmask=16    :使用cidr风格的子网掩码格式
#op :表示此资源带的选项
#monitor    :为监控操作
# interval  :每隔多少时间监控一次
# timeout   :每次监控超时时间


9.3 配置clone的基本资源

任何一个主从或clone资源都必须先是primitive资源,然后在clone,一份叫master,一份叫slave。

crm(live)configure# primitive mystorocf:linbit:drbd params drbd_resource="mystore" \
op monitor role="Master"interval=10s timeout=20s \
op monitor role="Slave"interval=20s timeout=20s \
op start timeout=240s op stop timeout=100s
crm(live)configure# verify


9.4 配置主从资源

crm(live)configure# ms ms_mystor mystormeta clone-max="2" \
clone-node-max="1"master-max="1" master-node-max="1" notify="true"
crm(live)configure# verify
#clone-max : 最多克隆出的资源份数;
#clone-node-max    : 在单个节点上最多运行几份克隆;
#master-max    : 最多启动几份master资源;只能用于在主从资源;
#master-node-max   : 同一个节点最多运行几份master类型资源;只能用于在主从资源;
#notify    :当一份克隆资源启动或停止时,是否通知给其它的副本;是布尔值,默认为false;


9.5 配置挂载文件系统系统

  挂载的必须是主资源,先定义文件系统,然后定义约束主资源在那里文件系统就在那里,然后在定义顺序约束,只有主节点提升以后才能挂载文件系统.

crm(live)configure# primitive mydataocf:heartbeat:Filesystem \
params device="/dev/drbd0"directory="/data" fstype="ext4" \
op monitor interval=20s timeout=40s opstart timeout=60s \
op stop timeout=60s
crm(live)configure# verify


9.6 定义排列约束

  文件系统资源mydata必须与主从资源ms_mystor的主节点在一起.

crm(live)configure# colocationmydata_with_ms_mystore inf: mydata ms_mystor:Master
crm(live)configure# verify


9.7 定义顺序约束

  文件系统资源mydata要在主从资源ms_mystor的主节点启动之后挂载

crm(live)configure#  order mydata_after_ms_mystor_masterMandatory: ms_mystor:promote mydata:start
crm(live)configure# verify


9.8 定义MySQL资源

crm(live)configure# primitive myserverlsb:mysqld op monitor interval=20s timeout=20s
crm(live)configure# verify


9.9 定义约束mysqlip要和主节点在一起

crm(live)configure# colocationmyip_with_ms_mystor_master inf: mysqlip ms_mystor:Master
crm(live)configure# verify


9.10 定义约束myserver要和mydata在一起

crm(live)configure# colocationmyserver_with_mydata inf: myserver mydata
crm(live)configure# verify


9.11 定义顺序启动约束,myserver要在mydata之后启动

crm(live)configure# ordermyserver_after_mydata Mandatory: mydata:start myserver:start
crm(live)configure# verify


9.12 定义顺序启动约束,myserver要在myip之后启动

crm(live)configure# order  myserver_after_myip Mandatory: myip:start myserver:start
crm(live)configure# verify
crm(live)configure# commit


 

十、测试集群服务

10.1 查看集群状态

[root@node-02 ~]# crm status
Last updated: Wed Jun  3 16:45:43 2015
Last change: Wed Jun  3 16:44:22 2015
Stack: classic openais (with plugin)
Current DC: node-02 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
5 Resources configured
 
 
Online: [ node-02 node-03 ]
 
 mysqlip    (ocf::heartbeat:IPaddr):    Started node-03 
 Master/Slave Set: ms_mystor [mystor]
    Masters: [ node-03 ]
     Slaves: [ node-02 ]
 mydata (ocf::heartbeat:Filesystem):    Started node-03 
 myserver   (lsb:mysqld):   Started node-03

  通过上面的状态查看,我们已经知道所有的服务运行正常,并运行在node3节点上。


10.2 测试node3节点上的MySQL是否可用

[root@node-03 ~]# ss -tanp|grep":3306"
LISTEN    0      50                        *:3306                     *:*      users:(("mysqld",4367,15))
[root@node-03 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.43-MariaDB-log MariaDBServer
 
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> create database testnode3;
Query OK, 1 row affected (0.02 sec)
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testnode3          |
+--------------------+
5 rows in set (0.04 sec)
 
mysql> exit
Bye

在node3节点能正常创建数据库,也能正常显示数据库信息。


10.3 将node3下线,测试node2是否能使用

[root@node-03 ~]# crm node standby 
[root@node-03 ~]# crm node online
[root@node-03 ~]# crm status
Last updated: Wed Jun  3 16:54:43 2015
Last change: Wed Jun  3 16:54:40 2015
Stack: classic openais (with plugin)
Current DC: node-02 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
5 Resources configured
 
 
Online: [ node-02 node-03 ]
 
 mysqlip    (ocf::heartbeat:IPaddr):    Started node-02 
 Master/Slave Set: ms_mystor [mystor]
    Masters: [ node-02 ]
    Slaves: [ node-03 ]
 mydata (ocf::heartbeat:Filesystem):    Started node-02 
 myserver   (lsb:mysqld):   Started node-02


在node2登录mysql查看并创建数据库文件

[root@node-02 ~]# ss -tanp|grep":3306"
LISTEN    0      50                        *:3306                     *:*      users:(("mysqld",6141,15))
[root@node-02 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.43-MariaDB-log MariaDBServer
 
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               |
| testnode3          |
+--------------------+
5 rows in set (0.05 sec)
 
mysql> create database testnode2;
Query OK, 1 row affected (0.02 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testnode2          |
| testnode3          |
+--------------------+
6 rows in set (0.00 sec)
 
mysql> exit
Bye


10.4 测试HA MySQL服务是否具有监控能力

[root@node-03 ~]# ss -tanp|grep":3306"
LISTEN    0      50                        *:3306                     *:*      users:(("mysqld",14384,15))
[root@node-03 ~]# killall mysqld
[root@node-03 ~]# killall mysqld
mysqld: no process killed
[root@node-03 ~]# ss -tanp|grep":3306"
[root@node-03 ~]# ss -tanp|grep":3306"
[root@node-03 ~]# ss -tanp|grep":3306"
LISTEN    0      50                        *:3306                     *:*      users:(("mysqld",15471,15))

经过测试MySQL能在意外关闭后几秒中重启被启动。


 

小结:

  一个简单的MySQL高可用就配置完毕,drbd可以通过分布式磁盘块设备提供了共享存储的可用性,甚至也提供了冗余的可用性,drbd的可用性和可靠性还是有待考验的,虽然有中小企业使用了drbd,甚至MySQL官方在实现MySQL高可用都以drbd为案例讲解过drbd;但经过在实际生产环境中的检验的反馈来看,drbd偶尔还是会出问题的,到底用不用还是要考虑衡量可以接受数据的损失,及数据的重要性来进行评估。

  不过我们相信drbd会越来越完善、稳定、安全、可靠。。。。。


  欢迎各位观客为小乌提出宝贵的意见,小乌等待你。。。。。

 

没有伞的孩子就必须要努力奔跑。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章