集群的构建-lvs-高可用方案(keepalived、Heartbeat)

前面已经记录了集群的一些原理知识,下面我就是我对几种常见集群的构建,在其中可以看出相关命令,还是很多的,用于处理生产环境中的一些问题。

一、LVS-NAT模式集群

1、工作流程

# 客户端发送数据报文(包含源ip和端口)到调度器,调度器修改目标ip和端口,将目标ip修改为服务器ip,发送到内网广播域中,服务器RS1接收。RS1处理完毕后回信,将源ip和目标ip对调,并指定本机网关为调度器ip,将报文发送到网关,网关还原报文ip,将数据报文发送给公网用户。

2、实验环境

# 准备4太虚拟机,自定义模式模拟网络环境
	#公网客户端 :   10.10.10.100
	#调度器: eth0  10.10.10.11
			#eth1  192.168.190.111
	#两台服务器:    RS1:192.168.190.112
				  #RS2:192.168.190.113

3、真实服务器

# 两台服务器分别添加调度器的ip为自己的网关。
$ echo "GATEWAY=192.168.190.111" >> /etc/sysconfig/network-scripts/ifcfg-eth0
$ service network restart
$ route -n 
# 两台服务器分别添加测试服务需要的程序及页面
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "ceshi-111" >> /var/www/html/index.html
$ curl localhost # 查看网页内容是否添加

4、调度器服务器(网关服务器)

# 加载ip-vs模块,安装ipvsadm工具,开启路由转发功能
$ modprobe ip_vs
$ cat /proc/net/ip_vs
$ yum -y install ipvsadm
$ vim /etc/sysctl.conf
	net.ipv4.ip_forward=1 # 开启路由转发
$ sysctl -p
# 添加集群
$ ipvsadm -A -t 10.10.10.11:80 -s rr
# -A 添加一个新的集群 -t tcp集群 集群地址 -s 指定算法 -p 持久化时间
# 添加真实服务器
$ ipvsadm -a -t 10.10.10.11:80 -r 192.168.190.112:80 -m
$ ipvsadm -a -t 10.10.10.11:80 -r 192.168.190.113:80 -m
$ ipvsadm -Ln # 列出规则 -n 以端口的形式展现出
$ service ipvsadm save
$ chkconfig ipvsadm on
# 查看、清空、添加防火墙规则
$ service iptables start
$ chkconfig iptables on
$ iptables -L # 查看防火墙规则
$ iptables -F # 清空防火墙规则
# NAT地址转换
$ iptables -t nat -A POSTROUTING -s 192.168.190.0/24 -o eth1 -j SNAT --to-source 10.10.10.11
# -t指定表 -s内网地址网段 -o 外网网卡名称 -j 指定动作 --to-source 指定调度器ip地址

5、测试

$ curl 10.10.10.11 或
$ while 2>1; do curl 10.10.10.11; sleep 1s; done
# 调度器查看规则,并查看当前连接状态
$ ipvsacm -Ln --stats

6、端口映射测试

# 修改其中一台真实服务器httpd的端口
$ vim /etc/httpd/conf/httpd.conf
 	Listen 80 修改为 8080
$ service httpd restart
# 调度器添加新的服务器规则,并删除原有规则
$ ipvsadm -Ln # 列出集群规则
$ ipvsadm -a -t 10.10.10.11:80 -r 192.168.190.112:80 # 添加新的规则
$ ipvsadm -D -t 10.10.10.11 # 删除整个集群规则
$ ipvsadm -d -t 10.10.10.11:80 -r 192.168.190.112:80 # 删除集群下的某规则
$ ipvsadm -Ln
# 注:此环境中,调度器、两台服务器若有一个损坏都会导致用户访问中断。因此,要做健康状态检测

二、LVS - DR 模式集群

1、工作流程

