すのはら荘春原庄的雪

LVS+HAproxy+keepalived实现高可用

Toretto·2024-09-25 17:09·12 次阅读

LVS+HAproxy+keepalived实现高可用

LVS/DR模式#

准备工作(集群中所有主机关闭防火墙 selinux)#

[root@lvs ~]# cat /etc/hosts
192.168.13.111 lvs
192.168.13.112 real-server1
192.168.13.115 real-server2

Director分发器配置(lvs这台机器)#

配置vip

[root@lvs ~]# yum -y install ipvsadm 	#RHEL确保LoadBalancer仓库可用
[root@lvs ~]# ip a add dev ens33 192.168.13.100/32
[root@lvs ~]# service ipvsadm start		#启动
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件
[root@lvs ~]# ipvsadm -S /etc/sysconfig/ipvsadm

定义LVS分发策略#

-A:添加VIP
-t:用的是tcp协议
-a:添加的是lo的vip地址
-r:转发到realserverip
-s:算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-m  nat模式
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr:轮循
如果添加ip错了,删除命令如下:
# ip addr del dev ens33 192.168.13.100 
[root@lvs ~]# ipvsadm -C 	#清除内核虚拟服务器表中的所有记录
[root@lvs ~]# ipvsadm -A -t 192.168.13.100:80 -s rr
###分发到两台机器
[root@lvs ~]# ipvsadm -a -t 192.168.13.100:80 -r 192.168.13.112:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.13.100:80 -r 192.168.13.115:80 -g
###保存分发策略
[root@lvs ~]# ipvsadm -S /etc/sysconfig/ipvsadm
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.13.100:80 rr
  -> 192.168.13.112:80            Route   1      0          0         
  -> 192.168.13.115:80            Route   1      0          0 
###显示统计信息
[root@lvs ~]# ipvsadm  -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.13.100:80                  36     3488        0   190186        0
  -> 192.168.13.112:80                  18     3398        0   182647        0
  -> 192.168.13.115:80                  18       90        0     7539        0

1. Conns    (connections scheduled)  已经转发过的连接数
2. InPkts   (incoming packets)       入包个数
3. OutPkts  (outgoing packets)       出包个数
4. InBytes  (incoming bytes)         入流量(字节)  
5. OutBytes (outgoing bytes)         出流量(字节)

#看速率
[root@lvs ~]# ipvsadm -ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.13.100:80                   0        0        0        0        0
  -> 192.168.13.112:80                   0        0        0        0        0
  -> 192.168.13.115:80                   0        0        0        0        0

1. CPS      (current connection rate)   每秒连接数
2. InPPS    (current in packet rate)    每秒的入包个数
3. OutPPS   (current out packet rate)   每秒的出包个数
4. InBPS    (current in byte rate)      每秒入流量(字节)
5. OutBPS   (current out byte rate)      每秒出流量(字节)

所有RS配置#

配置好网站服务器,测试所有RS

###real-server1机器
[root@real-server1 ~]# yum -y install nginx
[root@real-server1 ~]# vim /usr/share/nginx/html/index.html
111111111
###real-server2机器
[root@real-server2 ~]# yum -y install nginx
[root@real-server2 ~]# vim /usr/share/nginx/html/index.html
22222222

配置完成之后访问本机 看是否能正常访问 访问成功之后进行配置

在两台real-server机器进行以下配置

[root@real-server1 ~]# ip a add dev ens33 192.168.13.100/32
[root@real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@real-server1 ~]# systemctl restart nginx

nginx关闭长连接#

[root@real-server1 ~]# vim /etc/nginx/nginx.conf
    keepalive_timeout   0;

测试访问#

image-20240923214116437 image-20240923214143099

成功!!

LVS/NAT模式#

准备工作(集群中所有主机关闭防火墙 selinux)#

在分发器中添加一个桥接网卡

主机名ip系统用途
lvs桥接
192.168.13.111 仅主机
centos7.9分发器
real-server1192.168.13.112 仅主机centos7.9web1
real-server2192.168.13.115 仅主机centos7.9web2

