Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。heartbeat的核是心跳监测和资源接管,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。

   heartbeat+drbd在Linux下创建一个高可用(HA)的集群服务器。DRBD是一种块设备,可以被用于高可用(HA)之中。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。因为数据同时存在于本地主机和远程主机上。切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。




准备三台虚拟机:
172.25.85.2  server2.example.com
172.25.85.3  server3.example.com
172.25.85.4  server4.example.com


 

1.heartbeat的配置:
   在server2和server3上:
   yum  install  heartbeat-3.0.4-2.el6.x86_64.rpm      

                       heartbeat-devel-3.0.4-2.el6.x86_64.rpm    

                       heartbeat-libs-3.0.4-2.el6.x86_64.rpm             
                       ldirectord-3.9.5-3.1.x86_64.rpm                
   
   server2:
   cd /usr/share/doc/heartbeat-3.0.4
   cp ha.cf haresources  authkeys /etc/ha.d
   cd /etc/ha.d
   vim ha.cf

wKiom1ejWTuAFwZEAABLyGq0TNI870.png-wh_50

wKiom1ejW2PC_bFkAABSbHy3Jh0955.png-wh_50

wKiom1ejWUDzMB7bAABaMpKLPBU795.png-wh_50

wKioL1ejWUCSBIGzAAAxmZpQhcc067.png-wh_50

##写在前面的节点,优先级高。


logfacility local0
日志等级,默认值
keepalive 2
心跳频率,自己设定.1:表示 1 秒
deadtime 30
节点死亡时间阀值,就是从节点在过了 30 后还没有收到心跳就认为主节点死亡
warntime 10
发出警告时间
initdead 120
守护进程首次启动后应该等待 120 秒后再启动主服务器上的资源
udpport 694
心跳信息传递的 udp 端口,使用端口 694 进行 bcast 和 ucast 通信
baud 19200
串口波特率,与 serial 一起使用。
serial /dev/ttyS0
采用串口来传递心跳信息。
bcast eth0
采用 udp 广播播来通知心跳
auto_failback on
当主节点恢复后,是否自动切回
stonith baytech /etc/ha.d/conf/stonith.baytech
stonith 用来保证共享存储环境中的数据完整性
watchdog /dev/watchdog
watchdog 能让系统在出现故障 1 分钟后重启该机器,这个功能可以帮助服务器在确实停止心
跳后能够重新恢复心跳。 如果使用该特性,修改系统中/etc/modprobe.conf, 添加如下行
options softdog nowayout=0
这样在系统启动的时候,在内核中装入"softdog"内核模块,用来生成实际的设备文件
/dev/watchdog
node server2.example.com   (只能域名)
主节点名称,与 uname –n 保持一致。排在第一的默认为主节点,所以不要搞措顺序
node server3.example.com   
副节点名称,与 uname –n 保持一致
ping 172.25.45.250
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
默认 heartbeat 并不检测除本身之外的其他任何服务,也不检测网络状况。
所以当网络中断时,并不会进行 Load Balancer 和 Backup 之间的切换。
可以通过 ipfail 插件,设置'ping nodes'来解决这一问题,但不能使用一个集群节点作为
ping 的节点。




   vim haresources
wKioL1ejWsXy_dXGAAATf2SIzDQ314.png-wh_50

server2.example.com  IPaddr::172.25.85.100/24/eth1  mysqld

##172.25.85.100是虚拟ip

这个文件中定义了实现集群所需的各个软件的启动脚本,这些脚本必须放在/etc/init.d 或者
/etc/ha.d/resource.d 目录里 IPaddr 的作用是启动 Virutal IP,它是 HeartBeart 自带的一个
脚本;mysqld 是 mysql服务的启动脚本。


   vim authkeys
wKiom1ejWy3hc9WMAAANdhpNMYY719.png-wh_50

auth 1
1 crc




   chmod 600 authkeys                          ##仅超级用户可以读写

   cd   /etc/ha.d

   scp ha.cf haresources authkeys 172.25.85.3:/etc/ha.d/
   /etc/init.d/heartbeat start
   tail -f /var/log/messages


检测:
    在server2上:
   /etc/init.d/heartbeat  start
   /etc/init.d/mysqld  start

   mysql可以登陆
   
 
    在server2上:
  /etc/init.d/heartbeat stop
    无法登录mysql:
    而server3上可以登陆:




 



2.heartbeat&磁盘:
 

   建立共享分区:
  在server4上:
  分配4G的虚拟磁盘
  yum install  scsi-target-utils-1.0.24-10.el6.x86_64  -y
   /etc/init.d/tgtd start
 
  fdisk -l
  vim /etc/tgt/targets.conf

<target iqn.2016-06.com.example:server.disk>
    backing-store /dev/vdb                              ##/dev/vdb就是刚刚分出来的新硬盘
    initiator-address 172.25.85.2
    initiator-address 172.25.85.3
