自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 956|回复: 0
打印 上一主题 下一主题

【学习笔记】负载均衡(二)

[复制链接]

85

主题

97

帖子

9829

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9829
跳转到指定楼层
楼主
发表于 2016-3-27 18:18:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
--
HA     
高可用集群   high   availablity
双机热备

    client
   
  VIP                     
              心跳   
  主 ------------------------》 备
  
  httpd           httpd

   脑裂  split-brain


心跳:主和备每隔一定时间会有一个通讯信息,称之为心跳;主要作用的就是备机监控主机是否alive;
心跳线:串口或者RJ-45连接
vip:浮动IP(虚拟IP),floating IP;谁接管服务,就在谁那里;它就是上层程序要访问的IP,如果主崩溃,备会使用send_arp的形式抢到vip。
vip是高可用集群的一种资源(resource)

脑裂: 当一些特殊情况,比如说心跳线(只有一根的情况)断了,主其实并没有崩溃,但是备机检测不到心跳,会认为主机崩溃,也会接管VIP。那么两边都会有VIP,脑裂就产生了。
或者如:心跳间隔为2秒,死亡时间为1秒,这种也会脑裂
         心跳间隔为2秒,死亡时间为4秒,但因为一些网络的原因,备机并没有在4秒内收到心跳,也会认为主挂掉,也会脑裂
brain-split
问题:如果做的是httpd的HA集群,那么这两个httpd家目录的内容要一致,方法有:
1,rsync远程实时同步(目录实时同步)  drbd(磁盘实时同步)   
2,共享存储(nfs,gfs2,ocfs2)   
3,分布式存储(mfs,hdfs,glusterfs)
等等

HA集群  只要是在/etc/init.d/下的服务都可以做HA集群

能做HA集群的软件很多,如
rhcs   (红帽集群套装,red hat cluster suite)
IBM    hacmp
heartbeat      keepalived    untralmonkey      piranha  等

=======================================================================

使用两台KVM实现heartbeat高可用httpd服务
         
    client

    vip 192.168.122.100
   master  ---  slave
   192.168.122.2     192.168.122.3

实验前准备:两台都做
1,关闭iptables,selinux,并一定做成开机也自动关闭
iptables -F
iptables -F -t nat
iptables -F -t mangle
/etc/init.d/iptables save
chkconfig iptables on
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
2,时间同步
rdate -s 192.168.122.1
3,主机名三步   一定要绑定/etc/hosts
192.168.122.2 master.cluster.com
192.168.122.3 slave.cluster.com
4,建议两边的网卡名字一致(如两边都为eth0,如果是克隆的虚拟机,可以使用udev改成一致)
5,把网卡IP配置成静态IP,并chkconfig NetworkManager off和chkconfig network on

第一大步:
两台上安装heartbeat(heartbeat相关的组件和依赖包都比较多)

# 笔记目录/arch/heartbeat_soft/ --我的软件包路径
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
repodata

把这个目录拷过去自己做yum源,再使用yum install heartbeat*安装到主和备两台机器上
--下面是我的完整yum配置(iso自动挂载到/misc/cd下,heartbeat_soft目录默认在根目录下)
[server]
name=server
baseurl=file:///misc/cd/Server
enabled=1
gpgcheck=0
[loadbalancer]
name=loadbalancer
baseurl=file:///misc/cd/LoadBalancer
enabled=1
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=file:///misc/cd/HighAvailability
enabled=1
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=file:///misc/cd/ScalableFileSystem
enabled=1
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=file:///misc/cd/ResilientStorage
enabled=1
gpgcheck=0
[heartbeat]
name=heartbeat
baseurl=file:///heartbeat_soft
enabled=1
gpgcheck=0



第二大步:先只在master上进行配置,配完后,再拷到slave上
安装完软件包后,配置文件默认会有模块在/usr/share/doc/heartbeat-3.0.4/下,需要拷到/etc/ha.d/下
cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/
cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/
cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/

