了解网络通信基础搭建LVS DR模式

如何确定包的去向,比如ping www.baidu.com

域名解析后IP220.181.38.149,IP与对应的Genmask按位与,得到的值与Destination比较相同,则包发往对应的网关地址,Gateway为0.0.0.0为局域网内,可以直接通信,不要转发道网关

有了下一跳地址,怎么把数据包发往网关呢,需要链路层,通过arp -a,可以看到网关ip对应的mac地址

数据包中填写网关的目标mac替换为网关mac,目标ip为百度ip

通过ifconfig eth0:3 192.168.88.88 添加一个虚拟网卡,此时ping 192.168.88.88,是ping不通的,根据路由规则会把这个包发到网关,找不到对应的主机

接下来使用route add -host添加一条路由规则

就可以ping的通了

接下来了解下S-NAT(源地址-网络地址转换),在局域网内可以相互访问,当包发到公网上时,必须唯一确定你的IP,这就用到了地址转换 192.168.1.8 和192.168.1.6在一个局域网,都需要访问百度

就需要通过路由器将局域网将源ip转换为运营商提供的公网ip,端口不同,对应关系在路由器中记录,回包再次根据端口找到对应的ip:port客户端

负载均衡方案:

基于nginx的七层模型,相当于客户端先与nginx代理服务器建立连接,代理服务器在与服务建立连接

基于四层负载均衡:

不需要三次握手

  1. CIP-客户端IP

  2. VIP-对外访问的IP

  3. DIP-分发IP

4.server对应的真实IP

当客户端CIP数据包访问VIP服务时[源CIP,目VIP]

当数据包发送到四层设备时,可以参考局域网路由S-NAT地址转换一样,包数据包的目标ip替换为对应的server地址ip(Destination Network Address Translation目的地址转换),这样就可以把数据包发往对应的服务[源CIP,目RIP],数据是发过去了 ,回包地址[源RIP,目CIP]

经历过程 [源CIP,目VIP]->转换为[源CIP,目RIP]

源CIP,目RIP\]-\>\[源RIP,目CIP

返回的确认包源IP与发送时的目标地址不一致,数据是不能处理接收的

使用netstat -natp查看网络连接都是CIP-RIP建立起来的连接,要想客户端能收到响应的包,就必须是响应的包来源地址是VIP,可以通过2把响应的包发给四层负载,改变响应包来源为VIP 这样导致四层负载接受大量的客户端和响应端的包

要求真实服务器的网关指向四层负载,才能替换响应包的来源ip

DR(直接路由)模式:

在四层负载包直接将包的CIP->VIP包的目标mac地址改为RIP Server的mac地址,是在一个局域网中,这样包就可以发往server端,server端接不接收呢,本来是没有匹配的ip是会丢弃的,通过server端添加一个虚拟网卡Vip,同时这个VIP不对外暴露,这样当包发过来,就可以匹配上IP地址,接收数据包,响应包就可以直接发出,不需要在经过四层负载

搭建DR模式实验手册:

搭建原理

虚拟机软件会在本机创建一个vmnet-8网卡充当网关

IP地址为192.168.150.1,在虚拟机中创建四个centos服务节点,

当本机访问192.168.150.100:80服务时,根据netstat -nr查看macos系统路由表

包发往vmnet-8网卡,再发往下一跳到交换机虚拟网络,再到node01,根据lvs配置规则发往node02,node02响应回包经过交换机到 vmnet-8网卡,再到本机浏览器

brigdge101是macos创建的网卡:

查看路由表

查看node01,ip和路由表信息

1.安装虚拟机软件vmware fusion

创建四台虚拟机

1.配置node1,配置vip,使用 ifconfig ens33:2 172.16.175.100/24添加子协议

2.在node2,node3上设置隐藏vip,先要设置隐藏暴露vip,一定要使用echo 1 > arp_ignore修复,不能使用vi,会报错

然后在虚拟网卡上添加子协议设置vip,ifconfig lo:2 172.16.175.100 netmask 255.255.255.255

netmask设置为255.255.255.255,全匹配,防止访问172.16.175.# 其它地址都匹配到lo:2路由发不出去,死循环,路由是先匹配虚拟网卡

配置完VIP后

node2~node3安装yum install httpd -y 用于后面作为静态web服务做效果校验

启动 service httpd start

编辑 vi /var/www/html/index.html web服务默认主页

然后通过本机可以访问内容了

然后node1安装

yum install ipvsadm

然后添加规则 ipvsadm -A -t 172.16.175.100:80 -s rr

查看规则

然后添加负载

ipvsadm -a -t 172.16.175.100:80 -r 172.16.175.132 -g -w 5

成功添加了两天负载记录

然后在本机访问http://172.16.175.100/

刷新后访问到不同内容,负载成功了

node1 节点使用netstat -natp 命令查看

看不到socket 链接

node2~node3上netstat -natp查看到socket链接

查看本机socket 链接:

node1上使用ipvsadm -lnc 查看负载记录

考虑单点故障:

1.lvs会挂,RS也会挂

RS挂一部分用户请求异常,lvs存在这个负载记录

解决问题:

单点故障解决方式:一个有问题,就变多个 a)主备 b)主主

