高可用集群—实现方案一:Keepalived

高可用集群实现方案

一、Keepalived环境专为LVS 和 HA 设计的一款健康检查工具,使用成熟的 VRRP 协议
支持故障自动切换( Failover )
支持节点健康状态检查( Health Checking )
官方网站:http://www.keepalived.org/

高可用集群:尽可能提高服务可用性
宕机标准:1 ~ 5个9标准:99%~99.999%
原理:心跳检测
问题:脑分裂
解决方案:
心跳线冗余
多次间歇心跳检测
电源交换机

检测脚本:针对服务的可用性进行探测
切换 Master 以及 切换至 backup 状态的运行脚本
集群启动前的操作:挂载共享存储 数据恢复
集群可用性退出:解除挂载 保留恢复数据

二、VRRP(虚拟路由冗余协议)相关概念
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qlg1T6hQ-1615908358514)(C:\Users\taoxiaobing\AppData\Roaming\Typora\typora-user-images\image-20210109150346904.png)]

1、虚拟设备:由一个“主( Master )”设备和多个“备( Backup )"设备组成的一个虚拟网关
主设备( Master ):负责转发数据报文和周期性向备设备发送 VRRP 协议报文
备设备( Backup ):不负责转发数据报文,在 Master 设备发生故障的时候会通过选举形式成为新的 Master 设备,该角色会接收来自 Master 设备的 VRRP 报文并加以分析

2、VRID:用来表示一个 VRRP 组

3、虚拟IP:配置在虚拟设备上的虚拟IP地址,一个虚拟设备可以拥有一个或者多个虚拟IP地址。

4、IP 地址拥有者:分配给虚拟设备的虚拟 IP 的真实拥有者,IP 拥有者会直接跳过选举成为 Master,并且是不可抢占的

5、虚拟 MAC 地址:由虚拟设备生成的虚拟 MAC 地址,每一个虚拟设备都会自动生成一个虚拟 MAC 地址,这个 MAC 地址是用于虚拟设备处理 ARP 报文的

6、优先级:用于表示物理设备的优先级,这个参数用于 Master 的选举,取值范围是 1-254,这个有优先级有两个比较特殊的值,分别是 0 和 255,优先级 0 是由原来 Master 设备发送的,这个优先级是声明此设备不再参与 VRRP 组。优先级为 255 的是 IP 拥有者的优先级,拥有这个优先级会直接成为 Master。(优先级数值越高优先级则越高,差值一般大于40)

7、抢占模式:当 Backup 设备接收到的 VRRP 报文通过分析得出当前 Master 设备的优先级低于 Backup 设备,则 Backup 设备会切换为 Master 设备。

8、VRRP 一共有三种状态,分别是:初始状态( Initialize )、活动状态( Master )、备份状态( Backup )
初始状态:在这个状态下 VRRP 是不可用的,在这个状态下的设备是不会处理 VRRP 报文的,通常是刚配置 VRRP 时和检测到故障是会是这个状态

​ 活动状态: 定期发送 VRRP 报文
​ 以虚拟 MAC 地址响应对虚拟 IP 地址的 ARP 请求
​ 转发目的 MAC 地址为虚拟 MAC 地址的 IP 报文
​ 如果它是这个虚拟 IP 地址的拥有者,则接收目的 IP 地址为这个虚拟 IP 地址的 IP 报文。否则,丢弃这个 IP 报文
​ 如果收到比自己优先级大的报文则转为 Backup 状态
​ 如果收到优先级和自己相同的报文,并且发送端的 IP 地址比自己的 IP 地址大,则转为 Backup 状态
​ 当接收到接口的 Shutdown 事件时,转为Initialize

​ 备份状态: 接收 Master 发送的 VRRP 报文,判断 Master 的状态是否正常
​ 对虚拟 IP 地址的 ARP 请求,不做响应
​ 丢弃目的 MAC 地址为虚拟 MAC 地址的 IP 报文
​ 丢弃目的 IP 地址为虚拟 IP 地址的IP报文
​ Backup 状态下如果收到比自己优先级小的报文时,丢弃报文,立即切换为 Master( 仅在抢占模式下生效 )
​ 如果收到优先级和自己相同或者比自己高的报文,则重置定时器,不进一步比较 IP 地址
​ 当接收到接口的 Shutdown 事件时,转为 Initialize
​ 如果 MASTER_DOWN_INTERVAL 定时器超时,则切换为 Master