</target>    

  tgt-admin -s  



   在server2和server3上:
  yum install iscsi-initiator-utils.x86_64  -y

 
  iscsiadm  -t st -m discovery  -p 172.25.85.4
  iscsiadm  -m node -l                                    

  ##共享分区就建立好了,在server2和server3上会出现两个新的磁盘/dev/sda
  cat /proc/partitions                                       ##查看分区是否共享

   

 
   server2:
   fdisk -cu /dev/sda               ##(删除多于分区,然后创建一个新的2G的主分区)
   cat  /proc/partition
   mkfs.ext4  /dev/sda1
   vim haresources

server2.example.com  IPaddr::172.25.85.100/24/eth1  
                   Filesystem::/dev/sda1::/var/lib/mysql::ext4 mysqld

    scp haresources 172.25.85.3:/etc/ha.d/
    /etc/init.d/mysqld  stop
    mount /dev/sda1  /mnt
    cd /var/lib/mysql
    cp  -rp  *  /mnt
    chown  mysql.mysql   /mnt
    umount /mnt
    /etc/init.d/heartbeat  stop
    tail -f /var/log/messages


     在server3上:
    partprobe                                               ##会同布出server1上进行的分区
    cat /pros/partitions



检测:在server2:
    /etc/init.d/heartbeat  stop
    df                                  ##/dev/sda1自动挂载到了/var/lib/mysql
wKiom1ejXN2hrkWbAABQBApoexM881.png-wh_50

    ip addr show                        ##虚拟地址出现在server3上
wKiom1ejXQDiOtMbAACP-cC-Wd0492.png-wh_50
    在server3上:/etc/init.d/heartbeat stop      
    在server2上, /dev/sda1自动挂载到了/var/lib/mysql,虚拟地址出现在server2上






给server2和server3都分配4G虚拟磁盘
3. 编译drbd
      因为此次用的是之前的虚拟机,所以需要关闭一些进程:     ##如果是新的虚拟机 则不需要
     在server2和server3上:
   /etc/init.d/iscsi stop
   chkconfig --list iscsi  ##iscsi的进程都关闭
   /etc/init.d/heartbest  stop

      在server2上:
    cd /root
    tar zxf  drbd-8.4.3.tar.gz
    cd  drbd-8.4.3
    yum install flex gcc rpm-build  kernel-devel -y
    cp /root/drbd-8.4.3.tar.gz  /root/rpmbuild/SOURCES/
   ./configure  --enable-spec --with-km
    rpmbuild -bb drbd.spec        ##编译drbd要在/root/drbd-8.4.3目录下
    rpmbuild -bb drbd-km.spec
    cd /root/rpmbuild/RPMS/x86_64
    rpm -ivh *
    scp * root@172.25.85.3:
    cd  /etc/drbd.d/
    vim example.res                ##创建以.res结尾文件

resource sqldata{
   meta-disk internal;
   device /dev/drbd1;
syncer{
      verify-alg  sha1;
}
on server2.example.com{
   disk /dev/vdb;
  address 172.25.85.2:7789;
}
on server3.example.com{
   disk /dev/vdb;
  address 172.25.85.3:7789;
}





    scp example.res  root@172.25.85.3:/etc/drbd.d/
    drbdadm create-md sqldata
    /etc/init.d/drbd  start                       ## server3也进行相同的操作,和server2同时完成
    drbdadm primary sqldata  --force         
    cat /proc/drbd
 wKioL1ejXcGwHhsxAABtZRfadCM097.png-wh_50
    
   
 
    

    在server3上:
    cd /root
    yum install drbd-*
    drbdadm create-md sqldata      ##和server2上的这个步骤同时进行
   /etc/init.d/drbd  start
    cat /proc/drbd

wKiom1ejXeeQlH3XAABMq91xvuc580.png-wh_50 
   

4.  server2:
    mkfs.ext4 /dev/drbd1
    mount /dev/drbd1  /mnt/
    cd /var/lib/mysql/
    cp -rp * /mnt
    chown  mysql.mysql /mnt
    cp /etc/passwd  /mnt
    umount /mnt
    drbdadm secondary sqldata
    cat /proc/drbd


    cd /etc/ha.d/
    vim haresources
server1.example.com IPaddr::172.25.85.100/24/eth1  drbddisk::sqldata Filesystem::/dev/drbd1::/var/lib/mysql::ext4 mysqld
    scp /etc/ha.d/haresources  root@172.25.85.3:/etc/ha.d/
    /etc/init.d/heartbeat start
    tail -f /var/log/messages
    cat /prpc/drbd

   发现,172.25.85.100出现在server2上
   /dev/drbd1 自动挂载到/var/lib/mysql

 



   server3:
   mkfs.ext4 /dev/drbd1
   drbdadm primary sqldata
   mount /dev/drbd1 /mnt
   cd /mnt                     
  /etc/init.d/heartbeat start