mysql+drbd+corosync+pacemaker高可用架构配置

回复 收藏
从铭哥这学到了很多东西,不过,我是看的铭哥的新年大礼包,并没有交钱学习,偶尔有问题了还是会像铭哥请教,铭哥也都会给解答,发个技术帖子,就当回报下,{:4_91:},这个架构不知道大家会不会用的上,或许有会的,我这个也很简陋了,打击凑合看吧,我是这么作出来的,有问题我能解决的尽量给大家回复。
drbd+corosync+pacemaker高可用配置,在此我们使用的是rpm安装包,
在此我们需要的是drbd84-utils-8.4.3-1.el5.elrepo.x86_64.rpm以及kmod-drbd84-8.4.3-1.el6_4.elrepo.x86_64.rpm两个rpm包,前提,配置好corosync+pacemaker高可用,这参见corosyn+pacemaker的搭建配置文档

有两种安装方式:rpm包安装和源码包编译安装
第一种:rpm包安装
安装drbd84-utils-8.4.3-1.el5.elrepo.x86_64.rpm,我们是使用yum安装防止缺少依赖包:
yum -y install drbd84-utils-8.4.3-1.el5.elrepo.x86_64.rpm
安装完成后可用rpm命令查看安装:
rpm -qa| grep drbd84-utils
rpm -ql drbd84-utils
drbd84-utils安装完成后,安装kmod-drbd84-8.4.3-1.el6_4.elrepo.x86_64.rpm
同样的用yum的方式安装,这个安装有点慢,
yum -y install kmod-drbd84-8.4.3-1.el6_4.elrepo.x86_64.rpm
安装完成后,同样的可以使用rpm命令查看安装:
rpm -qa kmod-drbd84
rpm -ql kmod-drbd84

第二种:源码包编译安装
源码编译安装也可以,首先配置参数如下(我用的drbd-8.4.3版本的源码):
[root@zpf drbd-8.4.3]# ./configure --with-km --with-heartbeat --with-pacemaker