三、工作模式

主备备份模式:一主一从,所有请求发送至主,若主不能工作,切换至从,同一时间点只有一台机器承担压力。
负载分担模式:数据包按照轮询方案,让两个路由器轮流处理对虚拟IP发起的请求。但VRRP协议这个功能落实到Keepalived上无法实现。

方案一 Keepalived

1、所需虚拟机
服务器1、服务器2、调度器主1、调度器从2

2、构建 DR 模式

服务器(1.2配置相同,网页内容不同)

$ service NetworkManager stop && chkconfig NetworkManager off
$ cd /etc/sysconfig/network-scripts/
$ cp ifcfg-lo ifcfg-lo:0
$ vim ifcfg-lo:0
    DEVICE=lo:0
    IPADDR=虚拟IP
    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
$ /sbin/route add -host 192.168.1.100 dev lo:0
# route add -host 虚拟IP dev lo:0
$ echo "/sbin/route add -host 192.168.1.100 dev lo:0" >> /etc/rc.local
$ route -n
$ yum -y install httpd
$ echo "1111111111111" >> /var/www/html/index.html
$ service httpd start
$ chkconfig httpd on
$ curl localhost	#本机访问验证网页内容

负载调度器 —— 主

$ service NetworkManager stop && chkconfig NetworkManager off
$ cd /etc/sysconfig/network-scripts/
$ cp ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
	DEVICE=eth0:0
	IPADDR=虚拟IP
	NETMASK=255.255.255.0
$ ifup eth0:0
$ 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
$ yum -y install ipvsadm
$ ipvsadm -A -t 192.168.1.100:80 -s rr
	# ipvsadm -A -t 虚拟IP:80 -s rr
$ ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.40:80 -g
	# ipvsadm -a -t 虚拟IP:80 -r 网站1:80 -g(LVS-DR模式)
$ ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.50:80 -g
	# ipvsadm -a -t 虚拟IP:80 -r 网站2:80 -g(LVS-DR模式)
$ ipvsadm -Ln
$ service ipvsadm save
$ chkconfig ipvsadm on

$ ipvsadm -Ln --stats		#查看出入站信息

Windows 浏览器 VIP 访问
C:\Users\taoxiaobing\AppData\Roaming\Typora\typora-user-images\image-20210111093243046.png

再刷新
在这里插入图片描述

编译安装 keepalived

$ yum -y install lrzsz	#上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
$ make && make install
$ chkconfig --add keepalived
$ chkconfig keepalived on

修改 Keepalived 配置文件:vim /etc/keepalived/keepalived.conf

$ vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id R1	#命名主机名
}

vrrp_instance VI_1 {
    state MASTER	# 设置服务类型主/从( MASTER/SLAVE )
    interface eth0	# 指定那块网卡用来监听
    virtual_router_id 51	# 设置组号,如果是一组就是相同的ID号,一个主里面只能有一个主服务器和多个从服务器
    priority 100	# 服务器优先级, 主服务器优先级高
    advert_int 1	# 心跳时间, 检测对方存活
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 80 {
    delay_loop 1	# 健康检查间隔
    lb_algo rr	# 使用轮询调度算法
    lb_kind DR	# DR模式的群集	
    protocol TCP	# 使用的协议

    real_server 192.168.1.10 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
    real_server 192.168.1.20 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
}

$ /etc/init.d/keepalived start
$ ipvsadm -Ln
$ ip addr show		#出现 ip/32 表示成功

负载调度器——从

$ service NetworkManager stop && chkconfig NetworkManager off
$ cd /etc/sysconfig/network-scripts/
$ cp ifcfg-eth0 ifcfg-eth0:0
$ vim ifcfg-eth0:0
	DEVICE=eth0:0
	IPADDR=虚拟IP
	NETMASK=255.255.255.0
$ vim /etc/sysconfig/network-scripts/ifup-eth
$ 注释掉247-251行内容
$ ifup eth0:0
$ 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
$ yum -y install ipvsadm

安装keepalived
$ yum -y install lrzsz
$ rz	#上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/ && make && make install
$ chkconfig --add keepalived
$ chkconfig keepalived on

修改配置文件
$ vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id R2
}