使用keepalived程序实现以下功能:

  1. 监控自己的服务

2.Master 通告自己还活着,Backup监听Master状态,Mater挂了,一堆Backup推举一个Master

3.配置vip,添加ipvs,keepalived是有配置文件

4.对后端server做健康检查

实验:

新增一台node4,在node1(主)和node4(备)安装keepalived, 当node1挂了后会切换到node4并设置网卡ip

第一步先在node1清除之前配置的规则

ipvsadm -ln查看

ipvsadm -C 清除

之前配置的子网卡:删除

ifconfig ens33:2 down

node1,node4:

安装 yum install keepalived ipvsadm -y

配置: /etc/keepalived/keepalived.conf

cp keepalived.conf keepalived.conf.bak //拷贝一份做备份

node1节点修复配置vrrp_instance

kotlin 复制代码
vrrp_instance VI_1 {
    state MASTER       //node4改为BACKUP
    interface ens33
    virtual_router_id 51
    priority 100       //node4改为50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.175.100/24 dev ens33 label ens33:3
    }
}

node1完整配置:

kotlin 复制代码
! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id LVS_DEVEL   vrrp_skip_check_adv_addr   vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_instance VI_1 {    state MASTER    interface ens33    virtual_router_id 51    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        172.16.175.100/24 dev ens33 label ens33:3    }}virtual_server 172.16.175.100 80 { //配置负载规则    delay_loop 6    lb_algo rr    lb_kind DR
    nat_mask 255.255.255.0    persistence_timeout 0       protocol TCP    real_server 172.16.175.132 80 {           weight 1        HTTP_GET {            url {              path /              status_code 200    //检查真实服务状态,返回200说明服务正常的            }            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }    real_server 172.16.175.133 80 {        weight 1        HTTP_GET {            url {              path /              status_code 200            }            connect_timeout 3            nb_get_retry 3            delay_before_retry 3        }    }}

拷贝文件到node4 ,修改为BACKUP,同时修改权重

kotlin 复制代码
scp ./keepalived.conf  172.16.175.134:`pwd`


! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict 
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.175.100/24 dev ens33 label ens33:3
    }
}

virtual_server 172.16.175.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP

    real_server 172.16.175.132 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.16.175.133 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

启动node1,node4

sql 复制代码
service keepalived start

通过keepalived程序代替了手动创建网卡负载

完成后,网页访问http://172.16.175.100/

发现访问不了检查配置,也没问题,node1自己ping也访问不通

网上搜索后发现 keepalived.conf 文件 vrrp_strict 这行删除重启

arduino 复制代码
service keepalived stop
service keepalived start

再次测试OK

查看node1主节点

有负载包信息

查看node4备机节点

测试node1节点挂了

node4节点创建了vip,接收了客户端数据包,实现了HA高可用

当node1主机执行后恢复时node1抢回了主节点,node4又恢复成了原样,node1继续接受客户端数据包

复制代码
ifconfig ens3 up

此时node4,vip删除恢复为备胎

接下来看realServer挂了,node2停止服务

arduino 复制代码
service httpd stop

node1,node4节点,通过http检查服务状态,发现错误,就会剔除负载

node2恢复后,node1,node4又恢复负载

sql 复制代码
service httpd start
相关推荐
南囝coding3 小时前
Claude 封禁中国?为啥我觉得是个好消息
前端·后端
六边形工程师3 小时前
Docker安装神通数据库ShenTong
后端
六边形工程师3 小时前
快速入门神通数据库
后端
重生成为编程大王3 小时前
FreeMarker快速入门指南
java·后端
板鸭〈小号〉3 小时前
UDP-Server(2)词典功能
网络·网络协议·udp
Dear.爬虫3 小时前
Golang的协程调度器原理
开发语言·后端·golang
元闰子3 小时前
怎么用CXL加速数据库?· SIGMOD'25
数据库·后端·面试
幂简集成4 小时前
GraphQL API 性能优化实战:在线编程作业平台指南
后端·性能优化·graphql
编码浪子4 小时前
趣味学RUST基础篇(构建命令行程序1)
开发语言·后端·rust
周小码4 小时前
极快文本嵌入推理:Rust构建高性能嵌入推理解决方案
开发语言·后端·rust