1,修改主配置文件
# vim /etc/ha.d/ha.cf  
# cat /etc/ha.d/ha.cf |grep -v ^# |grep -v ^$
debugfile /var/log/ha-debug  --debug日志,一般来说不用开调试日志
logfile /var/log/ha-log  --日志
logfacility     local0  --日志设备,但需要在/etc/rsyslog.conf里去配置
keepalive 2    --心跳时间
deadtime 10    --心跳死亡时间,也就是说多少秒收不到心跳认为死亡
warntime 6   --收不到心跳后多少秒,会在日志里写入一个警告,必须小于deadtime
initdead 20 --特殊情况网络重启多少秒后,才开始计算上面的心跳,防止网络初始化还没有完毕,就到了心跳死亡时间,会造成认为死亡的错误结果
udpport 694    --端口
ucast eth0 192.168.122.3 --使用点播方式来进行心跳通迅,IP写的是对方的IP,而非本机IP(也可以选择组播,但我在rhel6.5上测试组播通迅有些不稳定的情况,会莫名其妙出现脑裂情况)
auto_failback on --slave接管了服务,master重新启动后,会自动再次接管服务成为master
node    master.cluster.com
node    slave.cluster.com --master和slave的主机名,注意要匹配uname -n

2,修改认证信息配置文件
#  vim /etc/ha.d/authkeys
auth 1   --表示使用第一种认证方式
1 crc  
--注意:此文件需要权限为600(root可读可写),否则后面启heartbeat启不来
# chmod 600 /etc/ha.d/authkeys
--验证方式从crc,md5,sha1顺序,安全性越来越高,但消耗的资源越高;如果架构物理网络是内网比较安全,用第一种就可以了

3,修改资源配置文件
# vim /etc/ha.d/haresources  --在最后加上下面一句配置
master.cluster.com IPaddr::192.168.122.100/24/eth0:0 httpd
--前面的主机名为master的主机名 192.168.122.100/24为浮动IP  eth0:0是表示获得浮动IP的网卡号  httpd是表示高可用的服务
master配置完毕

第三大步slave的配置

1,因为主和备的配置完全相同,所以到配置文件SCP到slave,不用做任何修改
# scp /etc/ha.d/ha.cf 192.168.122.3:/etc/ha.d/
# scp /etc/ha.d/authkeys 192.168.122.3:/etc/ha.d/
# scp /etc/ha.d/haresources 192.168.122.3:/etc/ha.d/
2,在备这边把验证配置文件的权限也改为600
# chmod 600 /etc/ha.d/authkeys

3,修改slave端的ha.cf配置文件
# vim /etc/ha.d/ha.cf  --修改slave端的ha的主配置文件
ucast eth0 192.168.122.2  --把IP换成master的IP

--注意:如果你用的是组播,就不需要做修改对方IP的操作。但我这里做的是点播,所以才需要修改。

第四大步:测试HA集群
测试前要注意:
验证1,因为本实验高可用的服务为httpd,所以两台上要装上httpd服务
yum install httpd* -y
验证2,但注意先不用启动httpd,只在两台写上不同的主页文件方便测试
# echo 'master' > /var/www/html/index.html
# echo 'slave'  > /var/www/html/index.html

验证3,启动heartbeat服务  /etc/init.d/heartbeat   start (--不需要手动启动httpd)
master  和  slave都要启
验证4,查看master是否获得浮动IP     eth0:0 192.168.122.100
      查看master是否帮你启动了httpd服务   lsof -i:80

验证5, 测试备是否能接管服务
在master  ifconfig eth0 down
然后在 slave端查看是否获得浮动IP eth0:0 192.168.122.100
验证6,测试master恢复正常后,是否自动能够再接管回来
在master  ifconfig eth0 up
然后过几秒发现master端又抢回来了浮动IP  eth0:0 192.168.122.100

验证7, 手工进行资源的切换
#/usr/share/heartbeat/hb_standby   --手工把资源让给另一台
#/usr/share/heartbeat/hb_takeover  --手工把资源从另一台抢过来
--这两个命令以前有些版本是在/usr/lib/heartbeat/下


验证8,验证脑裂split-brain
现在虚拟机环境下无法通过剪断网线来模拟线的故障(而不是网卡的故障)
但如果是关掉网卡,比如关掉主上的网卡(单心跳线),VIP和资源肯定会跳到备上去,而主就一个网卡都断掉了,主也没有资源了,这就是切换了,而不是脑裂

