前言:构建双节点高可用Mysql服务器,用DRBD个人感觉是比较合适的,只需要两台Server即可,用IP SAN的话先不说SAN的设备,主机也得需要4台,NFS是行不通的。

目标:两台mysql服务器基于drbd构建高可用主从服务器,平时DR1服务器接受请求,DR2基于DRBD数据备份,当DR1出现问题时,DR2接替DR1的工作接受用户请求。

规划:

1. DR1:172.16.1.16 hostname dr1.laoguang.me 
2.  
3. DR2:172.16.1.17 hostname dr2.laoguang.me 
4.  
5. VIP:172.16.1.1

环境:RedHat5.8 内核:2.6.18-308.el5  Selinux已经关闭  Yum 配置完好

注:如果没说在哪台机器上配置则默认是dr1

一.配置准备工作,hostname设置,/etc/hosts解析的与对方hostname -n 一致,ssh互信,时间统一

1.1 hostname设置在dr1上演示设置

1. hostname dr1.laoguang.me 
2. vi /etc/hosts  ##添加如下解析 
3. 172.16.1.16     dr1.laoguang.me dr1  
4. 172.16.1.17     dr2.laoguang.me dr2

1.2 ssh互信设置dr1上演示

1. ssh-keygen -t rsa -P ""     ##回车,生成密钥在/root/.ssh下 
2. ssh-copy-id -i /root/.ssh/id_rsa.pub dr2   ##公钥拷贝到dr2上,再次登录dr2不需要密码 
3. 同样dr2也这么设置

1.3 同步时间(如果有NTP就同步NTP的时间)

1. date -s 20121127;ssh dr2 'date -s 20121127'

二.dr1,dr2上安装DRBD

DRBD分为两部分,一部分是工作内核中的模块部分,一部分是工件在用户空间的管理工具,2.6.33以后的内核中已经集成了DRBD的模块,只安装管理工具即可,旧内核需要为内核打补丁才可以,有爱好者把补丁做成了rpm包名字为kmod-drbd,安装它即可,补丁包一定与内核版本一致。下面安装与软件。