# 客户端发送数据报文(包含源ip和目标ip)到调度器,调度器收到后更改其目标Mac地址,而后发送到RS1服务器,RS1服务器为了响应,在路由表内添加一条记录,做Mac地址转换,最后将处理好的数据报文返回给客户端。(调度器和服务器需要设置一个虚拟的ip用来传递数据报文和接受数据报文,并将此虚拟ip隐藏)

2、实验环境准备

# 四台虚拟机模拟真实环境
# 客户端:	192.168.190.111
# 调度器:	192.168.190.112
# 服务器:	RS1 : 192.168.190.113
		 #  RS2 : 192.168.190.114

3、真实服务器

# 所有真实服务器线关闭NetworkManager
$ service NetworkManager stop
$ chkconfig NetworkManager on
# 开启本地环路子接口,并添加vip信息
$ cd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-lo ifcfg-lo:0
	DEVICE=lo:0
   IPADDR=192.168.190.100 #虚拟IP (vip)
   NETMASK=255.255.255.255
# 添加所有网卡公告及响应级别(末尾直接添加即可)
$ vim /etc/sysctl.conf
	#lvs arp
 	 net.ipv4.conf.all.arp_ignore = 1
   	net.ipv4.conf.all.arp_announce = 2
 	 net.ipv4.conf.default.arp_ignore = 1
 	 net.ipv4.conf.default.arp_announce = 2
 	 net.ipv4.conf.lo.arp_ignore = 1
 	 net.ipv4.conf.lo.arp_announce = 2
$ sysctl -p # 刷新内核参数
$ ifup lo:0 # 启动子接口
$ ifconfig
# 添加路由记录,并设置为开机自启
$ /sbin/route add -host 192.168.190.100 dev lo:0
$ echo "/sbin/route add -host 192.168.190.100 dev lo:0" >> /etc/re.local
# 两台服务器分别添加测试服务需要的程序及页面
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "ceshi-111" >> /var/www/html/index.html
$ curl localhost # 查看网页内容是否添加

4、负载调度器

# 关闭NetworkManager
$ service NetworkManager stop
$ chkconfig NetworkManager on
# 开启网卡子接口
$ cd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
	DEVICE=eth0:0
   IPADDR=192.168.190.100 #虚拟IP
   NETMASK=255.255.255.0
$ ifup eth0:0
$ ifconfig
# 设置关闭网卡重定向功能
$ vim /etc/sysctl.conf
 	 # lvs send_redirects
	net.ipv4.conf.eth0.send_redirects = 0
	net.ipv4.conf.all.send_redirects = 0
	net.ipv4.conf.default.send_redirects = 0
$ sysctl -p
# 加载ip_vs模块,并安装ipvsadm.
$ modprobe ip_vs
$ cat /proc/net/ip_vs
$ yum -y install ipvsadm
# 添加集群以及真实服务器
$ ipvsadm -v
$ ipvsadm -A -t 虚拟IP:80 -s rr
$ ipvsadm -a -t 虚拟IP:80 -r 真实服务器:80 -g
$ ipvsadm -a -t 虚拟IP:80 -r 真实服务器:80 -g
$ ipvsadm -Ln
$ service ipvsadm save
$ chkconfig ipvsadm on

5、测试

$ curl 10.10.10.11 或
$ while 2>1; do curl 10.10.10.11; sleep 1s; done
# 调度器查看规则,并查看当前连接状态
$ ipvsacm -Ln --stats

6、LVS健康监测脚本