可以尝试在从slave服务器上写下面一句iptables规则,把UDP的694的数据包丢掉,造成从slave收不到主master的心跳,但主并没有挂掉,会产生两边都会有资源的情况(就是脑裂)
# iptables -A INPUT -p udp --dport 694 -s 主的网卡IP -j DROP
使用iptables做到了脑裂的现象,在客户端可以使用下面两条命令多次测试
# arp -d 192.168.122.100  --在客户端把vip对应的mac地址记录去掉
# elinks -dump 192.168.122.100 --然后再连
多次测试的结果是有可能连到主master,也有可能连到从slave,所以脑裂的影响可以清楚的看到了

做完上面脑裂测试后还原的做法:在SLAVE上把iptables规则清除后,就可以自动还原到正常状态了

脑裂会造成连接不同的服务器,对后端共享存储的数据会造成不一致

防止脑裂的方式有很多:
双心跳线等(冗余)
fence

--可以使用下面的架构,就不会出现这种问题

    192.168.122.100   
      eth0:0  外网浮动IP
    192.168.122.2   192.168.122.3
   eth0---心跳----eth0     
   master             slave
      
   eth1---心跳----eth1
    192.168.100.2  192.168.100.3

把两台服务器关闭加一个网卡,做成双心跳
只要在两边的ha.cf多加一句ucast eth1 对方IP(如果是组播,就加一句mcast eth1 新组播地址),重启heartbeat就可以了
然后验证:
在从slave上
# iptables -A INPUT -p udp --dport 694 -s 主的其中一个网卡的IP -j DROP
结果:不会产生脑裂
如果是单心跳
在从slave上
# iptables -A INPUT -p udp --dport 694 -s 主的唯一网卡的IP -j DROP
结果:会产生脑裂
--所以双心跳线路是防止脑裂的一种方法


测试九,验证ipfail
  
  ping_group  节点1(192.168.122.4)  节点2(192.168.122.5)

    192.168.122.100   
      eth0:0  外网浮动IP
    192.168.122.2   192.168.122.3
   eth0---心跳----eth0     
   master             slave
      
   eth1---心跳----eth1
    192.168.100.2  192.168.100.3


验证这个情况:
1,单心跳线的情况,上图中不用看eth1对eth1这条心跳线;
  如果master上eth0挂,肯定资源会切换到slave
2,换成双心跳线,如果master上eth0挂,那么资源就不会切换到slave,因为只断了一根心跳
3,按上面的第2点的情况,如果VIP是eth0:0,也就是说就在eth0上,那么按照第2点讲的不切换就又不行了,因为eth0都挂了eth0:0也不能用了
4,所以这时候就可以让两边的eth0都ping一个IP(一般为网关).这样的话eth0挂掉,虽然他还有另一个心跳;但它会发现你ping不通这个IP了,而slave的eth0还能ping通这个IP,所以heartbeat软件就知道是你的网卡出了问题;
  就算你还有一个心跳没断,它仍然会把资源切换到slave
5,如果ping的这个IP挂了,master的eth0在这时也挂了,这时候,它无法判断你eth0网卡是否挂掉,也不会切换到slave;所以光ping一个IP还不行,你得使用ping_group去ping多个ip才行
6,如果你服务器有多网卡,或者vip不是使用的eth0:0,而是另外一个物理网卡;或者你所有的网卡都做了双网卡绑定(这样就避免了网卡坏掉的单点故障);那么上面5点情况你就都不用考虑了,也就是说用不着ipfail功能了

验证上面的过程
1,先把主和备这两台虚拟机各再加一个网卡
        192.168.122.100   
      eth0:0  外网浮动IP
    192.168.122.2   192.168.122.3
   eth0---心跳----eth0     
   master             slave
      
   eth1---心跳----eth1
    192.168.100.2  192.168.100.3

2,
两边的配置如下(因为用组播不是点播,所以两边配置完全一样)
在原来的ha.cf配置文件的基础上加上下面三句
ping_group group1 192.168.122.1 192.168.122.190  --这里找两个可以ping通的IP做测试,实际情况可以写网关,路由器等的IP  
respawn hacluster /usr/lib64/heartbeat/ipfail  --注意这个路径里为lib64,默认的是lib,所以需要改一下
apiauth ipfail gid=haclient uid=hacluster


