slb_负载均衡
- 负载均衡就是利用slb技术来均衡的分发请求给后端一组服务器
实现:
- 硬件:商业集群软件,如F5,netscaler(实体硬件)
- 软件:nginx+一台服务器就组成了一个负载均衡服务器
正向代理
理论:
- 代理的是客户端,是反过来的;比如vpn将你的身份做了代理,服务端就不知道客户端到底是谁;简单对比即可;
实现:
- 正向代理服务器配置:
server{
listen 80;
location / {
proxy_pass https://172.16.40.235:9074;
}
}
- 这时候访问这个正向代理服务器就会直接转发到目的地址了
🤔疑问:这不跟反向代理一样的配置吗?
反向代理
理论:
- 就是代理服务器,隐藏了后端的真实服务器;在客户端眼中,代理服务器就是数据服务器了;因此反向代理代理的是后端的服务器;
实现:
- 没啥说的 基础东西
- nginx的负载均衡就是基于upstream和proxy_pass
![[Pasted image 20250324222058.png]]
实现四层转发(stream)
- 只是基于mac地址,网线,到ip地址结束
- 四层也是基于upstream实现地址池,四层的形式都是ip:port形式,且是在stream{}大区域里面设置
- 四层没有http{}这个参数,类似并列关系
db1:
create user root@'%' identified by 'zhaoxi';
grant all privileges on *.* to root@'%';
db2:
create user root@'%' identified by 'zhaoxi';
grant all privileges on *.* to root@'%';
agent:(测试连接)
yum install mariadb -y
mysql -pzhaoxi -h192.168.32.101
agent:stream(做四层负载)
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2
./configure --prefix=/usr/local/nginx --with-stream --with-stream_ssl_module
make -j$(nproc) && make install
echo "export PATH=/usr/local/nginx/sbin:$PATH"
vim /usr/local/nginx/conf/nginx.conf
(在http外)
stream {
upstream mysql_pools {
server 192.168.32.101:3306;
server 192.168.32.102:3306;
}
server {
listen 3306;
proxy_pass mysql_pools;
}
}
- 这时候随便找台机器测试就实现了nginx的四层负载
![[Pasted image 20250325194720.png]]
实现七层转发(upstream)
- upstream可以实现http的七层转发
- 上升到应用层协议,http
- 七层基于upstream定义服务器地址池,七层多一个server_name; 且是在http{}里面设置
开三台nginx
docker run -d -p 81:80 --name nginx1 nginx
docker run -d -p 82:80 --name nginx2 nginx
docker run -d -p 80:80 --name slb nginx
进入slb机器
docker exec -it slb bash
cat <<EOF> slb.conf
> upstream http_pools {
server 172.16.50.29:81;
server 172.16.50.29:82;
}
server {
listen 80;
location / {
proxy_pass http://http_pools;
}
}
> EOF
exit
docker exec -it slb nginx -s reload
访问本机localhost就会轮训nginx1,nginx2
![[Pasted image 20250326135841.png]]
![[Pasted image 20250326135853.png]]
😎 docker是真好用,轻轻松松搭一个负载均衡环境;
负载均衡策略
lb调度算法
调度算法一般分为两类:
- 静态调度算法:根据自身设定的规则进行分配,不考虑后端节点的健康情况(貌似也可以,就是upstream会把无法访问的机器自动剔除);如轮询、加权轮询、哈希类型调度算法。
- 动态调度算法:判断后端节点的状态来决定是否分发请求,例如链路数最少的优先分发,相应时间短的优先分发,如least_conn、fail等都是动态调度。
rr轮询
- 按照请求顺序分发,如果后端节点宕机,会自动从地址池中剔除
权重轮询
- 为了解决新旧服务器性能不均衡的问题
upstream test_pools {
server localhost weight=1;
server localhost weight=2;
}
ip_hash
- 感觉没鸟用,不学了
- 和权重冲突,写了权重的参数也不生效
- 唉说下吧 就是client第一次访问一台机器给调度到a后端,后面访问请求都会分给a后端了
小插曲🚗(判断机器的tcp连接数)
ss -an
-a 显示所有socker
-n 不做域名解析,显示ip
![[Pasted image 20250331212448.png]]
ss -an | grep -i estab | grep 192.168.4.247:22
显示当前有多少ssh已经estab的连接
netstat -an 一样
netstat -tunlp t tcp/ u udp/ n not resolve/ l listen/ p display pid
lb调度参数
backup
upstream test {
server test;
server test backup;
}
- 被标记为备份的服务器,其他挂了才会分发到这台;
max_failes
- 允许请求失败的的次数,一般和fail_timeout结合用;
fail_timeout
- 经过max_failes失败后服务暂停的时间;
down
upstream test {
server test;
server test down;
}
- 标记这个机器停止使用了;
max_conns
- 限制最大接受的连接数;
nginx负载均衡优化架构
![[Pasted image 20250331220759.png]]
nginx实现七层代理转发
![[Pasted image 20250331221226.png]]
[[https]]