vrrp_instance VI_1 {
    state SLAVE
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 80 {
    delay_loop 1
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 192.168.1.10 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
    real_server 192.168.1.20 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
}

$ /etc/init.d/keepalived start
$ ipvsadm -Ln
$ ip addr show		#出现 ip/32 表示成功

测试
关闭主调度器,浏览器可以正常访问,开启主调度器,浏览器可以正常访问,使用命令查看访问被切换到哪台调度器

$ ipvsadm -Ln --stats

keepalived 其他选项

非抢占模式:如果两个节点性能一致,可以减少用户的连接丢失

安装 keepalived
服务器+调度器	1
$ yum -y install lrzsz	#上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
$ make
$ make install
$ chkconfig --add keepalived
$ chkconfig keepalived on
$ rz keepalived-all.tar
$ tar -xf keepalived-all.tar.gz
$ cd keepalived-all.tar.gz 
$ cd etc/keepalived/
$ rm -rf /etc/keepalived/*
$ mv * /etc/keepalived/
$ cd /etc/keepalived/
$ rm -rf stop_keepalived.log
$ vim check-server.sh		#此步骤主要是修改脚本的ip地址
	#!/bin/bash
	URL="http://192.168.1.40/index.html"
	HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
	if [ $HTTP_CODE != 200 ]
    	then
        	/etc/init.d/keepalived stop &> /etc/keepalived/logs/stop_keepalived.log
        	echo `date` >> /etc/keepalived/logs/stop_keepalived.log
	fi
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "111111111111" >> /var/www/html/index.html
$ vim keepalived.conf		#注意修改 ip、vip
$ /etc/init.d/keepalived start
$ ip a
	#inet 192.168.1.100/32 scope global eth0	ip/32 表示成功

服务器+调度器	2
$ yum -y install lrzsz	#上传keepalived镜像文件
$ mkdir /iso/
$ mount -o loop Keepalived.iso /iso/
$ cp -a /iso/* ~
$ tar -xf keepalived-1.2.2.tar.gz
$ cd keepalived-1.2.2
$ yum -y install kernel-devel openssl-devel popt-devel gcc*
$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
$ make
$ make install
$ chkconfig --add keepalived
$ chkconfig keepalived on
$ rz 	# keepalived-all.tar
$ tar -xf keepalived-all.tar.gz
$ cd etc/keepalived/
$ rm -rf /etc/keepalived/*
$ mv * /etc/keepalived/
$ cd /etc/keepalived/
$ rm -rf stop_keepalived.log
$ cd script/
$ vim check-server.sh		#此步骤主要是修改脚本的ip地址
	#!/bin/bash
	URL="http://192.168.1.40/index.html"
	HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
	if [ $HTTP_CODE != 200 ]
    	then
        	/etc/init.d/keepalived stop &> /etc/keepalived/logs/stop_keepalived.log
        	echo `date` >> /etc/keepalived/logs/stop_keepalived.log
	fi
$ yum -y install httpd
$ service httpd start
$ chkconfig httpd on
$ echo "aaaaaaaaaaa" >> /var/www/html/index.html
$ cd ..
$ vim keepalived.conf		#注意修改 ip、vip、权重不能一样priority 80、router_id不能一样、state SLAVE
$ /etc/init.d/keepalived start
$ ip a
	#inet 192.168.1.100/32 scope global eth0	ip/32 表示成功

测试

1、断开主的网卡,模拟服务器失效,从服务器开始生效;开启主的网卡并启动keepalived,主开启抢占模式,再访问浏览器会访问到主的服务器网页
在这里插入图片描述
在这里插入图片描述

2、模拟web服务器死亡,主关闭httpd,从开启服务;主开启httpd 和 keepalived,主抢占服务

设置非抢占模式

主:
$ vim /etc/keepalived/keepalived.conf
# 在vrrp_instance VI_1 标签内添加
	nopreempt
	state SLAVE	# MASTER 改为 SLAVE
$ /etc/init.d/keepalived restart
从:
$ vim /etc/keepalived/keepalived.conf
# 在vrrp_instance VI_1 标签内添加
	nopreempt
$ /etc/init.d/keepalived restart

测试
网页访问 VIP ,访问到主界面,因为主的权重高,关闭主的 httpd ,访问到从的网页,再开启主 httpd,这时不会再访问到主界面

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮-00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值