3,验证过程:
在不加上面三句的情况下启动heartbeat服务,在master上ifconfig eth0 down,会出现不会切换资源,整个架构无法访问的情况
在加上上面三句的情况下启动heartbeat服务,在master上ifconfig eth0 down,会出现资源切换到从slave机,整个架构还是ok的情况。
所以ipfail的功能得以体现

测试十:验证看门狗(watchdog)
继续在上例的基础上(双心跳加ipfail),做下面测试
1,先在master上killall -9 heartbeat(不是服务器挂了,也不是网卡坏了,而是进程不正常的被kill),然后会出现脑裂的情况
(因为master上的heartbeat是被kill的,所以资源httpd和VIP不会被关闭,但进程没了,所以slave收不到心跳,也会抢资源,造成脑裂)

2,所以解决方法
下面步骤在两台上都做
# /etc/init.d/heartbeat stop
# vim /etc/ha.d/ha.cf
watchdog /dev/watchdog    --打开看门狗这句配置
# /etc/init.d/heartbeat start
# modprobe softdog --加载软件看门狗模块
# lsmod |grep softdog
softdog                 9941  2
# echo "10" > /proc/sys/kernel/panic --把时间改成10秒
--上面只是临时修改成10秒,重启后又会变为0
# vim /etc/sysctl.conf
kernel.panic = 10 --加上这一句
# sysctl -p  --使之生效

# chkconfig --add heartbeat
# chkconfig heartbeat on --一定要实现开机自启动,否则开机10秒后,会不断重启
上面的都做好后
#  在master上使用killall -9 heartbeat  杀掉所有heartbeat进程
#  然后等待十秒,master会自动重启,并且启动后,并从备机抢回资源(要求是配置了auto_failback on);如果抢不回来,可能是你的iptables或selinux没有设置开机自动关闭

测试十一:在主上只关闭httpd服务(不是关闭heartbeat)
可以利用shell辅助,如监控httpd,如果它挂了,则重启master机器等

==================================================================
上面的讲解并没有包含heartbeat的所有功能
还有如:
Stonith (shoot the other node in the head)
Ldirector (heartbeat集成lvs)

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

双心跳 + ipfail + watchdog + 双服务互为主备架构

        192.168.122.100   
      eth0:0  httpd浮动IP
    192.168.122.2   192.168.122.3
   eth0---心跳----eth0     
   master             slave
      
   eth1---心跳----eth1
    192.168.100.2  192.168.100.3
      eth1:0  mysqld浮动IP
       192.168.100.100
配置过程和上面一致
但是在haresources里面有两句了
master.cluster.com IPaddr::192.168.122.100/24/eth0:0 httpd
slave.cluster.com IPaddr::192.168.100.100/24/eth1:0 mysqld

yum install mysql* -y --安装mysql

两边重启heartbeat  --也是不需要启动mysqld服务,自动会帮你启动
/etc/init.d/heartbeat  restart

===============================================================================

drbd  
(distributed replicated block device) ,号称“网络raid-1“,开源,由linbit公司开发。
       网络
/dev/sdb   ----    /dev/sdc 1   

当数据写入本地的drdb磁盘上,会以相同的形式记录在通过网络连接的另一个drbd磁盘上
在高可用(HA)中使用DRDB功能,可以代替使用一个共享磁盘组。

rsync
共享存储
drbd
工作原理:
    文件系统
      |
                           |
    块设备层
        /dev/drbd0
      |
      |
      |
   |--------------------|
     本地磁盘   远程磁盘
   /dev/sdb1  /dev/sdb1

架构图:

   
    1.1.1.3  1.1.1.4
  本地磁盘  本地磁盘
  /dev/sdb1-------/dev/sdb1
   主      drbd技术  备
   主机名 drbd01  drbd02