lvs机器安装ipvsadm工具

[root@lvs ~]# yum -y install ipvsadm

将两台后端web服务器准备好并测试正常访问

real-server机器配置#

###两台后端服务器都配置
[root@real-server1 ~]# ip r add default via 192.168.13.111		# 配置默认路由(real—server的网关设置成director的DIP即可,real-server就能找到director了)

lvs机器配置#

# 配置lvs-server  开启路由转发
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@lvs ~]# sysctl -p			//使添加的参数生效
(以下的ip是添加的桥接网卡的ip)
[root@lvs ~]# ipvsadm -A -t 10.8.165.229 :80 -s rr
设置后端服务器:
[root@lvs ~]# ipvsadm -a -t 10.8.165.229 :80 -r 192.168.13.112:80 -m
[root@lvs ~]# ipvsadm -a -t 10.8.165.229 :80 -r 192.168.72.115:80 -m
保存规则
[root@lvs ~]# ipvsadm -S > /etc/sysconfig/ipvsadm

访问测试#

[root@lvs ~]# elinks -dump http://10.8.165.229

lvs使用keepalived实现高可用(DR模式)#

环境准备#

主机名ip系统用途
lvs-master192.168.13.111centos7.9主负载
lvs-slave192.168.13.114centos7.9主备
real-server1192.168.13.112centos7.9web1
real-server2192.168.13.115centos7.9web2

关闭所有机器防火墙和selinux

配置安装两台后端web服务器并正常访问

两台lvs服务器配置#

[root@lvs ~]# yum -y install keepalived ipvsadm
###修改keepalived的配置文件
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lvs-keepalived-master    #主备机器改为lvs-backup 两台机器不能一样
}
vrrp_script check_ipvs {
   script "/etc/keepalived/ipvs.sh"  ##执行脚本,这个脚本是用于检测ipvsadm的状态,当它宕机后,关闭keepalived实现vip漂移,达到高可用的效果
   interval 5     #五秒执行一次
}

vrrp_instance VI_1 {
    state MASTER                    #主备机器更改为BACKUP
    interface ens33                 #VIP绑定接口
    virtual_router_id 80            #VRID 同一组集群,主备一致
    priority 100            		#本节点优先级,主备改为50
    advert_int 1            		#检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.13.100/24  			# 可以写多个vip
    }
    track_script {
        check_ipvs
    }
}
virtual_server 192.168.13.100 80 {  #LVS配置
        delay_loop 3   				#故障切换的时间
        lb_algo rr     				#LVS调度算法
        lb_kind DR     				#LVS集群模式(路由模式)
        net_mask 255.255.255.0
        protocol TCP     		 	#健康检查使用的协议
        real_server 192.168.13.112 80 { ##real-server的ip
                weight 1
                inhibit_on_failure  #当该节点失败时,把权重设置为0,而不是从IPVS中删除
                TCP_CHECK {         #健康检查
                        connect_port 80   #检查的端口
                        connect_timeout 3  #连接超时的时间
                        }
                }
        real_server 192.168.13.115 80 {
                weight 1
                inhibit_on_failure
                TCP_CHECK {
                        connect_timeout 3
                        connect_port 80
                        }
                }
}
###编写的脚本 并给执行权限
[root@lvs ~]# vim /etc/keepalived/ipvs.sh
[root@lvs keepalived]# chmod +x ipvs.sh
#!/bin/bash
systemctl status ipvsadm &> /dev/null
if [ $? -ne 0 ];then
        systemctl stop keepalived
fi

###主备服务器keepalived修改
###不需要执行脚本 当主负载机器启动之后vip会自动漂移到主备服务器
[root@lvs-slave ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id lvs-keepalived-master    #主备机器改为lvs-backup 两台机器不能一样
}