2.1 dr1,dr2安装内核补丁与软件 kmod-drbd83-8.3.8-1.el5.centos.i686.rpm,drbd83-8.3.8-1.el5.centos.i386.rpm


    1. rpm -ivh kmod-drbd83-8.3.8-1.el5.centos.i686.rpm 
    2. rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm 
    3. rpm -ql drbd83     ##查看生成文件


    2.2 配置DRBD(注如果没说在哪台机器上配置则默认是dr1)

    /etc/drbd.conf 为主配置文件,它把/etc/drbd.d下子配置文件包含进来,通过查看drbd.conf我们可以发现一样例文件/usr/share/doc/drbd83-8.3.8/drbd.conf,用它覆盖这个空的配置文件。


      1. cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/


      编辑/etc/drbd.d/global_common.conf 这个全局配置文件如下:


        1.    global { 
        2.         usage-count no; 
        3.         # minor-count dialog-refresh disable-ip-verification 
        4.     } 
        5.  
        6.     common { 
        7.         protocol C; 
        8.  
        9.         handlers { 
        10.                 用默认即可 
        11.         } 
        12.  
        13.         startup { 
        14.                 #wfc-timeout 120; 
        15.                 #degr-wfc-timeout 120; 
        16.         } 
        17.  
        18.         disk { 
        19.                 on-io-error detach;           ##IO错误的处理方法 
        20.                 #fencing resource-only; 
        21.         } 
        22.  
        23.         net { 
        24.                 cram-hmac-alg "sha1";         ##指定校验算法,校验是为保证数据完整 
        25.                 shared-secret "laoguang.me";  ##指定校验密码 
        26.         } 
        27.  
        28.         syncer { 
        29.                 rate 1000M;                   ##指定同步时用多少带宽 
        30.         } 
        31.     }


        2.3 dr1,drs上创建大小一样的分区,不演示了

        dr1上的为/dev/sda5 1G    ##注:记的partprobe,不要格式化

        dr2上的为/dev/sda5 1G

        2.4 为DRBD添加磁盘资源

        1. vim /etc/drbd.d/mysql.res 
        2.     resource mysql { 
        3.         on dr1.laoguang.me { 
        4.         device    /dev/drbd0;        ##DRBD用的设备 
        5.         disk      /dev/sda5;         ##映射的磁盘 
        6.         address   172.16.1.16:7789;  ##drbd启动后监听端口7789 
        7.         meta-disk internal;          ##元数据存放 
        8.         } 
        9.         on dr2.laoguang.me { 
        10.         device    /dev/drbd0; 
        11.         disk      /dev/sda5; 
        12.         address   172.16.1.17:7789;     
        13.         meta-disk internal; 
        14.         } 
        15.     }


        2.5 拷贝到时dr2上一份

        1. scp -r /etc/drbd.* dr2:/etc/

        2.6 dr1,dr2上初始化drbd资源,并启动服务

        1. drbdadm create-md mysql       ##如果没出现successful可能是你没有partprobe哦 
        2. service drbd start 
        3. drbd-overview  ##查看起动状态 
        4. 0:mysql  Connected Secondary/Secondary Inconsistent/Inconsistent C r----

        2.7 将其中dr1节点先设置为Primary,让磁盘同步一次

        1. drbdsetup /dev/drbd0 primary –o 
        2. drbd-overview ##查看状态,可知dr2开始同步dr1的数据,等待同步完成 
        3. 0:mysql  SyncSource Primary/Secondary UpToDate/Inconsistent C r----  
        4. [==>.................] sync'ed: 15.3% (841880/987896)K delay_probe: 11

        2.8 格式化drbd0,挂载使用。注意,由于没有锁管理,所以不要同时挂载使用,一般只有primaty可使用



        1. mke2fs -j -L DRBD /dev/drbd0 
        2. mkdir /data/mydata -pv   ##dr1,dr2都建立该目录,为以后mysql安装准备 
        3. mount /dev/drbd0 /data/mydata 
        4. cd /data/mydata  ##查看是否成功,建立文件测试能否同步 
        5. cp /etc/fstab . 
        6. umount /data/mydata 
        7. drbdadm secondary mysql  ##把自己转换为Secondary 
        8. dr2上操作: 
        9. drbdadm primary mysql    ##dr2切换为Primary 
        10. mount /dev/drbd0 /data/mydata  ##挂载,并查看是否有数据 
        11. ls /data/mydata


        到此DRBD设置完毕。一会儿我们会把drbd定义为资源,所以禁止drbd开机启动

        1. chkconfig drbd off

        三.dr1,dr2上安装Mysql

        primary切换到dr1,挂载drbd0到/data/mydata,开始安装Mysql,本段不再演示,如有需要去看http://laoguang.blog.51cto.com/6013350/1039208

        主要更改datadir到 /data/mydata ,另外注意dr1,dr2的mysql用户uid,gid须一致

        安装完测试能否启动,如果能,请继续。

        停止mysql,卸载drbd,primary切换到dr2,挂载drbd0到/data/mydata,mysql不需要初始化了,拷贝配置文件,启动脚本即可。测试能否启动

        不许mysql开机启动


          1. chkconfig mysqld off


          四.基于corosync,pacemaker部署高可用集群

          4.1 安装covosync,pacemaker及依赖包



          1.     ls   ##查看当前目录下的所有包,http://clusterlabs.org/rpm/下载适合你平台的包 
          2.     cluster-glue-1.0.6-1.6.el5.i386.rpm 
          3.     cluster-glue-libs-1.0.6-1.6.el5.i386.rpm 
          4.     corosync-1.2.7-1.1.el5.i386.rpm 
          5.     corosynclib-1.2.7-1.1.el5.i386.rpm 
          6.     heartbeat-3.0.3-2.3.el5.i386.rpm    ##安装heartbeat是因为pacemake会依赖它的某些库 
          7.     heartbeat-libs-3.0.3-2.3.el5.i386.rpm 
          8.     libesmtp-1.0.4-5.el5.i386.rpm 
          9.     pacemaker-1.1.5-1.1.el5.i386.rpm 
          10.     pacemaker-cts-1.1.5-1.1.el5.i386.rpm 
          11.     pacemaker-libs-1.1.5-1.1.el5.i386.rpm 
          12.     perl-TimeDate-1.16-5.el5.noarch.rpm 
          13.     resource-agents-1.0.4-1.1.el5.i386.rpm


          ------------------------------centos5.x x86_64bit安装方法----------------------------

          1. rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm 
          2. wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo 
          3. yum -y install heartbeat-stonith 
          4. yum -y install pacemaker corosync

          --------------------------------------------------------------------------------------

          安装它们

          1. yum -y --nogpgcheck localinstall *.rpm   ##必须在rpm所在目录哦

          4.1 修改covosync配置文件


            1. cd /etc/corosync 
            2.     mv corosync.conf.example corosync.conf 
            3.     vi corosync.conf 
            4.     totem { 
            5.         version: 2 
            6.         secauth: on      ##启用认证,不能让其它主机随意加入集群 
            7.         threads: 0 
            8.         interface { 
            9.                 ringnumber: 0 
            10.                 bindnetaddr: 172.16.0.0  ##绑定端口 
            11.                 mcastaddr: 226.94.11.19  ##组播地址,建议修改 
            12.                 mcastport: 5405          ##组播端口 
            13.         } 
            14.     } 
            15.  
            16.     logging {                            ##定义日志 
            17.         fileline: off  
            18.         to_stderr: no 
            19.         to_logfile: yes                  ##日志写入独立file 
            20.         to_syslog: no                    ##不用写到syslog中了 
            21.         logfile: /var/log/cluster/corosync.log   ##日志path,需要手动建立 
            22.         debug: off                       ##调试 
            23.         timestamp: on  
            24.     logger_subsys { 
            25.                 subsys: AMF 
            26.                 debug: off 
            27.         } 
            28.     } 
            29.  
            30.     amf { 
            31.         mode: disabled 
            32.     } 
            33.     service {                            ##定义资源管理服务 
            34.         ver: 0 
            35.         name: pacemaker                  ##启动pacemaker 
            36.     } 
            37.     aisexec {                            ##运行corosync的user 
            38.         user: root 
            39.         group: root 
            40.     }


            4.2 建立日志目录,建立认证密钥

            1. mkdir /var/log/cluster ##dr2中也建立 
            2. corosync-keygen    ##生成密钥 
            3. ##配置文件同步到dr2上一份 
            4. scp -p authkey corosync.conf dr2:/etc/corosync/

            4.3 dr1,dr2启动corysync,等待一会儿查看状态

            1. service corysync start 
            2. crm status      ##查看状态,如果显示Online: [ dr2.laoguang.me dr1.laoguang.me ] 则正常

            4.4 定义covosync的一些属性,我们没有stonith设备,我们就两个节点,假如一个挂点quorum就不会大于1/2,集群还运行于否


              1. crm                    ##进入crn命令行,以后管理集群就靠它了 
              2. crm(live)# configure   ##进入配置状态 
              3. crm(live)configure# property no-quorum-policy="ignore"    ##定义quorum不足一半时继续运行 
              4. crm(live)configure# property stonith-enabled="false"      ##禁用stonish,生产环境中应该定义的 
              5. crm(live)configure# verify                                ##校验是否有语法错误 
              6. crm(live)configure# commit                                ##没有错误,提交 
              7. crm(live)configure# show                                  ##查看


              4.5 定义drbd为主从资源



              1. crm(live)configure# primitive Mysql_DRBD ocf:linbit:drbd \
              2. params drbd_resource=mysql op start timeout=240 op stop timeout=100 
              3. ##先定义为本地资源,指定资源类型,资源name,指定用的RA,后面的是RA的语法需要
              4. ##drbd_resource是指你定义的drbd的名字



              1. crm(live)configure# master Ms_Mysql_DRBD Mysql_DRBD meta \
              2. master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" 
              3. ##master关键字定义主从资源,后面指定资源name,meta 指定额外参选数,master-max指定最多有几个master,
              4. ##master-node-max指定一个节点最多运行几个master,clone-max指定有几个clone资源,
              5. ##clone-node-max指定一个节点最多运行几个clone资源,notify指当出现故障时是否通知对方

              1. crm(live)configure# verify 
              2. crm(live)configure# commit  
              3. crm(live)configure# quit 
              4. drbd-overview   ##查看drbd是不是启动了


              4.6 定义Filesystem资源

              定义Filesystem挂载

              1. crm(live)configure# primitive MysqlFS ocf:heartbeat:Filesystem params \
              2. device=/dev/drbd0 directory=/data/mydata fstype="ext3" op start timeout=60 \
              3. op stop timeout=60

              挂载的drbd的一方必须是primary的主机,所以我们还得定义排列约束,Filesystem必须挂载到drbd的primary上,drbd服务必须先于Filesystem启动



              1. crm(live)configure# colocation MysqlFS_with_Ms_Mysql_master inf: MysqlFS Ms_Mysql_DRBD:Master 
              2. crm(live)configure# order MysqlFS_after_Ms_Mysql_DRBD inf: Ms_Mysql_DRBD:promote MysqlFS:start 
              3. crm(live)configure# verify 
              4. crm(live)configure# commit 
              5. crm(live)configure# show 查看CIB库 
              6. crm(live)configure# quit 
              7. crm_mon  ##查看资源运行状况 
              8. mount 查看master上drbd0挂载上没有


              4.7 定义Mysql资源,定义顺序约束与排列约束

              1.     crm(live)configure# primitive Mysql_Server lsb:mysqld  
              2.     crm(live)configure# order Mysql_Server_after_MysqlFS inf: MysqlFS Mysql_Server 
              3.     crm(live)configure# colocation Mysql_Server_with_MysqlFS inf: Mysql_Server MysqlFS  
              4.     crm(live)configure# verify 
              5.     crm(live)configure# commit 
              6.     crm(live)configure# quit 
              7.     crm status 
              8. status 
              9.     ============ 
              10.     Last updated: Wed Nov 28 15:11:26 2012 
              11.     Stack: openais 
              12.     Current DC: dr1.laoguang.me - partition with quorum 
              13.     Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
              14.     2 Nodes configured, 2 expected votes 
              15. configured. 
              16.     ============ 
              17.  
              18.     Online: [ dr2.laoguang.me dr1.laoguang.me ] 
              19.  
              20.     Master/Slave Set: Ms_Mysql_DRBD [Mysql_DRBD] 
              21.         Masters: [ dr2.laoguang.me ] 
              22.         Slaves: [ dr1.laoguang.me ] 
              23.     MysqlFS (ocf::heartbeat:Filesystem):    Started dr2.laoguang.me 
              24.     Mysql_Server    (lsb:mysqld):   Started dr2.laoguang.me

              4.8 定义一个IP资源并定义顺序、排列约束

              1.     crm(live)configure# primitive Mysql_IP ocf:heartbeat:IPaddr params ip=172.16.1.1 
              2.     crm(live)configure# colocation Mysql_IP_with_Mysql_Server inf: Mysql_IP Mysql_Server 
              3.     crm(live)configure# order Mysql_IP_after_Mysql_Server inf: Mysql_Server Mysql_IP 
              4.     crm(live)configure# verify 
              5.     crm(live)configure# commit 
              6.     crm(live)configure# quit 
              7.     crm status 
              8. status 
              9.     ============ 
              10.     Last updated: Wed Nov 28 15:17:03 2012 
              11.     Stack: openais 
              12.     Current DC: dr1.laoguang.me - partition with quorum 
              13.     Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
              14.     2 Nodes configured, 2 expected votes 
              15. configured. 
              16.     ============ 
              17.  
              18.     Online: [ dr2.laoguang.me dr1.laoguang.me ] 
              19.  
              20.     Master/Slave Set: Ms_Mysql_DRBD [Mysql_DRBD] 
              21.         Masters: [ dr2.laoguang.me ] 
              22.         Slaves: [ dr1.laoguang.me ] 
              23.     MysqlFS (ocf::heartbeat:Filesystem):    Started dr2.laoguang.me 
              24.     Mysql_Server    (lsb:mysqld):   Started dr2.laoguang.me 
              25.     Mysql_IP    (ocf::heartbeat:IPaddr):    Started dr2.laoguang.me

              4.9 资源定义完毕,简单的集群构建完毕,测试能否正常转移

              由4.8可知Master为dr2,我们在dr2上转移测试

              1. crm node standby 
              2. crm status   ##查看Master是否变为了dr1

              继续测试,休眠dr1虚拟机,看能否转移到时dr2 

              mysql中建立数据库与表格,standby测试数据是否能同步