第一步:在两台虚拟机3和4上都加一块磁盘  /dev/sdb   ,大小在这里自定义
并使用fdisk /dev/sdb  分一个/dev/sdb1出来,只partprobe(在rhel6就做partx -a)一下就行,不用去格式化;两边的sdb1最好一样大
或者不分/dev/sdb1也可以,那么后面就直接对/dev/sdb来做drbd

第二步:安装前准备
1,主机名
2,关闭iptables,selinux
3, 时间同步


第三步:安装drbd软件包(两边服务器都要做下面的步骤)
/share/soft/cluster/drbd-8.3.8.1.tar.gz
tar xf /share/soft/cluster/drbd-8.3.8.1.tar.gz -C /usr/src
cd /usr/src/drbd-8.3.8.1/

# ./configure  --编译需要一些依赖性(flex,gcc等)
# make rpm  --使用这条安装出rpm包,都会默认自动把rpm包放到/root/rpmbuild/RPMS/x86_64/下(rhel5下的路径为/usr/src/redhat);但如果是新安装的系统,/root/下的rpmbuild目录会不存在
--解决目录不存在的做法:
上面的make rpm命令虽然报错,但会在当前目录下产生drbd.spec
# rpmbuild -ba drbd.spec --这样去执行一下,报错
error: File /root/rpmbuild/SOURCES/drbd-8.3.8.1.tar.gz: No such file or directory
# ls /root/rpmbuild/  --虽然上一条命令报错,但下面的目录产生了
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
--然后就可以执行make rpm
# make rpm
# make km-rpm  --这一条就是编译出模块

# rpm -ivh /root/rpmbuild/RPMS/x86_64/drbd-*
--使用这条命令把它们都安装上

# modprobe drbd
# lsmod |grep drbd --确认模块存在,否则后面启不了服务