vrrp_instance VI_1 {
    state MASTER                    #主备机器更改为BACKUP
    interface ens33                 #VIP绑定接口
    virtual_router_id 80            #VRID 同一组集群,主备一致
    priority 100            		#本节点优先级,主备改为50
    advert_int 1            		#检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.13.100/24  			# 可以写多个vip
    }
}
virtual_server 192.168.13.100 80 {  #LVS配置
        delay_loop 3   				#故障切换的时间
        lb_algo rr     				#LVS调度算法
        lb_kind DR     				#LVS集群模式(路由模式)
        net_mask 255.255.255.0
        protocol TCP     		 	#健康检查使用的协议
        real_server 192.168.13.112 80 { ##real-server的ip
                weight 1
                inhibit_on_failure  #当该节点失败时,把权重设置为0,而不是从IPVS中删除
                TCP_CHECK {         #健康检查
                        connect_port 80   #检查的端口
                        connect_timeout 3  #连接超时的时间
                        }
                }
        real_server 192.168.13.115 80 {
                weight 1
                inhibit_on_failure
                TCP_CHECK {
                        connect_timeout 3
                        connect_port 80
                        }
                }
}

后端服务器配置#

添加vip

###临时添加
[root@real-server1 ~]# ip a add dev lo 192.168.13.100
###永久添加
[root@real-server1 ~]# echo "ip addr add dev lo 192.168.13.100" >> /etc/rc.local ##开启自动执行
[root@real-server1 ~]# source /etc/rc.local  ##手动执行
[root@real-server1 ~]# vim /etc/sysctl.conf 
[root@real-server1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1    ##关闭接收arp组播
net.ipv4.conf.all.arp_announce = 2  ##精确匹配IP 在多网卡环境中更智能地处理 ARP 请求,避免使用不合适的地址。

测试#

1.启动主负载和主备服务器中的ipvsadm和keepalived

[root@lvs ~]# systemctl start keepalived ipvsadm
查看主负载中是否有虚拟ip

1.关闭主负载的ipvsadm,开启主备服务器

查看主备服务器是否有虚拟ip 如果有说明ip漂移成功 实现了高可用

MySQL使用keepalived实现高可用#

环境准备#

lvs 192.168.13.111 主负载机器

lvs-slave 192.168.13.114 主备服务器

准备两台MySQL机器并做互为主从配置(过程略)

keepalived配置#

###两台机器都安装keepalived
[root@lvs ~]# yum -y install keepalived
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id master ###两台服务器的名字不同
}
vrrp_script check_run {
   script "/etc/keepalived/keepalived_check_mysql.sh"  ###执行检测mysql状态的脚本
   interval 5
}

vrrp_instance VI_1 {
    state MASTER   ###两台机器不同
    interface ens33
    virtual_router_id 89	###集群组ID相同
    priority 100 	###主负载优先级要大于主备服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.13.100/24	###虚拟IP
    }
    track_script {
        check_run   ##调用脚本 主备服务器不需要执行脚本 主备服务器的配置文件可以去掉脚本的配置
    }
}
###主备服务器
[root@lvs-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id backup
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 89
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.13.100/24
    }
}

主负载服务器脚本编写#

[root@lvs ~]# vim /etc/keepalived/keepalived_check_mysql.sh
#!/bin/bash
/usr/bin/mysql -uroot -p'12QW!@qw' -e 'show status' &> /dev/null
if [ $? -ne 0 ];then
        systemctl stop keepalived
fi
[root@lvs ~]# chmod +x /etc/keepalived/keepalived_check_mysql.sh

###启动测试

1.启动MySQL和keepalived进行测试 结果:主负载服务器要有VIP

2.关闭主负载服务器的MySQL进行VIP漂移 结果:主备服务器中要有VIP

3.重启主备服务器的MySQL和keepalived 结果:VIP要漂移到主备服务器

HAproxy使用keepalived实现高可用#

七层负载模型#

环境准备#

haproxy-master 192.168.13.111 主负载

haproxy-slave 192.168.13.114 主备

real-server1 192.168.13.112 nginx后端web服务器

real-server2 192.168.13.115 nginx后端web服务器

搭建负载均衡#

后端web服务器使用nginx,测试显示出页面(略)

haproxy服务器配置

