如何确定包的去向,比如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代理服务器建立连接,代理服务器在与服务建立连接
基于四层负载均衡:
不需要三次握手
-
CIP-客户端IP
-
VIP-对外访问的IP
-
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程序实现以下功能:
- 监控自己的服务
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