第四步:配置drbd
[root@drbd01 ~]# cp /usr/share/doc/drbd-utils-8.3.8.1/drbd.conf.example /etc/drbd.conf
cp: overwrite `/etc/drbd.conf'? y  --拷贝模版配置文件

[root@drbd01 ~]# vim /etc/drbd.conf --此配置文件比较复杂,下面只列出需要修改的地方
global {
    usage-count no;  --作者统计信息,改为no
}

common {
  syncer { rate 100M; }  --主备节点网络同步速率,改为100M
}
resource r0 {
   protocol C;  --可以换成B协议
   cram-hmac-alg "sha1";  
   shared-secret "FooFunFactory"; --设置主备机之间通信使用的信息算法
#handlers {  
# pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
# pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
#local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
# outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
 #}   --把handlers {} 全注释掉

  syncer {
    rate 100M;   --也改为100M
   #    after "r2";   --注释掉这句,因为我们这里只有一个资源
  }

  on drbd01 {   --注意drbd01是主机名
    device     /dev/drbd0;  
    disk       /dev/sdb1;
    address    1.1.1.3:7788;
    flexible-meta-disk  internal;
  }
  
on drbd02 {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   1.1.1.4:7788;
    meta-disk internal;
  }
}
--因为这里只定义一个资源(也就是只做一个网络raid1),所以把下面的resoucre r1 { }整个注释或者删除

# cat /etc/drbd.conf |grep -v "#"|grep -v ^$  --最后得到的配置文件如下
global {
    usage-count no;
}
common {
  syncer { rate 100M; }
}
resource r0 {
  protocol C;
  startup {
  }
  disk {
    on-io-error   detach;
  }
  net {
     cram-hmac-alg "sha1";
     shared-secret "FooFunFactory";
    after-sb-0pri disconnect;
    after-sb-1pri disconnect;
    after-sb-2pri disconnect;
    rr-conflict disconnect;
  }
  syncer {
    rate 100M;
    al-extents 257;
  }
  on drbd01 {
    device     /dev/drbd0;
    disk       /dev/sdb1;
    address    1.1.1.3:7788;
    flexible-meta-disk  internal;
  }
  on drbd02 {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   1.1.1.4:7788;
    meta-disk internal;
  }
}

--如果使用的是rhel6.3,把它的原配置文件/etc/drbd.conf清空,然后贴上上面的这一大段配置文件,你只需要修改IP和主机名(如果你的磁盘不用/dev/sdb1,使用/dev/sdb,那也改一下)
drbd02上的配置文件一样,所以这里直接scp过去
scp /etc/drbd.conf 1.1.1.4:/etc/

第五步:
drbd的启动

[root@drbd01 ~]# drbdadm create-md r0 --在两台主机的sdb1的分区,创建供drbd记录信息的数据块,两台都要做
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
[root@drbd02 ~]# drbdadm create-md r0
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.

[root@drbd01 ~]# /etc/init.d/drbd start --启动drbd服务,两边都启,只启一个的话启不来的
[root@drbd02 ~]# /etc/init.d/drbd start
# ps -ef |grep drbd --启完服务后,就会看到有三个进程
root     21420     1  0 15:51 ?        00:00:00 [drbd0_worker] --主进程
root     21433     1  0 15:51 ?        00:00:00 [drbd0_receiver] --从上的数据接收进程
root     21434     1  0 15:51 ?        00:00:00 [drbd0_asender] --主上的数据发送进程

# cat /proc/drbd   --两边都查看当前drbd状态;都是secondary表示没有主从之分,数据状态是inconsistent,表示不一致
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
0: cs:Connected st: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
        resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0

第六步:
所以下面要定义主从磁盘
--下面我把drbd01这台机的/dev/sdb1磁盘定义为主
[root@drbd01 ~]# drbdsetup /dev/drbd0 primary -o
[root@drbd01 ~]# cat /proc/drbd   --可以看到正在同步,第一次同步速度较慢(磁盘越大,速度越慢);现在可以看到状态为strimary/Secondary,数据状态同步完成后,就会变成UpToDate/UpToDate
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
0: cs:SyncSource strimary/Secondary ds:UpToDate/Inconsistent C r---
    ns:853552 nr:0 dw:0 dr:861728 al:0 bm:51 lo:1 pe:211 ua:256 ap:0
        [=>..................] sync'ed: 10.2% (7360/8188)M
        finish: 0:08:09 speed: 15,328 (15,976) K/sec
        resync: used:1/61 hits:53339 misses:53 starving:0 dirty:0 changed:53
        act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0

第七步:
现在可以把主机上的DRBD设备格式化并挂载使用,但是备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作
在主(drbd01)上的操作
[root@drbd01 ~]# mkfs.ext4 /dev/drbd0
[root@drbd01 ~]# mount /dev/drbd0 /mnt/
[root@drbd01 ~]# echo '123' > /mnt/123
[root@drbd01 ~]# echo '456' > /mnt/456  --创建两个文件,用于测试

在从 (drbd02)上的操作
[root@drbd02 ~]# /etc/init.d/drbd stop  --停服务
Stopping all DRBD resources: .
[root@drbd02 ~]# mount /dev/sdb1 /mnt/ --挂载/dev/sdb1
[root@drbd02 ~]# ls /mnt/
123  456  lost+found
[root@drbd02 ~]# cat /mnt/123
123
[root@drbd02 ~]# cat /mnt/456 --可以看到数据过来了,表示drbd工作OK
456

--这里验证数据是否同步到备要注意的有:
--如果你上面配置的是/dev/sdb而不是/dev/sdb1,那么在rhel5上,可以直接mount /dev/sdb /mnt;
--在rhel6上,需要指定文件系统类型mount -t ext4 /dev/sdb /mnt(如果格成ext3,就把ext4换成ext3就可以)



第8步:
drbd的主备切换,保持两边drbd服务是启动运行状态再进行下面操作
[root@drbd02 ~]# umount /mnt/
[root@drbd02 ~]# /etc/init.d/drbd start
--这两步是把第7步的操作给还原

在主(drbd01)上的操作
[root@drbd01 ~]# umount /dev/drbd0
[root@drbd01 ~]# drbdadm secondary r0  --drbd01上的降级操作

[root@drbd01 ~]# cat /proc/drbd  --查看状态,又成了Secondary/Secondary,两台机又都成了备机了
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
    ns:8650764 nr:0 dw:265160 dr:8385757 al:106 bm:585 lo:0 pe:0 ua:0 ap:0
        resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/257 hits:66184 misses:106 starving:0 dirty:0 changed:106

在从(drbd02)上的操作
[root@drbd02 ~]# drbdadm primary r0  --drbd02上的升级操作
[root@drbd02 ~]# cat /proc/drbd  --再次查看状态就是drbd02为主,drbd01为从
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
0: cs:Connected strimary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:8 dw:8 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
        resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0

切换过后,反向验证,也是OK的,步骤如下
[root@drbd02 ~]# mount /dev/drbd0  /mnt
[root@drbd02 ~]# ls /mnt/
123  456  lost+found
[root@drbd02 ~]# echo 789 > /mnt/789
--在drbd02上挂载,再写一个文件789

[root@drbd01 ~]# /etc/init.d/drbd stop
Stopping all DRBD resources: .
[root@drbd01 ~]# mount /dev/sdb1 /mnt/
[root@drbd01 ~]# ls /mnt/
123  456  789  lost+found
--在drbd01上停服务,挂载/dev/sdb1,查看数据也同步过去了
[root@drbd01 ~]# umount /mnt/
[root@drbd01 ~]# /etc/init.d/drbd start
--再把drbd01上把服务启起来


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

drbd+heartbeat+mysql

     client    1.1.1.1 (真实机)
       |
       |
                 heartbeat
             vip 1.1.1.5      
mysql   mysql
1.1.1.3          1.1.1.4
         /dev/sdb1 ------ /dev/sdb1
     drbd技术

--两台/dev/sdb1挂载到mysql的datadir

安装过程,在上面的基础上两台机安装heartbeat,可以使用centos的rpm版
的heartbeat(这个是需要去ceotos的站点去下载。www.mirror.centos.org);
但是如果是去www.linux-ha.org下载heartbeat包,则是源码版,并且编译过程有点特殊

1,安装heartbeat
过程省略

=====================================================

第二步:修改配置文件,只有haresources这个配置文件有点特殊
# vim /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 10
warntime 6
initdead 120
udpport 694
ucast eth0 1.1.1.4
auto_failback on
node drbd01
node drbd02

# vim /etc/ha.d/authkeys
auth 1
1 crc
# chmod 600 /etc/ha.d/authkeys

# vim /etc/ha.d/haresources
drbd01  IPaddr::1.1.1.5/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext4 mysqld
--定义drbd01为主,浮动IP为1.1.1.5/24   
drbddisk::r0    --r0为/etc/drbd.conf里定义的资源名 
自动挂载/dev/drbd0 到/data    --/data为两个mysqld数据库的/datadir
调度的服务为mysqld  (也就是rpm版mysql)

--把配置好的三个配置文件拷到从
# scp /etc/ha.d/ha.cf drbd02:/etc/ha.d/
# scp /etc/ha.d/authkeys drbd02:/etc/ha.d/
# scp /etc/ha.d/haresources drbd02:/etc/ha.d/
--因为做的是点播,所以要修改从上的配置文件
# vim /etc/ha.d/ha.cf
ucast eth0 1.1.1.3  --改成主的IP
# chmod 600 /etc/ha.d/authkeys
====================================================

第三步:安装mysql,并修改好对应的数据目录
mysql使用rpm版来做
两边都要mkdir /data
chown mysql.mysql /data
vim /etc/my.cnf
datadir=/data  --把datadir改为/data

两边的/etc/hosts都写好双方的主机名和IP对应
两边mysql不需要启动(初始化都可以不需要)

======================================================

第四步:启服务进行验证
保证drbd服务是启动运行状态 
mysqld 服务是关闭状态
然后两边启动heartbeat

验证:会自动在主上把/dev/drbd0挂载到/data上,并保存mysqld的数据

--因为我这里的mysql数据是新的,所以在主上登录,并授权一个用户,用于远程登录测试
mysql> grant all on *.* to 'li'@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;

--客户端使用下面命令登录VIP进行测试
# mysql -h 1.1.1.5 -u li -p123

验证heartbeat高可用;  在主上/etc/init.d/network stop 停网络模拟主崩溃;
就会发现原来的从机得到了 vip, 并且自动把/dev/drbd0挂载到/data上,数据和主上的一样

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2024-11-22 20:24 , Processed in 0.038109 second(s), 10 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表