###根据自己的服务器进行修改
[root@haproxy-master ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2 info
    pidfile     /var/run/haproxy.pid
    maxconn     4000   #优先级低
    user        haproxy
    group       haproxy
    daemon               #以后台形式运行ha-proxy
    nbproc 1                #工作进程数量  cpu内核是几就写几
defaults
    mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层       
    log                     global
    retries                 3   #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  #服务不可用后重定向到其他健康服务器。
    maxconn                 4000  #优先级中
    contimeout              5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
    clitimeout              50000 #客户端超时
    srvtimeout              50000 #后端服务器超时
listen stats
    bind                        *:80
    stats                       enable
    stats uri                   /haproxy  #使用浏览器访问 http://192.168.13.111/haproxy,可以看到服务器状态(uri不
可改变)  
    stats auth                  boforest:123  #用户认证,客户端使用elinks浏览器的时候不生效
frontend  web
    mode                        http
    bind                            *:80   #监听哪个ip和什么端口
    option                  httplog             #日志类别 http 日志格式
    acl html url_reg  -i  \.html$  #1.访问控制列表名称html。规则要求访问以html结尾的url
    use_backend httpservers if  html #2.如果满足acl html规则,则推送给后端服务器httpservers
    default_backend    httpservers   #默认使用的服务器组
backend httpservers    #名字要与上面的名字必须一样
    balance     roundrobin  #负载均衡的方式
    server  http1 192.168.13.112:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    server  http2 192.168.13.115:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

保存退出进行测试 访问haproxy服务器的IP 结果:要能跳转到后端服务器

搭建HAproxy高可用#

###两台机器都安装keepalived
[root@haproxy-master ~]# yum -y install keepalived
! Configuration File for keepalived

global_defs {
   router_id master ###两台服务器的名字不同
}
vrrp_script check_haproxy {
   script "/etc/keepalived/haproxy.sh"  ###执行检测mysql状态的脚本
   interval 5
}

vrrp_instance VI_1 {
    state MASTER   ###两台机器不同
    interface ens33
    virtual_router_id 89	###集群组ID相同
    priority 100 	###主负载优先级要大于主备服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.13.100/24	###虚拟IP
    }
    track_script {
        check_haproxy   ##调用脚本 主备服务器不需要执行脚本 主备服务器的配置文件可以去掉脚本的配置
    }
}

###主备服务器配置
[root@haproxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id backup
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 89
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.13.100/24
    }
}

###启动测试

1.启动HAproxy和keepalived进行测试 结果:主负载服务器要有VIP

2.关闭主负载服务器的HAproxy进行VIP漂移 结果:主备服务器中要有VIP

3.重启主备服务器的HAproxy和keepalived 结果:VIP要漂移到主备服务器

四层负载模型#

主负载和主备服务器中HAproxy配置文件修改

###两台服务器均配置
[root@haproxy-master ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2 info
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    nbproc      1  # 工作进程数量

defaults
    mode                    tcp  # 设置为 TCP 模式
    log                     global
    retries                 3  # 健康检查重试次数
    option                  redispatch  # 服务不可用时重定向到其他健康服务器
    maxconn                 4000  # 最大连接数
    contimeout              5000  # HAProxy 与后端服务器连接超时(毫秒)
    clitimeout              50000  # 客户端超时
    srvtimeout              50000  # 后端服务器超时

listen stats
    bind                    *:80
    stats                   enable
    stats uri               /haproxy  # 状态页面的 URI
    stats auth              boforest:123  # 用户认证

frontend web
    mode                    tcp  # 设置为 TCP 模式
    bind                    *:80  # 监听所有 IP 的 80 端口
    default_backend         httpservers  # 默认后端服务器组

backend httpservers
    mode                    tcp  # 后端也设置为 TCP 模式
    balance                 roundrobin  # 负载均衡方式
    server http1           192.168.13.112:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
    server http2           192.168.13.115:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2

###将配置文件发送到主备服务器
[root@haproxy-master ~]# scp /etc/haproxy/haproxy.cfg 192.168.13.114:/etc/haproxy/

配置完成 其余不变

posted @   BoForest  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示
目录