配置完成后,没有问题(这个需要提前安装好开发工具包,yum -y groupinstall Development tools),就可以进行编译
[root@zpf drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/     ##后边的这个内核源码根绝操作系统最后的也不同

编译完成后,没有问题,就可以直接进行安装:
[root@zpf drbd-8.4.3]# make install   ##默认的安装路径在/usr/local下面
安装后的文件大体如下:
[root@zpf drbd-8.4.3]# find /usr/ -name drbd
/usr/local/drbd
/usr/local/drbd/var/run/drbd
/usr/local/var/lib/drbd
/usr/local/etc/rc.d/init.d/drbd
/usr/local/lib/drbd
/usr/lib/ocf/resource.d/linbit/drbd

[root@zpf drbd-8.4.3]#

在此我们需要修改配置文件,即修改/usr/local/etc/drbd.conf,文件内容跟rpm包安装的一样,
之后复制启动文件到系统中。
cp -a /usr/local/etc/rc.d/init.d/drbd  /etc/init.d/
之后的操作,跟rpm包安装的drbd是一样的。



上述确定没有问题后进行如下操作:
  1.加载DRBD模块:
    # modprobe drbd
    查看DRBD模块是否加载到内核:
    # lsmod |grep drbd
   2.参数配置:(zpf,zpf1)
   # vim /etc/drbd.conf
   清空文件内容,并添加如下配置: (注释掉即可) 两台的配置一样就好
global {
        usage-count no;      #是否参加DRBD使用者统计,默认为yes
        }      
common {
        syncer {
        rate 100M;       #设置主、备节点同步时的网络速率最大值
        }      
}      
resource r0{
        protocol C;
        startup { wfc-timeout 0; degr-wfc-timeout 120;}
        disk { on-io-error detach;}
        net{   
        timeout 60;
        connect-int 10;
        ping-int 10;
        max-buffers 2048;
        max-epoch-size 2048;
        }      
        syncer { rate 30M;}
                on zpf1{
                          device /dev/drbd0;
                          disk   /dev/sdb1;
                          address 192.168.191.100:7788;      
                          meta-disk internal;
                        }      
                on zpf2{
                          device /dev/drbd0;
                          disk   /dev/sdb1;
                          address 192.168.191.110:7788;
                          meta-disk internal;
                        }      
                        }      
   
   4.创建DRBD设备并激活ro资源:(node1,node2)
   # mknod /dev/drbd0 b 147 0
   # drbdadm create-md r0
   等待片刻,显示success表示drbd块创建成功 (可能创建不成功,这个参考制作硬盘出错即可解决)
        ----------------
        Writing meta data...
        initializing activity log
        NOT initializing bitmap
        New drbd meta data block successfully created.

              --== Creating metadata ==--
        As with nodes, we count the total number of devices mirrored by DRBD
        at http://usage.drbd.org.

        The counter works anonymously. It creates a random number to identify
        the device and sends that random number, along with the kernel and
        DRBD version, to usage.drbd.org.


        http://usage.drbd.org/cgi-bin/insert_usage.pl?
        

        nu=716310175600466686&ru=15741444353112217792&rs=1085704704

        * If you wish to opt out entirely, simply enter 'no'.
        * To continue, just press [RETURN]

        success
        ----------------

    再次输入该命令:
    # drbdadm create-md r0
       成功激活r0
        ----------------
        [need to type 'yes' to confirm] yes

        Writing meta data...
        initializing activity log
        NOT initializing bitmap
        New drbd meta data block successfully created.
        ----------------
   5.启动DRBD服务:(zpf,zpf1)
   # service drbd start
   注:需要主从共同启动方能生效
   启动一个的时候,会自动等待另一个的加入,两个都启动后才能使启动成功
   
   6。查看状态:(node1,node2)
     # cat /proc/drbd

     # cat /proc/drbd
       version: 8.4.3 (api:1/proto:86-101)
       GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@drbd1.example.com,
      
       2013-05-27 20:45:19
       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:1060184
     ----------------
     或
     
     
     
     # service drbd status
     ----------------
     drbd driver loaded OK; device status:
       version: 8.4.3 (api:1/proto:86-101)
       GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@drbd1.example.com,
      
       2013-05-27 20:45:19
       m:res  cs         ro                   ds                         p  mounted  fstype
       0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
     ----------------
     这里ro:Secondary/Secondary表示两台主机的状态都是备机状态,ds是磁盘状态,显示的状态内容为“不一致”,这是因为DRBD无法判断哪一方为主机,应以哪一方的磁盘数据作为标准。
  7.将drbd1.example.com主机配置为主节点:(node1)
     # drbdsetup /dev/drbd0 primary --force
     分别查看主从DRBD状态:
     (zpf)
     # service drbd status
     --------------------
     drbd driver loaded OK; device status:
     version: 8.4.3 (api:1/proto:86-101)
     GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@drbd1.example.com,
     
     2013-05-27 20:45:19
     m:res  cs         ro                 ds                 p  mounted  fstype
     0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C
     (zpf1)
     # service drbd status
      drbd driver loaded OK; device status:
      version: 8.4.3 (api:1/proto:86-101)
      GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@drbd2.example.com,
      
      2013-05-27 20:49:06
      m:res  cs         ro                 ds                 p  mounted  fstype
      0:r0   Connected  Secondary/PrimaryUpToDate/UpToDate  C
      ---------------------
      ro在主从服务器上分别显示 Primary/Secondary和Secondary/Primary ------------这个很重要
      ds显示UpToDate/UpToDate
      表示主从配置成功。
      
  8.挂载DRBD:(node1)
   从刚才的状态上看到mounted和fstype参数为空,所以我们这步开始挂载DRBD到系统目录
   # mkfs.ext4 /dev/drbd0
   # mount /dev/drbd0 /data
   注:Secondary节点上不允许对DRBD设备进行任何操作,包括只读,所有的读写操作只能在Primary节点上进行,只有当Primary节点挂掉时,Secondary节点才能提升为Primary节点继续工作。

  9.进行测试:
  # cd /data
  # touch 1 2 3 4 5
  # cd ..
  # umount /data
  # drbdsetup /dev/drbd0 secondary
  注:这里实际生产环境若DRBD1宕机,在DRBD2状态信息中ro的值会显示为Secondary/Unknown,只需要进行DRBD提权操作即可。
  (zpf1)
  # drbdsetup /dev/drbd0 primary
  #  mount  /dev/drbd0 /data
  # cd /data
  # touch 6 7 8 9 10
  # ls
  --------------
  1  10  2  3  4  5  6  7  8  9  lost+found
  --------------
  # service drbd status
  --------------
  drbd driver loaded OK; device status:
  version: 8.4.3 (api:1/proto:86-101)
  GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@drbd2.example.com,
   
  2013-05-27 20:49:06
  m:res  cs         ro                 ds                 p  mounted  fstype
  0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4
  --------------

   (zpf)
   # service drbd status
   ---------------
   drbd driver loaded OK; device status:
   version: 8.4.3 (api:1/proto:86-101)
   GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@drbd1.example.com,
   
   2013-05-27 20:45:19
   m:res  cs         ro                 ds                 p  mounted  fstype
   0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C
   
   DRBD大功告成。。。




安装完成之后,启动corosync:

service corosync start

启动完后,进入crm命令行模式配置corosync的资源:
首先查看下drbd是由那个服务提供的:
[root@zpf1 source]# crm
crm(live)# ra
crm(live)ra# providers drbd
linbit      ###由此看出,是由linbit提供的服务
crm(live)ra# cd ..
crm(live)# configure       ##进入配置模式

在此注意rpm包安装的和源码编译安装的配置稍有不同,源码编译的需要指定配置文件
###这个是针对rpm包安装的,用此配置
crm(live)configure# primitive mydrbd ocf:linbit:drbd params drbd_resource=r0 op start timeout=240 op stop timeout=100 op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20   
###下面这个是针对源码编译包的,用这个配置
crm(live)configure# primitive mydrbd ocf:linbit:drbd params drbd_resource=r0 drbdconf=/usr/local/etc/drbd.conf op start timeout=240 op stop timeout=100 op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20

###上述配置是定义一个名叫mydrbd的资源,属于ocf:linbit:drbdde ,配置文件中资源名称叫做r0(这个需要跟配置文件中的名字一样),启动超时时间是240s。停止超时间是100s,并且这个资源需要为主从,主上的监听超时时间是20sinterval时间是10s,从上的超时时间是20s,interval时间是20s(这个需要比主上时间大一些)
crm(live)configure# master ms_mydrbd mydrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
###上述配置的是定义主从资源ms_mydrbd,是mydrbd资源的克隆,住资源只能有1个,能同时做主节点的只有一个,克隆的个数是2个,从节点只能有1个 打开提醒功能
crm(live)configure#verify   ###检测下配置是否有问题
crm(live)configure#commit   ###没问题就可以提交,就会启动
crm(live)configure#show    ##查看下我当前的配置
node zpf1 \
        attributes standby="off" maintenance="off"
node zpf2 \
        attributes standby="off"
primitive httpd lsb:httpd \
        meta target-role="Stopped" \
        op monitor interval="30s" timeout="20s" \
        op start timeout="60" interval="0" \
        op stop timeout="60s" interval="0"
primitive mydrbd ocf:linbit:drbd \
        params drbd_resource="r0" \
        op start timeout="240" interval="0" \
        op stop timeout="100" interval="0" \
        op monitor role="Master" interval="10" timeout="20" \
        op monitor role="Slave" interval="20" timeout="20"
primitive webip ocf:heartbeat:IPaddr \
        params ip="192.168.191.130" \
        op monitor interval="30s" timeout="20s" \
        op start timeout="60s" interval="0" \
        op stop timeout="60s" interval="0" \
        meta target-role="Stopped"
ms ms_mydrbd mydrbd \
        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Started"
colocation httpd_web inf: httpd webip
order httpd_after_ip inf: webip httpd
property $id="cib-bootstrap-options" \
        dc-version="1.1.10-14.el6-368c726" \
        cluster-infrastructure="classic openais (with plugin)" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
  no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="100"
  
  
上述的drbd高可用配置就完成了,但是,文件系统却是不会自动挂载的,只能是手动挂在,再次我们在将其配置成自动挂载的高可用drbd文件系统

crm(live)configure# primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/data fstype=ext4 op start timeout=60 op stop timeout=60
crm(live)configure# verify ##确认配置没问题即可,不要提交,drbd只有主节点能挂载,所以要配置约束信息,即mystore和ms_mydrbd运行于同一节点

crm(live)configure# colocation mystore-with-ms_mydrbd inf:  mystore ms_mydrbd:Master ##定义这两个资源必须在一起运行(drbd的主),这个主意在inf:  与后边的设备有空格否则语法错误
crm(live)configure# verify
crm(live)configure# order mystore_with_ms_mydrbd mandatory: ms_mydrbd:promote mystore:start  ##定义这两个资源的启动顺序,必须是ms_drbd启动完成才会启动mystore挂载。
crm(live)configure# verify
crm(live)configure#commit   ##提交成功后,就会发现drbd启动成功,并且已经挂在至/data目录下


自动挂载文件系统出问题
若是出现drbd文件系统不能挂载,连个节点同时都为Slave状态,则需要重新创建下drbd设备,并且强制某个节点的drbd为主节点,具体操作如下:
首先停止corosync服务:
service corosync stop (这个两个几点都需要停止)
drbdadm create-md r0    ##重新制作drbd设备

之后启动drbd服务:
service drbd start  ##两个节点都需要执行
节点启动起来后,查看下节点状态
cat /proc/drbd   或者 service drbd status  ,,,状态如下,就证明两个节点可以正常通信,
[root@zpf /]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@zpf, 2015-08-10 09:54:46
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:152 dw:152 dr:0 al:0 bm:3 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

之后对任意一个节点设置成主节点,并进行一次挂载(挂载不做也可)
drbdadm primary r0 --force    ##在任意一个节点上执行就可以,按照提示输入两次yes即可
之后挂载这个文件系统,
mount -t ext4 /dev/drbd0  /data  即可,
之后,在卸载,然后停止drbd服务,在重新启动corosync服务,看是否能够自动挂载成功

加载自动启动mysql
在此我用的mysql5.1.62的版本的,,高版本的与低版本的就是配置时新版本开始使用cmake的配置方式,
我此处是旧版本的,所以配置依旧是原来的配置,配置参数如下:
./configure --with-big-tables --with-plugins=partition,innobase --with-charset=utf8

首先记着安装好所需要的开发工具包,配置完成后,直接make &&make install即可,在此我用的默认的安装路径,软件将安装在/usr/local下的目录中。
安装完成后,在源码包中复制一份mysql的配置文件到/etc下面

cp -a support-files/my-large.cnf  /etc/my.cnf
修改下/etc/my.cnf 配置:
在[mysqld]的模块下添加datadir=/data/mysqldata       ###指定数据的存储目录

复制mysql的启动脚本到/etc/init.d中。
cp -a /usr/local/share/mysql/mysql.server  /etc/init.d/mysql

之后启动corosync服务,自动挂上drbd设备。注意,在主节点上执行下列命令,出始化数据库:
/usr/local/bin/mysql_install_db --defaults-file=/etc/my.cnf  --datadir=/data/mysqldata/ --user=mysql

操作完后,启动数据库,简单测试下:service mysql start,登录数据库进行简单测试
之后,停止mysql服务,service mysql stop,进入crm命令行配置高可用的mysql
crm(live)configure# primitive mysql lsb:mysql op start timeout=20 op stop timeout=30 op monitor interval=10 timeout=20
        ##定义启动超时时间为20,停止超时为30 监控时间为10,监控超时为20
crm(live)configure# colocation mysql-with-mystore inf: mysql mystroe    ##定义mysql和mystroe在一起运行
crm(live)configure# order mysql-with_mystore Mandatory: mystroe:start mysql    ##定义mystore和mysql的启动顺序,先启动mystore
crm(live)configure# verify   ##验证上述的配置是否正确,没有提示就是正确
crm(live)configure# commit   ##提交配置,并且会起动

看看mysql服务是否会在节点上启动,登录进行测试吧。

绑定vip,使用ip远程访问mysql数据库

既然是做高可用,那么mysql随时有可能会切换到另一台机器,所以,在此我们就可以用vip的方式让其跟随的mysql在想对应的节点上启动,
而用户就不会感到mysql进行了切换。只要mysql服务在,vip就跟随mysql启动,远程就能访问到

如下是操作步骤:
crm(live)configure# primitive mysql-vip1 ocf:heartbeat:IPaddr params ip=192.168.1.230 nic=eth0 cidr_netmask=24 op start timeout=20 op stop timeout=30 op monitor timeout=20 interval=20
crm(live)configure# colocation mysql-vip_with_mysql inf: mysql-vip mysql   ##定义这两个服务在一起运行
crm(live)configure# order mysql-vip-with-mysql Mandatory: mysql:start mysql-vip  ##定义mysql启动完成在启动mysql-vip

crm(live)configure# verify   ##验证上述的配置是否正确,没有提示就是正确
crm(live)configure# commit   ##提交配置,并且会起动


好了,到此mysql+drbd+corosync+pacemaker的高可用配置就可以使用了

在连个节点启动corosync服务,其他的服务会被corosync服务拉起来。并且,其他的服务,不用设置开机自起。
远程连接mysql 进行测试,切换节点之后,在此连接mysql,看是否能够连接成功


附上我的配置:
node zpf \
        attributes maintenance="off" standby="off"
node zpf2 \
        attributes standby="off" maintenance="off"
primitive mydrbd ocf:linbit:drbd \
        params drbd_resource="r0" drbdconf="/usr/local/etc/drbd.conf" \
        op start timeout="240" interval="0" \
        op stop timeout="100" interval="0" \
        op monitor role="Master" interval="10" timeout="20" \
        op monitor role="Slave" interval="20" timeout="20"
primitive mysql lsb:mysql \
        meta target-role="Started"
primitive mysql-vip ocf:heartbeat:IPaddr \
        params ip="192.168.1.230" nic="eth0" cidr_netmask="24" \
        meta target-role="Started"
primitive mystroe ocf:heartbeat:Filesystem \
        params device="/dev/drbd0" directory="/data" fstype="ext4" \
        op start timeout="60" interval="0" \
        op stop timeout="60" interval="0" \
        meta target-role="Started"
ms ms_mydrbd mydrbd \
        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Started"
location prefer-httpd-and-webip httpd-and-webip \
        rule $id="prefer-httpd-and-webip-rule" 100: #uname eq zpf2
colocation mysql-vip-with-mysql inf: mysql-vip mysql
colocation mysql-with-mystore inf: mysql mystroe
colocation mystroe-with-ms_mydrbd inf: mystroe ms_mydrbd:Master
order mysql-vip_with_mysql Mandatory: mysql:start mysql-vip
order mysql_with_mystore Mandatory: mystroe:start mysql
order mystore-with-ms_mydrb Mandatory: ms_mydrbd:promote mystroe:start
property $id="cib-bootstrap-options" \
        dc-version="1.1.10-14.el6-368c726" \
        cluster-infrastructure="classic openais (with plugin)" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"














2015-08-14 16:37 举报
已邀请:
0

定海偶然

赞同来自:

不错!!!
0

迷城

赞同来自:

不错
0

lerchi

赞同来自:

corosync+pacemaker搭建能否共享下

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: