- 日志里有uri,ip,来源(渠道)。分析渠道(下一波广告投哪里)。中国在向服务行业转型,大家都玩数据,卖服务。
- 钱花在营销上。
- 所有的公司都有高并发的问题,如何实现高并发(lvs)?
- 先学计算机网络吧。(非科班o(╥﹏╥)o)
什么是网络
- 计算机软件工程学,分层思想。OSI7层参考模型。但是学TCP/IP精简过后的5层(链路层和物理层拆开)。
应用层(http等)->传输控制层(tcp/udp)->网络层(路由表下一跳)->链路层(mac地址)->物理层
应用层http(用户态)
-
cd /proc/?/fd?代表当前bash的进程号。 fd是文件描述符 -
0 输入 1 输出 2错误输出
-
exec 8<> /dev/tcp/www.baidu.com/80Linux万物皆文件。 建立了一个socket(内核态从传输层开始向下) 和百度握手 -
第一步建立连接,第二步发送数据
-
协议就是约束,规定。
echo -e 'GET / HTTP/1.0\n' >& 8 这里面其实就是http协议。就是规约。后面的\n必须有
&代表后面的8不是文件而是文件描述符
把这句话通过socket发出去
-e 是能识别里面的转义即 换行符
============================================
cat 0 <& 8 从socket中读出东西 。能拿到百度的信息。
应用层是用户态,从传输控制层开始往下是内核态。
传输控制层(开始内核态,和应用无关)里面有端口
- TCP 面向连接(不是物理的,指的三次握手)的可靠的。UPD 不是面向连接,不可靠
- 面向连接:确认过眼神。
- 三次握手、四次挥手
三次握手
============================================
C男人 S女人
男的看见了个女(没看见脸)。 第一次握手
女的也看了男的一眼。 第二次握手
这时候男的看见女的的脸了,如果不看她了说明不好看,就不继续看了(不建立连接),否则说明好看 建立连接。 第三次握手
============================================
在IO的角度来说,双方都需要确认input 和output 都正常
C 发消息给 S,S接受到了(说明S的接受功能正常) 第一次握手
S 回送消息个C, C接受到了(说明C的接受功能正常,并且发送功能也正常) 第二次握手
这时候S 并不知道自己发送功能正不正常。
所以C 接着发消息给 S (S 确认自己的发送功能正常) 第三次握手
三次握手完成后才开始开辟线程。。
============================================
============================================
四次挥手
============================================
为什么要进行挥手。操作系统能开65535个端口。客户端会随机选一个端口进行连接。不够用
为什么是4次?
男人 女人
男给女说 要离婚 第一次
女给男说 知道了 第二次
女给男说 我也要离婚 第三次
男给女说 知道了 第四次
双方必须都同意。而且每个消息对方都会回送一次。
- 三次握手->数据传输->四次挥手 称为一个最小粒度 不可被分隔。
- 三次握手 必须都是和同一个对象。
nestat -natp一个socket就是 ip:port
[root@node1 fd]# netstat -anpt | grep sshd
# 最上面的这个listen 是一个父进程, 负责监听22端口。
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1017/sshd
# 有三个说明开了三个xshell
tcp 0 0 192.168.48.11:22 192.168.48.1:9244 ESTABLISHED 7038/sshd
tcp 0 64 192.168.48.11:22 192.168.48.1:8973 ESTABLISHED 2874/sshd
tcp 0 0 192.168.48.11:22 192.168.48.1:6555 ESTABLISHED 1223/sshd
tcp 0 0 :::22 :::* LISTEN 1017/sshd
传输控制层的三次握手需要发送的包其实不是这一层发的。这一层只准备这些包。发送由下面的层。
service mesh 号称下一代微服务标准。 学网络干啥都是必须的。
网络层,探路者(梳理网络,下一跳)
cat /etc/sysconfig/network-scripts/ifcfg-eth0
if interface
cfg config
eth 以太网 0 第一块网卡
- IP 是点分字节
- 掩码。拿着目标IP和掩码 会进行按位与(非常快)。可以得出机器所在网络的网络号!
route -n 路由表
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.48.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 192.168.48.2 0.0.0.0 UG 0 0 0 eth0
例如ping baidu
PING baidu.com (220.181.38.148) 56(84) bytes of data.
会用目标IP 220.181.38.148 和路由表里的掩码进行按位与。然后和第一列Destination匹配。
第三条匹配到了,且 gateway 192.168.48.2 这个就是下一跳的地址
第三条肯定能匹配上 叫默认网关!
网关列 中的0.0.0.0 代表是目标IP和本机的IP在一个网络内,不需要走路由。
网络层就负责找到下一跳,后面怎么发是链路层干的事儿
链路层
- 链路层通讯的地址 mac地址 arp表
DNS解析 IP和域名的映射。 ARP解析 IP地址和网卡硬件地址的映射
- 链路层封一个包(arp)。里面主要有三个内容
- 最外层:源目的mac地址
- 次外层:源目的IP
- 里层:源目的端口号(传输层来的)
TCP/IP协议是基于下一跳的机制。
ip是端点间。
mac地址是节点间。
如何知道网关的mac地址呢
- 一台机器开机后,不知道局域网里都有谁,会封一个arp包。包里的目标mac地址是FF:FF:FF:FF:FF:FF,目标IP是网关的IP。这个包发到交换机的时候,交换机看到包里的目标mac是全F,会将这个包进行广播。其他机器收到这个包,看到包里的目标IP不是自己,会把这个包丢弃。网关收到后,看到目标IP是自己,会返回一个arp包,这样我的机器就知道网关的mac地址了。
- 交换机(二层)有学习能力。能学到mac地址 对应哪个端口。
每台机器联网,交换机 会知道所有机器的mac地址。
- 源目mac地址每经过一次下一跳都要进行替换。源目IP地址不变换。
实验
node1 ip 192.168.48.11
node2 ip 192.168.48.12
给node2 添加了一块虚拟网卡 ip为 6.6.6.6
node1 如何 ping通 node2?
修改node1的路由表。让访问6.6.6.6时的下一跳指向192.168.48.12
lvs负载均衡
- 不是反向代理,代理必须手得握上。
为什么tomcat并发连接数少。因为tomcat是七层的。所以慢。中间还得三次握手等等。tomcat是java程序更慢了。用户态内核态切换。
- 路由器带着一家人上网。非常快。
- 负载均衡器 到网络层 偷窥传输层,偷窥端口号。
- NGINX是7层的 并发数是有上限的(官方5W个)。
- 由于负载均衡器没到应用层,所以不知道应用层是什么协议。需要后面的服务器都是镜像的。
最前端LVS(hold流量)->nginx(hold住握手)分流->tomcat(计算)
NAT模式
-
路由器 NAT,私有IP转公网IP
-
通信是非对称的。下载快上传慢
-
为了response包还能回去,Rserver的默认网关需要配置成负载均衡服务器。
-
请求和响应都走负载均衡器,压力大,算力和 非对称的原因。
引出另一种模式
DR(直接路由模型)
- 后端两个server中都隐藏一个VIP(对外隐藏,对内可见)。和负载均衡服务器上的VIP是一个东西。请求和响应走一个环形。
CIP->VIP这个包到了负载均衡服务器这如果没有NAT,这个包就在这停住了,因为本身自己就是VIP,目的IP也是VIP- 不止网络层能干事情,还有链路层。动二层不动三层。欺骗MAC。
- 负载均衡器给RIP的server发包。把最外层mac欺骗成了rip的mac。这个包里面目标地址是VIP。而且RIP的机器上隐藏了一个VIP。所以能接受到。
- 负载均衡服务器和Rserver需要在同一局域网。
隧道模式
- 隧道TUN。对比翻墙。一个包里包含了一个真的信息的包。IP的数据报背着IP的数据包。
lvs
Linux virtual server 1998年5月国人章文嵩
隐藏VIP的方法
/proc/sys/net/ipv4/conf/eth0 修改两个内核参数
arp_ignore:收到arp请求的响应级别
arp_announce:将自己mac地址向外的通告级别
就是让Rserver 不要暴露自己身上的VIP。只有自己知道
- LO网卡是一个虚拟的网卡。这个网卡的特点就是外界连不到他身上。在它身上开一个子网卡。为VIP
调度方法
- 看谁身上的连接数少就给谁。那么如何知道连接数是多少的呢。偷窥!三次握手他能偷窥到两次。分手也能偷窥到。
- 加权最少连接
- 轮询rr
- ……
ipvs
- lvs已经成了Linux内核的一个模块。跟他打交道需要用
ipvs vmware出了提供了虚拟主机。还提供了虚拟网络- node1:
ifconfig eth0:8 192.168.48.100/24VIP - node2,node3作为RServer。需要先调协议,隐藏VIP。
- 修改内核
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 这一定掩码要全是255 如果是255.255.255.0 会产生192.168.48.0的网络号。脑补。
ifconfig lo:8 192.168.48.100 netmask 255.255.255.255
- node2,node3 上
yum install httpd echo 'from nodeX' /var/www/html/index.html创建主页。访问浏览器就应该有效果。yum install ipvsadm -y在node1上安装ipvsadmipvsadm -A -t 192.168.48.100:80 -s rr入口规则:接受80端口的tcp。调度方式rripvsadm -a -t 192.168.48.100:80 -r 192.168.48.11 -g -w 1配置realserver- 在node1上
netstat -anltp看不到连接的建立。说明没有握手 ipvsadm -lnclvs的偷窥记录表。
FIN_WAIT,说明是正常的。SYN_RECV,说明握手没有建立,只发送了第一个sync等待接受对面的包。有问题。排障
keepalived
如果lvs挂了。那么业务就下线了 单点故障。
- realserver也会挂。但是lvs中还有记录,部分业务不正常。
- 单点故障的解决办法就是一变多。
- 主备,主机上有VIP 备机没有。
- 主主,用的不多。
- 主备,皇帝和皇子们。
- 备机定时监控主机挂没挂。对主有压力。皇子实时监控皇帝
- 主周期的向所有备机发广播包。皇子发现皇帝三天没上朝就揭竿而起。
- 所有备机,亮出权重。推让制。
- 主从 互相协作。和主备不一样。
- 如何判断realserver挂了。 换言之如何知道百度挂了
ping不通。这不能判断应用层是不是坏了。网络有7层。应该验证应用层的http协议。看返回值。
- 主机和备机都要安装
keepalived。- 监控自己身上的lvs服务。
- 互相通信。master广播。backup准备选举。
- 帮忙配置ipvsadm等配置。(keepalived有配置文件)
- 对realserver做健康检查
- keepalived是一个通用的服务。来实现HA
- nginx也可以用keepalived
- 不要为了技术而技术,主机很贵 备机便宜。坏了赶紧修主 再换回去。
- 不是所有的主备,主好了都能抢回来。LVS-HA可以抢回去,备自动降级。
- keepalived是有问题的,进程异常退出。主备身上VIP都在了。
搭建
- 清除之前node1上LVS的配置
ipvsadm -C清除配置。 yum install keepalived ipvsadm -ynode1,node4- 配置文件
vim /etc/keepalived/keeplived.conf
vrrp_instance VI_1 {
state MASTER // 备机改成BACKUP
interface eth0
virtual_router_id 51
priority 100 // 备机优先级改成50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.48.100/24 dev eth0 label eth0:8 // VIP
}
}
// 类似ipvsadm -A -t xxx -s rr
virtual_server 192.168.48.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR //DR模式
nat_mask 255.255.255.0
// 如果不是0,lvs会让一个用户 在一段时间 一直和一个realserver通信。
persistence_timeout 0
protocol TCP
// 出口 ipvsadm -a -t xxx -r xxx -g -w 1 realserver
real_server 192.168.48.13 80 {
weight 1
// 确定realserver服务是好的。
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.48.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
- 当master挂了,备机会顶上。客户无感知
- 当master复活,会抢回来。
- 当一个realserver挂了。
ipvsadm -ln会去自动掉这个记录。 - 当一个realserver复活,
ipvsadm -ln会自动添加这个记录。