自由论坛

标题: 【学习笔记】高可用集群(一) [打印本页]

作者: prostar    时间: 2016-4-17 18:36
标题: 【学习笔记】高可用集群(一)
ha+lb
heartbeat+ldirector
keepalived
piranha


  www.keepalived.org

  lvs + ha
是一个双机热备软件,它可以很好的和LVS进行集成


--下面的架构需要4台虚拟机,主DR和备DR用双网卡,建议使用两个内网来做,以免使用桥接网络会造成IP冲突(用vmware或kvm都可以)

           client  (宿主机)
        1.1.1.1
    |
    |   
    |
   VIP eth0:0  1.1.1.2
       心跳
  1.1.1.3     eth0---------eth0   1.1.1.4
  master  DR   slave  DR  
2.2.2.3    eth1---------eth1    2.2.2.4   
        心跳
   VIP eth1:0  2.2.2.2
    |
    |
    |
  |-------------------------------|
  web1    web2
   2.2.2.5    2.2.2.6

准备工作
1,主机名绑定
2.2.2.1         li.cluster.com
2.2.2.3         master.cluster.com
2.2.2.4         slave.cluster.com
2.2.2.5         web1.cluster.com
2.2.2.6         web2.cluster.com
2,时间同步
3,关闭iptables,selinux,并设置开机不自动启动
4,配置yum
5,配置静态IP并chkconfig NetworkManager off和chkconfig network on
6,建议两边的网卡名字一致(如两边都为eth0,如果是克隆的虚拟机,可以使用udev改成一致)

准备好架构后
第一大步:
主和备DR上都安装keepalived
软件包路径
笔记目录/arch/keepalived_soft/keepalived-1.2.19.tar.gz

# yum install ipvsadm net-snmp* *libnl* -y  (两台在编译前先安装相关的依赖性)

Master DR-> tar xvf keepalived-1.2.19.tar.gz -C /usr/src/
Slave DR-> tar xvf keepalived-1.2.19.tar.gz -C /usr/src/
Master DR-> cd /usr/src/keepalived-1.2.19/
Slave DR-> cd /usr/src/keepalived-1.2.19/
Master DR-># ./configure  --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/`uname -r`/ --with-kernel-version=2.6 --enable-snmp --enable-profile --enable-sha1
make  ;make install
Slave DR-># ./configure  --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/`uname -r`/ --with-kernel-version=2.6 --enable-snmp --enable-profile --enable-sha1

# make ;  make install
--with-kernel-dir的参数是和LVS集成必须的编译参数,后面接的是内核源码目录;如果内核目录没有的话,就yum install kernel-devel  -y

下面的步骤是主DR和备DR都要做的
   cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ --拷贝服务脚本
   cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  --拷贝全局配置文件
   mkdir /etc/keepalived
   cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/--拷贝主配置文件
   cp /usr/local/keepalived/sbin/keepalived /usr/sbin/  --拷贝命令
/etc/init.d/keepalived   restart   --看服务是否可以启动,能启动表示OK


第二步:修改主备DR的配置文件
在配置前先把主DR和备DR的ipforward打开
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

主DR 配置文件
Master DR->vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
        root@master.cluster.com  --email通知,可选,可以写上一个外部邮箱,这里随便写个本机的(保证本机的postfix是启动状态)
   }
   notification_email_from root@master.cluster.com --以哪个邮箱身份去发送
   smtp_server 127.0.0.1 --邮件服务器IP
   smtp_connect_timeout 30
   router_id LVS_DEVEL  --同一个局域网内注意要唯一。用hostonly网段做实验的话保持默认就好了
}
vrrp_instance VI_1 {  --定义整个VRRP(virtual router reduntancy protocol)实例
    state MASTER  --主DR要为MASTER,并大写
    interface eth0  --提供服务的网卡,在我这里是外网网卡
    lvs_sync_daemon_interface eth0   --指定它为一个心跳网卡
    virtual_router_id 51 --ID值,主DR和备DR要一致  ; 这里要特别注意;如果都在同一个网段,每个人的ID值请使用不同的,以免冲突(范围为1-255,不能超过这个范围)
    priority 100  --优先级,主DR要大于备DR
    advert_int 1  --主备同步的时间间隔
    authentication {
        auth_type PASS --验证类型,还有一种验证类型为AH
        auth_pass 1111 --验证字符串
    }
    virtual_ipaddress {  --vip,多个分行写。我这里是NAT架构,所以有两个vip。但是不能都写在一个vrrp_instance里,否则这两个vip就都在eth0上产生,与我的架构不符
        1.1.1.2/24  
    }
}