#调度器添加健康监测脚本(DR模式脚本没问题,若NAT模式端口不是80此脚本不可用)
$ mkdir /usr/local/script
$ cd /usr/local/script
$ vim check_server.sh
#!/bin/bash
       VIP=192.168.190.100 #集群虚拟IP
       CPORT=80 #定义集群端口
       FAIL_BACK=127.0.0.1 #本机回环地址
       RS=("192.168.190.113" "192.168.190.114") #编写集群地址
      declare -a RSSTATUS  #变量RSSTATUS定义为数组态
       RW=("1" "1") #权重
       RPORT=80 #定义集群端口
       TYPE=g #制定LVS工作模式:g=DR m=NAT
       CHKLOOP=3
       LOG=/var/log/ipvsmonitor.log
      addrs() {
        ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
        [ $? -eq 0 ] && return 0 || return 1
      }
      delrs() {
        ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
        [ $? -eq 0 ] && return 0 || return 1
      }
      checkrs() {
        local I=1
         while [ $I -le $CHKLOOP ]; do
           if curl --connect-timeout 1 http://$1 &> /dev/null; then
            return 0
           fi
          let I++
         done
        return 1
      }
      initstatus() {
        local I
        local COUNT=0;
         for I in ${RS[*]}; do
           if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
            RSSTATUS[$COUNT]=1
           else
            RSSTATUS[$COUNT]=0
           fi
        let COUNT++
         done
      }
      initstatus
       while :; do
        let COUNT=0
         for I in ${RS[*]}; do
           if checkrs $I; then
             if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
                addrs $I ${RW[$COUNT]}
                [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
             fi
           else
             if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
                delrs $I
                [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
             fi
           fi
          let COUNT++
         done
         sleep 5
       done
# 给X权限,并启动脚本
$ chmod a+x check_server.sh
$ ./check_server.sh

7、健康状态测试

# 配置实验环境(关闭一台服务器的HTTPd)
service httpd stop
# 观察客户端获取状态
# 调度器查看规则
ipvsadm -Ln #列出规则
# 开启关闭的httpd服务
service httpd start
# 观察客户端获取状态
# 调度器查看规则
ipvsadm -Ln #列出规则

8、LVS持久化连接

# 把同一个 client 的请求信息记录到 lvs 的 hash 表里,保存时间使用persistence_timeout控制,单位为秒。如果用户配置了持久化时间persistence_timeout,当客户端的请求到达 LB 后,IPVS 会在记录表里添加一条 state 为 NONE 的连接记录。该连接记录的源 IP 为客户端 IP,端口为 0,超时时间为上面所说的持久化时间 persistence_timeout ,会逐步减小。当 NONE 的超时时间减到 0 时,如果 IPVS 记录中还存在 ESTABLISHED 或 FIN_WAIT 状态的连接,则 persistence_timeout 值会刷新为初始值。在该 NONE 状态的连接记录存在的期间,同一客户端IP的消息都会被调度到同一个 RS 节点

# 调度器清除原有的集群,添加持久化集群(-p 持久化时间)
$ ipvsadm -D -t 192.168.190.100:80
$ ipvsadm -Ln
$ ipvsadm -A -t 192.168.190.100:80 -s rr -p 200
$ ipvsadm -a -t 192.168.190.100:80 -r 192.168.190.113:80 -g
$ ipvsadm -a -t 192.168.190.100:80 -r 192.168.190.114:80 -g
$ ipvsadm -Ln
$ ipvsadm -Ln --stats
$ ipvsadm -Lnc  #-c 持久化连接的列表

三、四七层负载,识别域名

1、实验环境准备

# 四层 :高并发(nginx)
# 七层 :安全、识别主机名和域名(LVS)
# 实验最低六台虚拟机
	# LVS :		192.168.190.111
	# nginx1:	 192.168.190.112
	# nginx2: 	 192.168.190.113
	# 服务器:1	 www.wyy1.com	192.168.190.114
		#	  2	 www.wyy2.com	192.168.190.115
		#	  3  mail.wyy.com	192.168.190.116
# 验证负载和域名最少需要的虚拟机数		

2、真实服务器

# 三台服务器分别配置实验所需环境
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "www.wyy1.com" >> /var/www/html/index.html
$ echo "www.wyy2.com" >> /var/www/html/index.html
$ echo "mail.wyy.com" >> /var/www/html/index.html
$ curl localhost 

3、配置nginx服务器

# 源码安装nginx
$ tar -zxvf nginx-1.18.0.tar.gz
$ useradd -s /sbin/nologin -M nginx
$ yum -y install pcre pcre-devel zlib zlib-devel
$ cd nginx-1.18.0
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
$ make && make install
$ vim /usr/local/nginx/conf/nginx.conf
	    # www.wyy.com upstream
    upstream www.wyy.com {
        server 192.168.190.114:80;
        server 192.168.190.115:80;
    }

    # mail.wyy.com upstream
    upstream mail.hongfu.com {
        server 192.168.190.116:80;
    }

    # www.wyy.com vhost 
    server {
        listen       80;
        server_name  www.wyy.com;
        location / {
            proxy_pass http://www.wyy.com;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    # mail.wyy.com vhost
    server {
        listen       80;
        server_name  mail.wyy.com;
        location / {
            proxy_pass http://mail.wyy.com;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

4、测试

# 在windows的host文件中添加
	192.168.190.112 www.wyy.com
	192.168.190.112 mail.wyy.com
# 在浏览器中测试
	www.wyy.com # 刷新查看是否负载均衡
	mail.wyy.com # 查看是否识别域名

5、第二台nginx服务器配置

$ yum -y install pcre pcre-devel zlib zlib-devel
$ useradd -s /sbin/nologin -M nginx
# 第一台nginx服务器操作
$ pkill nginx
$ scp -r /usr/local/nginx root@192.168.190.113:/usr/local/
# 两台nginx分别启动
$ /usr/local/nginx/sbin/nginx

6、构建四层服务

#两台nginx服务器关闭NetworkManager
$ service NetworkManager stop
$ chkconfig NetworkManager off
#开启子接口
$ cd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-lo ifcfg-lo:0
$ vim ifcfg-lo:0
   DEVICE=lo:0
   IPADDR=192.168.190.100 #虚拟IP (vip)
   NETMASK=255.255.255.255
#尾部添加设置所有网卡的公告以及响应级别   
$ vim /etc/sysctl.conf
  #lvs arp
  net.ipv4.conf.all.arp_ignore = 1
  net.ipv4.conf.all.arp_announce = 2
  net.ipv4.conf.default.arp_ignore = 1
  net.ipv4.conf.default.arp_announce = 2
  net.ipv4.conf.lo.arp_ignore = 1
  net.ipv4.conf.lo.arp_announce = 2
$ sysctl -p #刷新内核参数
$ ifup lo:0 #启动子接口
$ ifconfig
# route add -host 虚拟IP dev lo:0 #添加路由记录
$ /sbin/route add -host 192.168.190.100 dev lo:0
$ route -n
#添加开机自启
$ echo "/sbin/route add -host 192.168.190.100 dev lo:0" >> /etc/rc.local

7、调度器配置

# 关闭NetworkManager
$ service NetworkManager stop
chkconfig NetworkManager off
# 开启设置子接口
$ cd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
   DEVICE=eth0:0
   IPADDR=192.168.190.100 #虚拟IP
   NETMASK=255.255.255.0
$ ifup eth0:0 启动虚拟网卡
$ ifconfig 
# 设置关闭网卡重定向功能
$ vim /etc/sysctl.conf
  # lvs send_redirects
  net.ipv4.conf.eth0.send_redirects = 0
  net.ipv4.conf.all.send_redirects = 0
  net.ipv4.conf.default.send_redirects = 0
$ sysctl -p
# 安装ip_vs命令管理工具
$ modprobe ip_vs
$ cat /proc/net/ip_vs
$ yum -y install ipvsadm
# 添加集群
$ ipvsadm -v
$ ipvsadm -A -t 虚拟IP:80 -s rr
$ ipvsadm -a -t 虚拟IP:80 -r 真实服务器nginx:80 -g
$ ipvsadm -a -t 虚拟IP:80 -r 真实服务器nginx:80 -g
$ ipvsadm -Ln
$ service ipvsadm save
$ chkconfig ipvsadm on
$ ipvsadm -Ln --stats

四、Keepalived 高可用

1、keepalived高可用方案

# 工作方式
	# 两台lvs分别做一个调度器,另一个为高可用节点,两者之间绑定一个vip,用户通过访问vip,而达到随机访问lvs的效果,实现高可用。

1)基本概念

# 虚拟设备:
	# 由一个“主( Master )”设备和多个“备( Backup )"设备组成的一个虚拟网关
# 主设备( Master ):
	# 负责转发数据报文和周期性向备设备发送 VRRP 协议报文
# 备设备( Backup ):
	# 不负责转发数据报文,在 Master 设备发生故障的时候会通过选举形式成为新的 Master 设备,该角色会接收来自 Master 设备的 VRRP 报文并加以分析
# VRID:
	# 用来表示一个 VRRP 组	
# 虚拟IP:
	# 配置在虚拟设备上的虚拟IP地址,一个虚拟设备可以拥有一个或者多个虚拟IP地址。
# IP 地址拥有者:
	#分配给虚拟设备的虚拟 IP 的真实拥有者,IP 拥有者会直接跳过选举成为 Master,并且是不可抢占的
# 虚拟 MAC 地址:
	# 由虚拟设备生成的虚拟 MAC 地址,每一个虚拟设备都会自动生成一个虚拟MAC 地址,这个 MAC 地址是用于虚拟设备处理 ARP 报文的
# 优先级:
	#用于表示物理设备的优先级,这个参数用于 Master 的选举,取值范围是 1-254,这个有优先级有两个比较特殊的值,分别是 0 和 255,优先级 0 是由原来 Master 设备发送的,这个优先级是声明此设备不再参与 VRRP 组。优先级为 255 的是 IP 拥有者的优先级,拥有这个优先级会直接成为 Master。(优先级数值越低优先级则越高)Backup 设备,则 Backup 设备会切换为 Master 设备。

2)VRRP的三种状态

# VRRP 一共有三种状态,
	# 分别是:初始状态( Initialize)、活动状态( Master )、备份状态( Backup)
# 初始状态( Initialize ):
	# 在这个状态下 VRRP 是不可用的,在这个状态下的设备是不会处理 VRRP 报文的,通常是刚配置 VRRP 时和检测到故障是会是这个状态
# 活动状态 (Master ):
	# 定期发送 VRRP 报文
   # 以虚拟 MAC 地址响应对虚拟 IP 地址的 ARP 请求
   # 转发目的 MAC 地址为虚拟 MAC 地址的 IP 报文
   # 如果它是这个虚拟 IP 地址的拥有者,则接收目的 IP 地址为这个虚拟 IP 地址的 IP 报文。否则,丢弃这个 IP 报文
   # 如果收到比自己优先级大的报文则转为 Backup 状态
   # 如果收到优先级和自己相同的报文,并且发送端的 IP 地址比自己的 IP 地址大,则转为 Backup 状态
	# 当接收到接口的 Shutdown 事件时,转为Initialize
# 备份状态( Backup ):
	# 接收 Master 发送的 VRRP 报文,判断 Master 的状态是否正常
   # 对虚拟 IP 地址的 ARP 请求,不做响应
   # 丢弃目的 MAC 地址为虚拟 MAC 地址的 IP 报文
   # 丢弃目的 IP 地址为虚拟 IP 地址的IP报文
   # Backup 状态下如果收到比自己优先级小的报文时,丢弃报文,立即切换为 Master( 仅在抢占模式下生效 )
   # 如果收到优先级和自己相同或者比自己高的报文,则重置定时器,不进一步比较 IP 
	# 地址当接收到接口的 Shutdown 事件时,转为 Initialize
   # 如果 MASTER_DOWN_INTERVAL 定时器超时,则切换为 Master 

3)VRRP 工作模式:

# 主备备份模式:
   # 一主一从,主工作从备份。
# 负载分担模式:
   # 按照轮询的方案,让路由器轮流处理。

2、实验环境

# 四台虚拟机:
# 调度器1:192.168.190.111
# 真实服务器:1  192.168.190.112
        # 2  192.168.190.113
# 调度器2:192.168.190.114

3、真实服务器

# 关闭所有真实服务器的NetworkManager
$ service NetworkManager stop
$ chkconfig NetworkManager off
# 开启本地回环网卡子接口
$ cd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-lo ifcfg-lo:0
$ vim ifcfg-lo:0
   DEVICE=lo:0
   IPADDR=192.168.190.100 #虚拟IP (vip)
   NETMASK=255.255.255.255
#尾部添加设置所有网卡的公告以及响应级别
$ vim /etc/sysctl.conf
  #lvs arp
  net.ipv4.conf.all.arp_ignore = 1
  net.ipv4.conf.all.arp_announce = 2
  net.ipv4.conf.default.arp_ignore = 1
  net.ipv4.conf.default.arp_announce = 2
  net.ipv4.conf.lo.arp_ignore = 1
  net.ipv4.conf.lo.arp_announce = 2
$ sysctl -p # 刷新内核参数
$ ifup lo:0 # 启动子接口
$ ifconfig # 查看子接口是否启动
# 添加路由记录,并开机自启
$ /sbin/route add -host 192.168.190.100 dev lo:0
$ echo "/sbin/route add -host 192.168.190.100 dev lo:0" >> /etc/rc.local
$ route -n
# 两台服务器分别开启httpd服务,并添加测试页面
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "PAGE1" >> /var/www/html/index.html
$ echo "PAGE2" >> /var/www/html/index.html
$ curl localhost #查看添加的测试内容

4、调度器1

1)调度器环境配置

# 关闭服务器的NetworkManager
$ service NetworkManager stop
$ chkconfig NetworkManager off
#开启网卡子接口
$ vcd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
   DEVICE=eth0:0
   IPADDR=192.168.190.100 #虚拟IP
   NETMASK=255.255.255.0
$ ifup eth0:0 启动虚拟网卡
$ ifconfig 
# 尾部添加设置关闭网卡重定向功能
$ vim /etc/sysctl.conf
  # lvs send_redirects
  net.ipv4.conf.eth0.send_redirects = 0
  net.ipv4.conf.all.send_redirects = 0
  net.ipv4.conf.default.send_redirects = 0
$ sysctl -p
# 安装ip_vs命令管理工具
$ modprobe ip_vs
$ cat /proc/net/ip_vs
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port Forward Weight ActiveConn InActConn
$ yum -y install ipvsadm
# 添加集群
$ ipvsadm -v
$ ipvsadm -A -t 虚拟IP:80 -s rr
$ ipvsadm -a -t 虚拟IP:80 -r 真实服务器:80 -g
$ ipvsadm -a -t 虚拟IP:80 -r 真实服务器:80 -g
$ ipvsadm -Ln
$ service ipvsadm save
$ chkconfig ipvsadm on

2)编译安装keepalived

# 安装依赖,并上传下载的keepalived的镜像
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ mkdir /iso
$ mount -o loop keepdlived.iso /iso/
$ cp -a /iso/* . # 放在家目录下
# 解压并安装
$ tar -zxvf keepalived....
$ cd keepalived.....
$ ./configure --prefix=/ --whth-kernel-dir=/usr/src/kernels/2......
$ make && make install

3)修改keepalived配置文件

$ vim /etc/keepalived/keepalived.conf
global_defs {
router_id R1 #命名主机名  #将管理发送邮件的地址删除,只剩下用户名称
}

vrrp_instance VI--1 {
# 设置服务类型主/从( MASTER/SLAVE )
  state MASTER
   # 指定那块网卡用来监听心跳探测
  int erface eth0
   # 设置组号,如果是一组就是相同的ID号,一个主里面只能有一个主服务器和多个从服务器
  virtual_router_id 66
   # 服务器优先级, 主服务器优先级高
  priority 100
   # 心跳检测时间, 检测对方存活
  advert_int 1     
  authenticetion {       #发送报文时的加密方案
      auth_type PASS    #密码类型
      auth_pass 1111    #密码
}
virtual_ipaddress {     #设置主从需要的vip地址
192.168.190.100
}
}


#以下内容专门给lvs集群准备的,如果不是lvs集群则不需要
virtual_server 192.168.190.100 80 {
# 健康检查间隔  #生产环境中时间6秒
delay_loop 1
# 使用轮询调度算法
lb_algo rr
#修改为 DR模式的群集
  lb_kind DR
   # 使用的协议
protocol TCP

#删除多余内容,添加真实服务器内容,有几个复制几次即可
real_server 192.168.190.112 80 {
      weight 1
      TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 4
      }
}

real_server 192.168.190.113 80 {  # 真实服务器的地址
      weight 1                    #真实服务器的权重
      TCP_CHECK {                 #真实服务器的检测方式
          connect_port 80         #真实服务器的端口
          connect_timeout 3       #检测端口的超时时间、
          nb_get_retry 3          #检测重试的次数
           delay_before_retry 4   #检测的间隔
      }
}
}

$ /etc/init.d/keepalived start
$ chkconfig --add keepalived
$ chkconfig keepalived on

$ cat /var/log/messages
    #Jan 11 11:45:54 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending 
    #gratuitous ARPs on eth0 for 192.168.190.100
$ ip add show
     inet 192.168.190.100/32 scope global eth0

5、调度器2

# 关闭NetworkManager
$ service NetworkManager stop
$ chkconfig NetworkManager on
#开启设置子接口
$ cd /etc/sysconfig/network-scripts/
$ cp -a ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
   DEVICE=eth0:0
   IPADDR=192.168.190.100 #虚拟IP
   NETMASK=255.255.255.0
$ ifup eth0:0 启动虚拟网卡
# 若有报错,修改配置文件
$ vim /etc/sysconfig/network-scripts/ifup-eth
	247 #将if判断语句注释掉
$ ifconfig 
# 设置关闭网卡重定向功能
$ vim /etc/sysctl.conf
  # lvs send_redirects
  net.ipv4.conf.eth0.send_redirects = 0
  net.ipv4.conf.all.send_redirects = 0
  net.ipv4.conf.default.send_redirects = 0
$ sysctl -p
# 安装ip_vs命令管理工具
$ modprobe ip_vs
$ cat /proc/net/ip_vs
$ yum -y install ipvsadm

# 调度器1将keepalived安装包发送到调度器2
$ scp -r keepalived-1.2.2.tar.gz root@192.168.190.114:/root/
# 调度器2安装keepalived
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ tar -zxf keepalived.....
$ cd keep.....
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2........../
$ make
$ make install
# 调度器1将配置文件发送到调度器2
$ scp -r /etc/keepalived/keepalived.conf root@192.168.190.114:/root/
# 调度器2修改配置文件
$ cp -a /root/keepalived.conf /etc/keepalived/keepalived.conf
$ vim /etc/keepalived/keepalived.conf #仅修改以下内容
    router_id R2 # 命名主机名
    state SLAVE
    priority 50

$ /etc/init.d/keepalived start
$ chkconfig --add keepalived
$ chkconfig keepalived on
$ ipvsadm -Ln #多执行几次

# 调度器1重启keepalived。
$ /etc/init.d/keepalived restart

7、模拟测试

# windows浏览器测试
	192.168.190.100
1)lvs机器损坏
# 调度器1关闭网卡测试是否能访问
	$ ipvsadm -Ln
# 调度器1开启网卡测试效果
	$ ipvsadm -Ln
2)httpd服务器损坏
# 关闭其中一台的httpd服务测试效果
	$ ipvsadm -Ln
# 打开关闭的httpd服务、
	$ ipvsadm -Ln
#实验结果:
    #无论哪种情况,都不会导致访问中断。keepalived实现了,LVS的高可用方案。

五、Heartbeat高可用方案

1、Heartbeat简介

# Heartbeat 是 Linux-HA 工程的一个组件,自 1999 年开始到现在,发布了众多版本,是目前开源 Linux-HA 项目最成功的一个例子,在行业内得到了广泛的应用

2、实验环境

#两台虚拟机:
	# 服务器1:192.168.190.111
	# 服务器2:192.168.190.112

3、构建前提

# 两台主机名要不一致,修改主机名
$ /etc/sysconfig/network
	HOSTNAME=www.centos1.com
	HOSTNAME=www.centos2.com
# 配置主机名解析( uname -n 主机名检测 )
$ vim /etc/hosts
    192.168.190.111 www.centos1.com
    192.168.190.112 www.centos2.com
$ scp -r /etc/hosts root@www.centos2.com:/etc/hosts

4、服务器安装heartbeat

#两台服务器分别安装heartbeat服务
$ yum -y install lrzsz
#上传软件包并解压
$ tar -zxvf heartbeat.tar.gz
$ scp -r heartbeat root@192.168.190.112:/root/
$ cd heartbeat
$ yum -y install *
#两台服务器分别安装httpd服务,并添加测试页面
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "www1.hongfu.com" >> /var/www/html/index.html
$ echo "www2.hongfu.com" >> /var/www/html/index.html
$ curl localhost

5、修改配置文件

$ cd /usr/share/doc/heartbeat-3.0.4/
$ cp -a ha.cf authkeys haresources /etc/ha.d/
$ cd /etc/ha.d/

1) 认证服务,节点之间的认证配置,修改 /etc/ha.d/authkeys

# dd if=/dev/random bs=512 count=1 | openssl md5 #生成密钥随机数
$ vim /etc/ha.d/authkeys # 取消注释,并修改
   auth 3
   3 md5 a4d20b0dd3d5e35e0f87ce4266d1dd64 #md5 加密算法 随便写一串
   
$ chmod 600 authkeys

2) heartbeat 主配置文件,修改 /etc/ha.d/ ha.cf

$ vim /etc/ha.d/ ha.cf  #取消注释并修改
	bcast eth0
	node www.centos1.com
	node www.centos2.com

3)配置 haresources 文件

$ vim haresources  #在结尾处添加
	www.centos1.com IPaddr::192.168.190.100/24/eth0:0
	#IPaddr脚本位置/etc/ha.d/resource.d

6、将主三个配置文件拷贝到从上

$ cd /etc/ha.d/
$ scp -r ha.cf authkeys haresources root@192.168.190.112:/etc/ha.d/

7、分别启动heartbeat服务

$ /etc/init.d/heartbeat start
    Starting High-Availability services: INFO:  Resource is stopped
    Done
$ ifconfig
    eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:D1:A0:83  
              inet addr:192.168.190.100  Bcast:192.168.190.255  
              Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
#可以看出heartbeat 是直接启动一个子接口达到访问切换的目的

8、测试

# windwos浏览器
192.168.190.100
1)其中一台服务器损坏
# 可以访问到另一台证明高可用
2)httpd应用损坏
# 不可以访问了。

9、Heartbeat 检测脚本实现高可用性

# 两台服务器添加脚本
$ mkdir /usr/local/script
$ cd /usr/local/script
$ vim jiankong.sh
#!/bin/bash

URL="http://192.168.190.111/index.html"

HTTP_CODE=`/usr/bin/curl -o /dev/null -s -w "%{http_code}" "${URL}"`

if [ $HTTP_CODE != 200 ]
    then
     /etc/init.d/heartbeat stop
fi

# 两台服务器创建脚本权限
$ chmod a+x jiankong.sh
$ ./jiankong.sh
# 两台服务器创建脚本定时计划任务
$ crontab -e
	*/1 * * * * /bin/bash /usr/local/script/jiankong.sh

#第二台服务器添加脚本
scp -r /usr/local/script root@192.168.190.112:/usr/local/
#修改内容ip,并做定时计划任务

#两台服务器重载crond
service crond restart

#测试httpd关闭情况下能否正常访问,实现高可用性

注:本文为博主查阅多方资料整理而成,如有错误或侵权请留言联系博主修改或删除。

posted @ 2020-04-22 11:20  候你已久  阅读(426)  评论(0)    收藏  举报