负载均衡
什么是负载均衡
是指将负载进行平衡,分配刀多个操作单元上进行运行。
为什么要使用负载均衡
当我们的web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我们使用多台web服务器组成集群,前端使用nginx负载均衡,将请求分散的达到我们的后端服务器集群中,实现负载的分发,那么会大大的增强
实现方法
硬件:f5
软件:
七层:nginx、haproxy
四层:LVS(nginx、haproxy)
云厂商:
云厂商负载均衡的名词:
SLB
CLB
ULB
QLB
四层负载均衡
性能好,工作在传输层,
七层负载均衡
性能一般,可以改写包头的信息,实现http信息的改写、头信息的改写、安全应用规则控制等等。在应用层的服务中,我们能做的内容更多。(nginx)
四层和七层负载均衡的区别
四层:性能好,支持功能弱
七层:性能差,支持功能强
所以在实际应用场景中,我们会选择四层结合七层共同使用。
实现方法
- 配置webserver
server {
listen 80;
server_name blog.wenjie.com;
root /code/wordpress;
client_max_body_size 100m;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 配置负载均衡
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name web.oldxu.com;
server_name blog.wenjie.com;
server_name zh.wenjie.com;
location / {
proxy_pass http://web;
include proxy_params;
}
}
proxy_params文件中内容如下:
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
- 使用浏览器访问测试
负载均衡调度算法
- 轮询调度算法(默认)
- weight 加权轮询 (weight权限越高,被调度的次数就越多)(常用于服务器性能不同)
(配置在负载均衡地址池中)
示例:
upstream zh {
server 172.16.1.7:80 weight = 5;
server 172.16.1.8:80 weight = 1;
}
3.ip_hash 表示每个请求按照ip_hash的结果分配的固定的节点。(用于需要登陆的网站,解决会话保持的问题,但是可能会导致后端某一个节点压力过大而其他节点没什么压力)
- least_conn表示将请求传递给活动连接最少的服务器。
为了保证能够公平调度到后端某个节点,同时我们还需要保证会话的保持,这时候我们就需要使用redis来存储用户的会话信息。
负载均衡后端状态
- down 当前server暂时不参与负载均衡
- backup 预留的备份服务器
- max_fails 允许请求失败的次数
- fail_timeout 经过max_fails失败后,服务暂停时间
- max_conns 限制最大的接收连接数
配置的位置与调度算法配置的位置相同。
状态配置示例:
upstream node {
server 172.16.1.7:80 max_fails=3 fail_timeout =10s max_conns = 1000;
server 172.16.1.8:80 max_fails=3 fail_timeout=10s max_conns = 2000;
}
代理如何与后端建立长连接
keepalive:表示设置没有worker进程缓存到后端应用服务器的空闲连接最大数量。如果超过次数字,则关闭最近使用的最少连接,配置在upstream中,配置方法:
keepalive 16;
# 配置最大空闲连接数量为16个。
keeplive_timeout 100s;
# 配置空闲连接的超时时间是100s。
使用图形界面查看nginx负载均衡情况的方法
需要安装第三方软件,同时还需要重新编译Nginx。
案例:把后端请求超时的服务器平滑的切换到另一台上
nginx配置文件如下:
别的都与上面相同,只需要在location中加入如下信息:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
# 当其中一台返回错误码500、502等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率
redis
会话保持
用户登陆百度网站以后,然后关闭浏览器,当我们再一次登陆百度以后,会发现我们仍然是在登陆状态,这就是会话保持。
会话保持实现的原理:
- 当用户首次请求服务端网站时,服务端会通过程序生成sessior_id,然后使用set-cookie的方式将sessio_id下发给浏览器,浏览器会将sessionID存储至本地cookie中。
- 当用户再次请求服务端网址时,浏览器会在Headers头信息溴代该网站的cookie信息,那浏览器携带的cookie信息则是第一次请求网站时服务端给下发的session_ID
- 当用户登陆该网站后,服务端会将对应的sessionID存储到(mysql\redis\memcached\file)
- 当用户下次在请求网站时,服务端程序会验证浏览器提交的sessionID
cookie:一般存放到cookies中,主要存放信息(sessionID)
session:由服务端程序生成,生成的是一个叫sessionID的编号,存储在服务器,主要存放的信息由:sessionID对应的用户名、登录信息等。
实现
1.搭建Nginx+WEB的轮序调度
1)在两台web节点上安装phpmyadmin
[root@web01 ~]# unzip phpMyAdmin-5.0.2-all-languages.zip -d /code/
[root@web01 code]# ln -s /code/phpMyAdmin-5.0.2-all-languages/ /code/phpmyadmin
[root@web01 code]# cd /code/phpmyadmin/
[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 phpmyadmin]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51';
#授权
[root@web01 phpmyadmin]# chown -R www.www /var/lib/php/
#Nginx配置文件
[root@web01 code]# cat /etc/nginx/conf.d/phpmyadmin.oldxu.com.conf
server {
listen 80;
server_name phpmyadmin.oldxu.com;
root /code/phpmyadmin;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web01 code]# nginx -t
[root@web01 code]# systemctl reload nginx
#web02
1.拷贝配置文件
2.拷贝代码
3.重建软链接
4.授权
5.重启Nginx
2.接入负载均衡
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_phpmyadmin.oldxu.com.conf
upstream php {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name phpmyadmin.oldxu.com;
location / {
proxy_pass http://php;
include proxy_params;
}
}
nginx -t
systemctl restart nginx
3.将存储在本地的Session,让其存储在Redis中。
1)安装Redis
[root@db01 ~]# yum install redis -y
2)配置 Redis (这个IP地址是本机的内网IP地址)
[root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3)启动Redis
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis
[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.16.1.51:6379 0.0.0.0:* LISTEN 8966/redis-server 1
==============所有的web节点都需要操作一遍的。==============
4.修改( web01 web02 ) php程序,将原本存储至本地的SessionID,修改为存储至远程的Redis服务器
[root@web02 ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379?weight=1&timeout=2.5" #连接redis
;session.save_path = "tcp://172.16.1.51:6379?auth=123456&weight=1&timeout=2.5" #redis有密码
#注释php-fpm中控制session存储的路径
[root@web02 ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
重启php-fpm
[root@web02 ~]# systemctl restart php-fpm
4.测试访问,查看效果。