vrrp_instance VI_2 { --实例2
    state MASTER
    interface eth1   --第二个服务网卡,也是我的内网
    lvs_sync_daemon_interface eth1 --第二个心跳网卡
    virtual_router_id 52  --换一个router_id
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        2.2.2.2/24  --这样写就实现了1.1.1.1这个VIP在eth0,2.2.2.2这个VIP在eth1
    }
}

virtual_server 1.1.1.2 80 { --1.1.1.2为调度VIP,80端口
    delay_loop 6 --健康检查时间间隔
    lb_algo rr --调度算法
    lb_kind NAT --NAT类型
    nat_mask 255.255.255.0
    protocol TCP --TCP协议
    real_server 2.2.2.5 80 { --调度2.2.2.5这台real server 的80端口
        weight 1  --权重
        TCP_CHECK {  --健康检查的方式为TCP端口连接
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80 --健康检查的连接端口为80
        }
    }
    real_server 2.2.2.6 80 {
        weight 1
        TCP_CHECK {  
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}


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


备DR的配置文件
和主的几乎一样,只用修改两个地方
--因为我是双心跳,有两个vrrp_instance,所以两个实例都要改下面的两个地方
state  BACKUP --state改为BACKUP,指定为备

priority 99 --优先级数字要小于你的主DR的数字

--如果你实验的备DR虚拟机是克隆的,可能网卡为(eth1和eth2),那么还需要把网卡也对应的改一下就可以了(eth0改成eth1,对应主DR的eth0;eth1改为eth2对应主DR的eth1)

第三步:配置real server
1,写上不同的主页,方便测试
2,/etc/init.d/httpd start
3,默认网关指向2.2.2.2 --也就是NAT架构内网的VIP

第四步:重启主DR和备DR的keepalived服务
/etc/init.d/keepalived restart
重启后
1,使用ip addr命令查看 主DR eth0是否获取到了1.1.1.2/24和eth1是否获取到了2.2.2.2/24这两个VIP
--只能使用ip addr命令查看,使用ifconfig命令是查看不到的
最后在client elinks 1.1.1.2 发现调度成功,或者在主DR使用ipvsadm -ln 查看调度情况

2,停掉web1的httpd,在客户端elinks 1.1.1.2发现只调度web2,当启动web1后,又会调web1和web2,说明检康检查也OK

3, 在主DR上/etc/init.d/network stop (最好是由静态IP才好测试,或者是把keepalived服务停掉),停掉网络,备DR过几秒就能抢到两个vip,并且调度也OK
--注意这里有一个问题:如果只把主DR上的一个网卡停掉,那么只有一个VIP会跳到备DR,就会造成主DR和备DR一人一个VIP的情况,那么整个架构也会出现问题(我们可以用脚本监控这两个网卡,如果一个挂掉,则把另一个也挂掉)
--如果你的网卡都做了双网卡绑定,你就几乎可以不用考虑网卡坏掉的问题。

4,主DR上/etc/init.d/network start ,再次启动网络,过几秒又自动抢回两个vip,调度OK

-------------------------------------------
另一种healthcheck方式
下面只列出检查健康有关的配置,其它没列出来的和上面的一样
    real_server 2.2.2.5 80 {
        weight 1
        HTTP_GET {  --健康检查的方式为http协议的get方式
             url {
              path /test.html --会去检查real_server的家目录是否有test.html文件
              digest b575527de5b4ba1881f1b14e50016eab --检查2.2.2.5上web家目录里的test.html的md5值,在2.2.2.5上由md5sum命令得出
             }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
        }
    }
    real_server 2.2.2.6 80 {
        weight 1
        HTTP_GET {
             url {
              path /test.html
              digest 0dcdc06c7c61f6e9da0496b1872fc2d5
             }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
        }
    }
}

用这种检查方式:会在后端的real server里看到检查日志
tail /var/log/httpd/access_log --可以看到每6秒就会检查一次
2.2.2.3 - - [29/Oct/2014:12:04:09 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"
2.2.2.4 - - [29/Oct/2014:12:04:13 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"
2.2.2.3 - - [29/Oct/2014:12:04:15 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"
2.2.2.4 - - [29/Oct/2014:12:04:19 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"
2.2.2.3 - - [29/Oct/2014:12:04:21 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"
2.2.2.4 - - [29/Oct/2014:12:04:25 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"
2.2.2.3 - - [29/Oct/2014:12:04:27 +0800] "GET /test.html HTTP/1.0" 200 - "-" "KeepAliveClient"


--大量的这种检查日志会造成日志分析麻烦,并且日志体积很大。如何解决?

还有一个问题,后面web日志里得到的不是客户访问的外网IP,而是架构前端服务器的内网ip,那么做日志分析的话就无法得到真实的客户端访问IP,如何解决?
# vim /etc/httpd/conf/httpd.conf
SetEnvIf Request_URI "^/test\.html$" dontlog --加上这一句
CustomLog logs/access_log combined env=!dontlog --在你希望不记录与test.html有关的日志后面加上env=!dontlog
/etc/init.d/httpd restart

另一个方法:做sed加crontab做脚本定期清除就可以了
sed -i '/test.html/d' /var/log/httpd/access_log
================================================================

piranha     水虎鱼   食人鱼
图形化配置lvs+ha的软件
NAT架构

架构图与上面架构图一样,只是把keepalived 换成 piranha来做

             client  
    |
    |
    |
   VIP eth0:0  1.1.1.2
       心跳
  1.1.1.3     eth0---------eth0   1.1.1.4
  master  DR   slave  DR  
2.2.2.3    eth1---------eth1    2.2.2.4   
        心跳
   VIP eth1:0  2.2.2.2
    |
    |
    |
  |-------------------------------|
  web1    web2
   2.2.2.5    2.2.2.6


第一步:
安装前准备:
接着上面的实验,继续做
1,先把上面的主DR和备DR的keepalived关闭
/etc/init.d/keepalived stop

2,在主备DR上安装piranha软件
yum install piranha -y

3,先在主DR上进行配置,配置好后,后面再直接SCP给备DR

cp /etc/sysconfig/ha/conf/httpd.conf /etc/httpd/conf/ --拷贝piranha配置文件覆盖httpd的配置文件
/etc/init.d/httpd restart --启动httpd,(注意如果rhel6上启动报权限拒绝,记得关闭selinux)
lsof -i:3636  --查看到有3636端口
COMMAND   PID    USER   FD   TYPE DEVICE SIZE NODE NAME
httpd   13252    root    3u  IPv6  84841       TCP *pscenter (LISTEN)
httpd   13254 piranha    3u  IPv6  84841       TCP *pscenter (LISTEN)
/usr/sbin/piranha-passwd  --设置登录密码
New Password:
Verify:
Adding password for user piranha

随便找一台可以访问,使用浏览器 访问主DR的3636端口
http://主DR的IP:3636/
使用用户名piranha,密码为刚才设置的密码登陆

----------------------------------
--上面httpd.conf里配置的权限是默认允许所有的人都可以访问,所以随便找一台能连的客户端就可以配置。你可以限制只有特定的机器才能访问
可以在下面这个目录标签下修改
<Directory /etc/sysconfig/ha/web/secure>
    Order deny,allow
    Allow from all --默认允许所有
可以修改为
   order deny,allow
   deny from all
   allow from 1.1.1.3 --拒绝所有,只允许1.1.1.3

------------------------------------------
配置过程见笔记目录里的截图(在笔记目录下/arch/png)


# cat /etc/sysconfig/ha/lvs.cf
serial_no = 16
primary = 1.1.1.3
primary_private = 2.2.2.3
service = lvs
backup_active = 1
backup = 1.1.1.4
backup_private = 2.2.2.4
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = nat
nat_router = 2.2.2.2 eth1:0
nat_nmask = 255.255.255.0
debug_level = NONE
monitor_links = 1
syncdaemon = 0
virtual lvs_http {
     active = 1
     address = 1.1.1.2 eth0:0
     sorry_server = 127.0.0.1
     vip_nmask = 255.255.255.0
     port = 80
     send = "GET / HTTP/1.0\r\n\r\n"
     expect = "HTTP"
     use_regex = 0
     load_monitor = none
     scheduler = rr
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 1
     server web1 {
         address = 2.2.2.5
         active = 1
         port = 80
         weight = 1
     }
     server web2 {
         address = 2.2.2.6
         active = 1
         port = 80
         weight = 1
     }
}

第二步:
配置备DR
直接把主DR的lvs.conf配置文件SCP到备DR
scp /etc/sysconfig/ha/lvs.cf 1.1.1.4:/etc/sysconfig/ha/

--如果备DR也是使用的克隆的虚拟机,两个网卡为eth1和eth2的话,那么拷过来配置文件后,vim去打开它,把nat_router = 2.2.2.2 eth1:0改成nat_router = 2.2.2.2 eth2:0;把address = 1.1.1.2 eth0:0改成address = 1.1.1.2 eth1:0)

第三步:主备DR都启动pulse服务
/etc/init.d/pulse start

启动后,就可以使用ifconfig在主DR上 看到 eth0:0 1.1.1.1
     eth1:0 2.2.2.2

第四步:
因为我这里使用上面原有的架构,所以web1,web2网关仍然还是指的2.2.2.2
直接使用client测试OK

1,测试 master DR 上service network stop,然后发现两个vip都在slave DR,
然后service network start,就又回来了(注意都配置静态IP来测试,否则可能会出问题)

2,断掉master DR上其中一个网卡(注意:在虚拟机图形配置里关闭掉或者ifconfig eth0 down掉)。会发现两个VIP都会切换过去,再打开这个master DR断掉的网卡(发现两个VIP不能抢回来),再断掉slave DR的一个网卡,两个VIP也会切换回master DR.因为我在Monitor NIC links for failures这项打了勾。

3,但这里有些问题:就是切到slave DR的VIP在master DR启动OK后也不会自动回来,需要停slave DR上的pulse服务,或断它的网卡才会回到master DR;


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

使用keepalived实现HA+LVS-DR架构


           client   3.3.3.3  
    |
    |
    |
    eth0 3.3.3.1
    [router或firewall]         <--------------------
    eth1 1.1.1.1    |
    |     |
    |     |
    |     |
   VIP eth0:0  1.1.1.2    |
         |
          心跳     |
  1.1.1.3     eth0---------eth0   1.1.1.4   |
  master  DR   slave  DR     |
         |
2.2.2.3     eth1----------eth1 2.2.2.4   |
    |     |
    |     |
    |     |
  |-------------------------------|   |
  web1    web2   |
   1.1.1.5    1.1.1.6  --------------->
       网关指向
  lo:0 1.1.1.2/255.255.255.255


配置firewall
1,ipvsadm 确认没有打开
2,httpd 也就是80端口没有打开
3,/etc/sysctl.conf  --打开IP_FORWARD
4,使用防火墙做DNAT,把对firewall的80请求DNAT给Director
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 1.1.1.2
还做一个SNAT回来
iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to-source 1.1.1.1

第二大步:在主DR上配置,这里选用keepalived

# /etc/init.d/pulse  stop  --先在主DR和备DR上确认把piranha关闭

# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    lvs_sync_daemon_interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
1.1.1.2/24
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth1
    lvs_sync_daemon_interface eth1
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {  --因为是DR架构,只有一个VIP,这个VIP为空
    }
}
virtual_server 1.1.1.2 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR   --把NAT换成DR
    nat_mask 255.255.255.0
    protocol TCP
    real_server 1.1.1.5 80 { --因为换成DR架构,web网段与LVS调度是同网段,所以IP也要改成web1的新IP
        weight 1
        HTTP_GET {
             url {
              path /test.html
              digest d41d8cd98f00b204e9800998ecf8427e
    }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 1.1.1.6 80 { --改成web2的新IP
        weight 1
        HTTP_GET {
             url {
              path /test.html
              digest 56e68bb020b9ec9499897f8146f30c37
    }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

第三大步:把配置文件由master DR拷到slave DR
# scp /etc/keepalived/keepalived.conf 1.1.1.4:/etc/keepalived/
拷过去后,就把下面两句在slave DR上改一下
state BACKUP
priority 99
--如果你实验的备DR虚拟机是克隆的,那么把eth0对应的改成eth1就可以

第四大步; 配置real servers
1,安装httpd监听80端口,并使用两个不同的主页方便后面的测试
2,ifconfig lo:0 1.1.1.2 netmask 255.255.255.255  --注意掩码为4个255
3, 真实服务器把默认路由指向firewall同物理网段的IP
把网关指向1.1.1.1(这个网关可做也可不做,因为前面做了SNAT,那么回去时,sip:1.1.1.5 dip:1.1.1.1,就是同网段,可以直接回去)
4.# vim /etc/sysctl.conf   --这步一定要做,如果不做,可能会出现firewall找1.1.1.2这个VIP时,有1.1.1.2IP的都会回应arp广播包(包括web1和web2,因为它们也有1.1.1.2的IP)(你可以在firewall上使用arp -d 1.1.1.2命令后,再用客户端访问elinks -dump 3.3.3.1测试,如果不改这几个内核参数,会可能出现只访问其中一个web而不会调度的情况)
net.ipv4.conf.lo.arp_ignore = 1  
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# sysctl -p使它生效


5,在主DR和备DR上都绑定web1和web2的物理地址
(这一步在这个架构中可以不用做,因为web1和web2虚拟了lo:0 1.1.1.2/32后,不会造成主DR和备DR与web1,web2不通的情况,因为主DR和备DR有心跳线路的IP1.1.1.3和1.1.1.4,它们可以与web1,web2通迅,也就是说可以得到web1和web2的MAC地址)
# arp -s  1.1.1.5   1.1.1.5的MAC地址
# arp -s  1.1.1.6   1.1.1.6的MAC地址

第五大步:
两边/etc/init.d/keepalived restart

第六大步:
测试:在客户端上elinks -dump 3.3.3.1, 成功
==============================================================

把上面的keepalived关闭,换成piranha
web配置的话,相对于前面做的NAT架构来说,只需要修改三个地方
1,在globel setting里由NAT架构改成DR
2,把web1的IP改成新的1.1.1.5
3,把web2的IP改成新的1.1.1.6


配置文件如下
# cat /etc/sysconfig/ha/lvs.cf
serial_no = 52
primary = 1.1.1.3
primary_private = 2.2.2.3
service = lvs
backup_active = 1
backup = 1.1.1.4
backup_private = 2.2.2.4
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = direct
nat_nmask = 255.255.255.0
debug_level = NONE
monitor_links = 1
syncdaemon = 1
syncd_iface = eth0
syncd_id = 51
virtual lvs_http {
     active = 1
     address = 1.1.1.2 eth0:0
     sorry_server = 127.0.0.1
     vip_nmask = 255.255.255.0
     port = 80
     send = "GET / HTTP/1.0\r\n\r\n"
     expect = "HTTP"
     use_regex = 0
     load_monitor = none
     scheduler = rr
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 1
     server web1 {
         address = 1.1.1.5
         active = 1
         weight = 1
     }
     server web2 {
         address = 1.1.1.6
         active = 1
         weight = 1
     }
}






欢迎光临 自由论坛 (http://deva.wicp.net/discuz/) Powered by Discuz! X3.2