配置实例需要了解的知识:
keepalived的工作机制: 最初keepalived目的是为LVS提供高可用的功能.ipvs wrapper是专门生成ipvs规则的组件.当director出现故障的时候keepalived可以将提供集群的IP地址、lvs规则转移到其他的节点上.并且检测后端rs服务的health check的健康检查。
VRRP工作原理:
1、路由器使用VRRP后,根据优先级确定自己的备份组中的角色,成为master路由器的会定期发送VRRP通告报文,通知备份组内的其他路由器自己工作正常,backup路由器则启动定时器等待通告报文的到来。
2、在抢占方式下,当backup路由器收到vrrp通告报文后,会和自己的优先级比较,如果大于通告报文的优先级,则成为master路由器。
3、在非抢占下,如果master没有出现故障,备份组中的路由器始终保持master或backup状态,backup路由器即使随后被配置了比master路由器还高的优先级也不会成为master路由器。
4、如果backup的定时器超时后仍未收到master的vrrp通告报文,则master被判为出现故障,backup都会认为自己是master并对外发送vrrp通告报文,备份组内的路由器根据优先级选举出master,承担报文的转发功能。
实例规划如图:
1、两个director节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致
[root@node1 ~]#hostname node1.yangyaru.com [root@node1 ~]#vim /etc/sysconfig/network
[root@node2 ~]#hostname node2.yangyaru.com [root@node2 ~]#vim /etc/sysconfig/network
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@node1 ~]# vim /etc/hosts
[root@node2 ~]# vim /etc/hosts
2、建立基于ssh通话密钥(要使用Xshell软件连接主机),两个节点都要创建密钥发送到对方的主机上。
Node1节点上创建密钥文件。
[root@node1~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 将基于密钥通话的公钥传递给node2节点,第一次需要输入node2的登录密钥。 [root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] Node2节点上创建密钥文件。 [root@node2~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 将基于密钥通话的公钥传递给node1节点,第一次需要输入node1的登录密钥。 [root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
3、时间同步
[root@node1 ~]# service ntpd stop #如果系统启动了ntpd服务器就先停止时间同步服务器哈 [root@node1 ~]# chkconfig ntpd off #让它开机自动启动也关闭 [root@node1 ~]# chkconfig --list ntpd #检查是够开始自动启动关闭 [root@node1 ~]# ntpdate 172.16.0.1 #让两个节点的时间都以172.16.0.1的地址一样。 11 May 15:12:45 ntpdate[29501]: adjust time server 172.16.0.1 offset 0.000326 sec [root@node1 ~]# which ntpdate 查看同步时间的命令ntpdate的绝对路径是在哪里 [root@node1 ~]# crontab -e #制定一个任务计算每个5分钟就同步下时间,添加如下一行。 */5 * * * * sbin/ntpdate 172.16.0.1 &> /dev/null [root@node1 ~]# scp /var/spool/cron/root node2:/var/spool/cron #将时间同步复制到另外一个节点上 [root@node2 ~]# service ntpd stop #停止时间同步服务器 [root@node2 ~]# chkconfig ntpd off #让它开机自动启动也关闭 [root@node2 ~]# chkconfig --list ntpd [root@node2 ~]# ntpdate 172.16.0.1 #让两个节点的时间都以172.16.0.1的地址一样。
前端两个Director节点安装配置keepalived,下载好的包放在附件中。在安装keepalived依赖于其他包,所以使用yum安装。
Node1的配置:
[root@node1 ~]# yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm [root@node1 ~]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_schedown { Script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 } vrrp_script chk_httpd { script "killall -0 httpd" interval 2 weight -2 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 67 #定义虚拟路由组id号. priority 101 #定义该物理路由的优先级 adver_int 1 #master路由的多久通告一次的时间 authentication { auth_type PASS auth_pass yangyaru } #定义通告信息的认证方式 track_interface { eth0 } virtual_ipaddress { 172.16.20.111 dev eth0 label eth0:0 #如果有多个配置多个虚拟地址 } track_script { chk_httpd chk_schedown } notify_master "/etc/keepalived/notify.sh -n master -a 172.16.20.111" notify_backup "/etc/keepalived/notify.sh -n backup -a 172.16.20.111" notify_fault "/etc/keepalived/notify.sh -n fault -a 172.16.20.111" virtual_server 172.16.20.111 80 { delay_loop 6 #获取某服务的等待时间 lb_algo rr #调度的方式 lb_kind DR #实现LVS的模式DR NAT nat_mask 255.255.0.0 # persistence timeout 50 #持久连接 protocol TCP # sorry_server 127.0.0.1 80 #sorry_server是用于定义所有realserver均出现故障时所用的服务器。 } real_server 172.16.20.3 80 { weight 1 HTTP_GET { url{ path / status_code 200 } connect_timeout 2 #连接时间 nb_get_retry 3 #重试时间 delay_before_retry 1 #延迟时间 } } real_server 172.16.20.5 80 { weight 1 HTTP_GET { url{ path / status_code 200 } TCP_CHECK { connect_port 80 bindto 172.16.20.5 } connect_timeout 2 #连接时间 nb_get_retry 3 #重试时间 delay_before_retry 1 #延迟时间 } } }
#定义那个虚拟路由组,一个物理设备可以提供多个组。
Notify.sh的脚本的内容是:
#!/bin/bash # Author: MageEdu <[email protected]> # description: An example of notify script # Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP -n|--notify {master|backup|falut} -h|--help #contact='root@localhost' helpflag=0 serviceflag=0 modeflag=0 addressflag=0 notifyflag=0 contact='root@localhost' Usage() { echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP> <-n|--notify {master|backup|falut}>" echo "Usage: notify.sh -h|--help" } ParseOptions() { local I=1; if [ $# -gt 0 ]; then while [ $I -le $# ]; do case $1 in -s|--service) [ $# -lt 2 ] && return 3 serviceflag=1 services=(`echo $2|awk -F"," '{for(i=1;i<=NF;i++) print $i}'`) shift 2 ;; -h|--help) helpflag=1 return 0 shift ;; -a|--address) [ $# -lt 2 ] && return 3 addressflag=1 vip=$2 shift 2 ;; -m|--mode) [ $# -lt 2 ] && return 3 mode=$2 shift 2 ;; -n|--notify) [ $# -lt 2 ] && return 3 notifyflag=1 notify=$2 shift 2 ;; *) echo "Wrong options..." Usage return 7 ;; esac done return 0 fi } #workspace=$(dirname $0) RestartService() { if [ ${#@} -gt 0 ]; then for I in $@; do if [ -x /etc/rc.d/init.d/$I ]; then /etc/rc.d/init.d/$I restart else echo "$I is not a valid service..." fi done fi } StopService() { if [ ${#@} -gt 0 ]; then for I in $@; do if [ -x /etc/rc.d/init.d/$I ]; then /etc/rc.d/init.d/$I stop else echo "$I is not a valid service..." fi done fi } Notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date '+%F %H:%M:%S'`, vrrp transition, `hostname` changed to be $1." echo $mailbody | mail -s "$mailsubject" $contact }
5、Node2的安装配置:
[root@node2 ~]# yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm [root@node2 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/keepalived.conf [root@node2 ~]# vim /etc/keepalived/keepalived.conf state MASTER改为BACKUP priority 101 改为100 其他不动
6、node1和node2都安装ipvsadm并启动起来。
[root@node1 ~]#yum -y install ipvsadm [root@node1 ~]#service ipvsadm start [root@node2 ~]#yum -y install ipvsadm [root@node2 ~]#service ipvsadm start
后端RS的配置步骤:
1、关闭selinux
[root@rs1 ~]#setenforce 0 [root@rs1 ~]#vim /etc/sysconfig/selinux 修改一行为 SELINUX=permissive 节点node2配置一样。
2、时间同步下:和前面的一样,使用172.16.0.1主机的时间。
3、安装httpd服务:
[root@rs1 ~]#yum -y install httpd [root@rs1 ~]#service httpd start [root@rs2 ~]#yum -y install httpd [root@rs2 ~]#service httpd start
4、给两个RS提供页面,这里我们使用不同的页面做测试。
[root@rs1 ~]#echo “rs3.yangyaru.com” > /var/www/html/index.html [root@rs2 ~]#echo “rs5.yangyaru.com” > /var/www/html/index.html
5、配置rs1和rs2为负载均衡DR模式集群服务。
[root@rs1 ~]#cd /proc/sys/net/ [root@rs1 ~]#sysctl -w net.ipv4.conf.lo.arp_announce=2 [root@rs1 ~]#sysctl -w net.ipv4.conf.all.arp_announce=2 [root@rs1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@rs1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@rs1 ~]#ifconfig lo:0 172.16.20.111 netmask 255.255.255.255 broadcast 172.16.20.111 up [root@rs1 ~]#route add -host 172.16.20.111 dev lo:0
rs2和rs1一样。
调试过程:
1、node1和node2开启keepalived服务
[root@node1 ~]#service keepalived start [root@node2 ~]#service keepalived start
查看下两个node节点的ip地址
[root@node1 ~]#ip addr show [root@node1 ~]#ipvsadm -L -n [root@node2 ~]#ip addr show [root@node2 ~]#ipvsadm -L -n
可以看到我们的vip运行在node1上。
客户端访问测试下我们的页面.
再刷新下页面测显示rs2的页面.
当我们的后端两个界面都出现故障时.我们使用node1页面上的错误页面放回给用户.
Node1和node2都安装httpd提供错误页面的返回.
[root@node1 keepalived]# yum -y install httpd [root@node2 keepalived]# yum -y install httpd [root@node1 keepalived]# echo “error” > /var/www/html/index.html [root@node2 keepalived]# echo “error” > /var/www/html/index.html
后端rs关闭httpd服务模拟故障.
[root@rs1~]# service httpd stop [root@rs2~]# service httpd stop
此前我们看下前端node节点的规则.
客户端就会访问到错误的页面.
简单的配置到这里就已经结束了.^_^