负载均衡

负载均衡

什么是负载均衡

是指将负载进行平衡,分配刀多个操作单元上进行运行。

为什么要使用负载均衡

当我们的web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我们使用多台web服务器组成集群,前端使用nginx负载均衡,将请求分散的达到我们的后端服务器集群中,实现负载的分发,那么会大大的增强

实现方法

硬件:f5
软件:
七层:nginx、haproxy
四层:LVS(nginx、haproxy)
云厂商:
云厂商负载均衡的名词:
SLB
CLB
ULB
QLB

四层负载均衡

性能好,工作在传输层,

七层负载均衡

性能一般,可以改写包头的信息,实现http信息的改写、头信息的改写、安全应用规则控制等等。在应用层的服务中,我们能做的内容更多。(nginx)

四层和七层负载均衡的区别

四层:性能好,支持功能弱
七层:性能差,支持功能强
所以在实际应用场景中,我们会选择四层结合七层共同使用。

实现方法

  1. 配置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;
	}
}
  1. 配置负载均衡
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;
  1. 使用浏览器访问测试

负载均衡调度算法

  1. 轮询调度算法(默认)
  2. 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的结果分配的固定的节点。(用于需要登陆的网站,解决会话保持的问题,但是可能会导致后端某一个节点压力过大而其他节点没什么压力)

  1. least_conn表示将请求传递给活动连接最少的服务器。
    为了保证能够公平调度到后端某个节点,同时我们还需要保证会话的保持,这时候我们就需要使用redis来存储用户的会话信息。

负载均衡后端状态

  1. down 当前server暂时不参与负载均衡
  2. backup 预留的备份服务器
  3. max_fails 允许请求失败的次数
  4. fail_timeout 经过max_fails失败后,服务暂停时间
  5. 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

会话保持

用户登陆百度网站以后,然后关闭浏览器,当我们再一次登陆百度以后,会发现我们仍然是在登陆状态,这就是会话保持。
会话保持实现的原理:

  1. 当用户首次请求服务端网站时,服务端会通过程序生成sessior_id,然后使用set-cookie的方式将sessio_id下发给浏览器,浏览器会将sessionID存储至本地cookie中。
  2. 当用户再次请求服务端网址时,浏览器会在Headers头信息溴代该网站的cookie信息,那浏览器携带的cookie信息则是第一次请求网站时服务端给下发的session_ID
  3. 当用户登陆该网站后,服务端会将对应的sessionID存储到(mysql\redis\memcached\file)
  4. 当用户下次在请求网站时,服务端程序会验证浏览器提交的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.测试访问,查看效果。

你可能感兴趣的:(负载均衡)