了解网络通信基础搭建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
相关推荐
向前看-3 小时前
验证码机制
前端·后端
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
njnu@liyong7 小时前
图解HTTP-HTTP报文
网络协议·计算机网络·http
AskHarries7 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion8 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp8 小时前
Spring-AOP
java·后端·spring·spring-aop
kaixin_learn_qt_ing8 小时前
了解RPC
网络·网络协议·rpc
TodoCoder9 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚9 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心10 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端