1. TCP/IP协议回顾
内容图1
内容图2
内容图3
TCP/IP协议 OSI 7层参考模型:
对于从百度获取一个GET请求的全过程。
首先是从第七层应用层开始,应用层通俗来说就是应用程序,类似浏览器,应用层中有http、smtp、ssh
协议,很明显此处使用的是http协议,http协议就是规定的字符串的书写格式与表示形式以及两端的交互形式,http协议由请求头+响应体+响应头组成,当输入www.baidu.com
,应用层所负责的就是将这个网址转化为GET /
即可,然后往下传输层传。
传输层是第四层,传输层中有tcp、udp
协议,传输层所控制的就是数据传输,其中包括三次握手+传输数据+四次分手,具体的三次握手过程与四次分手过程:
三次握手之后,这个过程是属于两个物理节点之间的交互,三次握手成功之后,可以说是建立了一个Socket连接,此时的socket组成为IP:port - IP:port,以此组成独一无二的连接对。这样就可以保证每个人访问百度,百度可以对每一个人做出相对应的响应,而不至于出错。
至于为什么需要四次分手,这是由于B第一次返回的请求只是B确认收到分手的请求,不代表B是要分手,B中可能由于某些数据还未发送完全,而不愿意分手,当等待一段随机的时间之后,B的数据发送完了,此时B回送Fin的请求,A收到之后返回Ack,此时四次分手走完,双方断开连接。
从传输层三次握手之后,建立连接,但是传输层不具备数据传输的能力,负责的只有连接与断开连接的控制。此时需要往下走,到第三层网络层,进行数据传输,网络层的有ip、icmp
协议,是基于下一跳来实现的,在网络层中有路由表,根据路由表来实现下一跳,由于网络层需要找到出口,此时需要引入链路层,链路层中有个很重要的协议ARP
协议,ARP协议的话是通过广播方式获取到相应的物理地址,网络层通过链路层中获取到的物理地址,找到出口,实现数据的交互。
总的来说,访问百度网址是一个阻塞式的过程,首先通过应用层发送GET /
,此时需要阻塞进入到传输层进行三次握手处理,三次握手的第一次需要发送一个sync请求,此时的请求需要通过网络层的下一跳找到相应的出口,而出口的地址需要通过链路层的arp协议来获取,此时如果走到了目标地址,目标回送一个sync+ack,再通过链路层传回,网络层跳回,传输层收到,发送ack确认,于是三次握手成功,双发可以进行数据的收发。
经过传输层、网络层、数据链路层的主要功能就是对数据包进行封装,首先在传输层添加原端口号和目的端口号,同时其中的6为flag标志可以判断传输层当前发送的消息是什么类型的,比如是A发送给B的sync或者B发送给A的sync+ack等等,通过标志位来判断;到了网络层,此时需要添加源IP地址和目标IP地址;到了数据链路层,此时需要添加源MAC地址与目标MAC地址。
双方要建立连接需要走完整个七层。
具体的数据包封装:
注意:
- 整个互联网是建立在下一跳的模式下
- IP是逻辑上的两个端点
- MAC是物理上连接的两个节点
- 端点键TCP传输过程中
- 确认机制
- 状态机制
- 不可分割
- 解析数据包需要成本
- 交换机:二层,只关系MAC地址,通过学习机制实现
- 路由器:三层,只关心IP地址和路由表,三层包含二层
- LVS服务器:四层,只关心PORT和端口号,状态等,转发,但是不知道内容
- nginx:七层,关心Socket对应关系
2. LVS负载均衡学习&示例
- LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,
- ipvs:嵌入到Linux的内核
- ipvsadm:管理应用程序
- 类型:
- NAT:地址转换
- DR:直接路由
- TUN:隧道
LVS调度方法:
- 四种静态:
- rr:轮询(主要是掌握这一种)
- wrr:加权循环
- dh:将报文IP头部的目的地址进行哈希计算,之后根据hash值在由真实服务器组成的buckets数组中查找目标服务器
- sh:将连接调度到连接数量较少的真实服务器
- 动态调度方法:
- lc:最少连接
- wlc:加权最少连接
- sed:最短期望延迟
- nq:never queue
- LBLC:基于本地的最少连接
- DH:将报文IP头部的目的地址进行哈希计算,之后根据hash值在由真实服务器组成的buckets数组中查找目标服务器
- LBLCR:基于本地的带复制功能的最少连接
- 默认方法:WLC加权最少连接
搭建项目,LVS负载均衡调度:
- 准备3个虚拟机,配置3台虚拟机的网络
- eth0,配置在一个网段,DIR,RIP在一个网段
- 配置lvs的VIP
ifconfig eth0:0 192.168.87.100/24
echo 1 > /proc/sys/net/ipv4/ip_forward
- 调整RS的响应,通告级别(每一台RS都配)
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 配置RS的VIP,每一台RS都配
ifconfig lo:8 192.168.87.100 netmask 255.255.255.255
- 启动RS上的httpd的服务器,如果没安装的话,就先安装
yum install httpd -y
- 手动进入到
/var/www/html
中手动编写一个index.html的页面 - 启动httpd服务,即可在浏览器上访问两个RS,注意端口是80,如果访问无效,注意到
vi /etc/sysconfig/iptables
开启80端口,此时可以单独访问,但是VIP此时是访问不了 - 此时切换到VIP也就是lvs服务器上,进行到ipvsadm的安装,主要是后续的管理可视化,
yum install ipvsadm -y
,安装之后 ipvsadm -A -t 192.168.87.100:80 -s -rr
配置VIP也就是lvs负载均衡服务器- 解释上面配置中参数意义:
工具 -A添加一个集群服务,-t表示使用tcp协议,集群服务地址,-s指定集群调度算法,-rr指代轮询算法
ipvsadm -a -t 192.168.87.100:80 - r 192.168.87.102 -g
ipvsadm -a -t 192.168.87.100:80 - r 192.168.87.103 -g
- 解释上面配置中参数意义:
工具,-a添加一个真实服务器,-t使用tcp协议,服务地址,-r指明真实服务器地址 -g指代真实服务器转发工作模式DR模式,默认使用此模式
ipvsadm -ln
表示查看当前连接情况ipvaadm -lnc
表示查看lvs转发情况统计netstat -natp
查看当前网络状态,-n表示不显示真实名,显示ip地址,-a是所有的,-t表示tcp协议,-p表示进程
内容图*
内容图
3. Keepalived学习
鉴于刚刚的实验中,虽然设置了VIP来利用负载均衡机制来轮询两个RealServer,但是就实验而言,首先当后端RS挂了,访问不了,VIP的ipvsadm中还是能够查询到此RS服务器的连接,也就是lvs服务器中并不知道它已经挂了,这个需要改进;当lvs挂了的话,两个RS就不能工作,此时需要改进这个,将我们的lvs改成主备模式的,这样的话,即使主服务器挂了的话,可以切换到从服务器,这样的话,对于客户端访问RS的用户不会有任何的影响。
为解决上述的问题,可以引入Keepalived
Keepalived是集群管理中保证集群高可用的服务软件
高可用High Available
- 需要心跳机制探测后端RS是否提供服务
1.1 探测down,需要从lvs中删除RS
1.2 探测发送从down到up,需要从lvs中再次添加RS - Lvs DR,需要主备(HA)
Keepalived原理:
VRRP协议:Virtual Router Redunancy Protocol(虚拟路由冗余协议)
IP漂移,对于我们从服务器的挂载ip有很重要的意义。
Keepalived就是替代ipvsadm的,有了它可以不用安装ipvsadm
实例:
说明:
01.ip地址,192.168.87.101 用作lvs负载均衡主服务器
02 ip地址,192.168.87.102 用作RS01,真实服务器
03 ip地址,192.168.87.103 用作RS02,真实服务器
04 ip地址,192.168.87.104 用作lvs负载均衡备用服务器
首先安装keepalived,在01和04执行yum install keepalived ipvsadm -y
,进入到01的cd /etc/keepalived
,会看到keepalived.conf配置文件,首先备份,有利于改错还原,cp keepalived.conf ./keepalived.conf.bak
,此时进入到conf文件中,以下为配置好了的
! Configuration File for keepalived
global_defs { // 全局配置 此部分配置如果有需要可以配置
notification_email { // 提醒的邮箱
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP // 状态为备用服务器,主的为MASTER
interface eth0 // 使用的网络接口为eth0
virtual_router_id 51
priority 90 // 权重为90,备用服务器这个参数从主开始逐次降低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
// 配置VIP地址
// 等同于:ifconfig eth0:3 192.168.87.100/24
virtual_ipaddress {
192.168.87.100/24 dev eth0 label eth0:3
}
}
// 配置虚拟服务器,设定为192.168.87.100
<!--
以下的配置等同于在lvs实验中的
ipvsadm -A -t 192.168.87.100:80 -s -rr
-->
virtual_server 192.168.87.100 80 {
delay_loop 6 // 延迟循环
lb_algo rr // 轮询策略
lb_kind DR // 转发模式
nat_mask 255.255.255.0 // 子网掩码
persistence_timeout 0 // 持续的时间,实验配置成0,否则会一直调用一个RS
protocol TCP // TCP协议
real_server 192.168.87.103 80 { // 配置RS
weight 1 // 权重
HTTP_GET { // 获取采用的协议http
url {
path / // 跳转问题/可以直接跳转到/var/www/html中的index.html
status_code 200 // 成功的状态码200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.87.102 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置完之后,可以采用远程复制的方式将配置文件拷贝到04,scp ./keepalived.conf [email protected]:/etc/keepalived/
,只需要将02,03配置好的服务启动,如果没有配置可以参照前面的lvs实验配置,service httpd start
启动,01与04使用service keepalived start
,启动即可。
此时使用ifconfig
在01和04中可以发现04此时是没有eth0:3这个子接口的。
使用ipvsadm -ln
在01和04中可以看到
模拟lvs服务器挂了,只需要在01使用ifconfig eth0 down
也就是网卡禁用,此时会在04中使用ifconfig
看到eth0:3子接口,此时就发生了我们的vrrp虚拟路由冗余协议中的ip漂移现象
其中存在一个小bug,就是使用杀死线程的方式来中断lvs主服务器,这时候会发现在主备服务器的ifconfig
中都能够看到eth0:3这个子接口,而在互联网当中,这种具有相同ip地址的行为是不被允许的。
杀死线程的操作:
使用tail /var/log/messages
可以看见操作keepalived的日志记录
注意:实验可能出现的问题
- 主服务器挂了,192.168.87.100访问不了,这个主要是你的端口80未开放
- 权重从的一定不要设置的比主大或者等于主,否则一旦主挂了,后期修复了抢占不会来的,会出现前后都有eth0:3(这种是权重相等的情况)
4. nginx学习
5. 小结
这一节主要学习了网络的基础知识,对于七层协议的实际运用有了更多的理解,知道http协议是一个规定格式的字符串,一说到http就要想要请求头+响应体+响应头,应用层、传输层、网络层、数据链路层中各自的协议,三次握手为什么是三次,四次分手为什么是四次,都是很重要的知识,随后的lvs负载均衡服务器的实验,知道负载均衡服务器的作用是用作资源的调度。通过实验也发现负载均衡中出现的问题,随后就学习了Keepalived是集群管理中集群高可用的服务软件,基于VRRP协议,具有ip漂移的特性,在具体的实验中对于keepalived的作用更加的了解,它不同于lvs实验中的手动配置VIP的地址,而且RS服务器的健康状态,在lvs中没法检测,一旦挂了,lvs是不会发现的,而lvs一旦挂了,客户端就没法使用了。keepalived的高可用提供备用服务器,根据配置的权重,一旦主服务器挂了,马上选举出新的备用服务器作为主服务器,而对于RS服务器的健康状态,也是根据心跳机制来检测的,一点发现挂了,keepalived会down也就是下线这个RS,一旦发现修复了就up上线这个服务。
大数据学习路漫漫~加油! --沉下来,世界属于你!