负载均衡与高可用
原创目录
→→→→ 虾好吃
负载平衡和高可用性实验是单独进行的。
负载平衡实验目的:这个实验分为两部分;1.应用程序层负载均衡:客户端通过代理服务器访问web1和web2。2.网络层负载平衡:客户远程连接到代理服务器web1和mysql服务器。
拓扑图如下:
负载均衡
理论部分
- 代理和负载平衡:
代理负责转发直接向某个后端连接请求web节点。
负载平衡负责分发请求使用所有后端用户一定的调度算法web节点。
- 负载平衡(Load Balance),简写LB
面对高并发web请求时,使用不同的调度算法(rr,wrr,lc,wlc,ip_hash),分发转发到后端web群集节点,提高数据吞吐量和高的灾难恢复能力。
(ip_hash这是要求的用户ip然后映射到hash然后分配给一个特定的服务器。
- 常见的LB
软件:lvs nginx haproxy
硬件:F5
云LB:阿里云SLB 腾讯云CLB 青云QLB ucloud ULB
- 实现方式
四层负载:ip地址 tcp/udp 端口号
七层负载:HTTP https ftp SMTP
应用程序层负载均衡
拓扑图如下:
环境搭建
所有三个服务器需要安装nginx开始,以一个为例。
[root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# systemctl enable nginx
代理服务器配置
-
编辑配置文件
[root@lb1 ~]# cd /etc/nginx/conf.d/
[root@lb1 conf.d]# ls
default.conf
[root@lb1 conf.d]# rm -rf default.conf //删除默认的配置文件
[root@lb1 conf.d]# vim lb.conf //新的配置文件
upstream web {
server 192.168.1.5:80;
server 192.168.1.6:80;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://web; //代理web主机模块中
include nginx_params; //包含nginx_params代表创建的配置文件的优化项目,可直接由网站调用配置文件。
}
}
-
创建一个网站优化项目文件和直接调用配置文件(可选的,但是建议)。
[root@lb1 conf.d]# vim /etc/nginx/nginx_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
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;
[root@lb1 conf.d]# systemctl restart nginx
-
nginx_params参数介绍
proxy_set_header Host $http_host; # 重新定义或添加请求头的后端服务器
proxy_set_header X-Real-IP $remote_addr; # 使客户的真实地址(否则访问网站的日志显示代理)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录代理地址
proxy_connect_timeout 30; (单位:秒,默认60秒) # 代理和后端服务器连接超时
proxy_send_timeout 60; # 超时期限后端返回的代理服务器
proxy_read_timeout 60; # 代理的响应时间等待后端服务器
proxy_buffering on; # 启用高速缓存,缓存内容后端返回的第一,然后提供给客户端,转移了
proxy_buffer_size 32k; # 缓存的大小区域的代理缓存用户的头信息
proxy_buffers 4 128k; # 设置的缓存区域
proxy_busy_buffers_size 256k; # 从proxy_buffers留出一部分专门传输数据到客户端缓冲区
proxy_max_temp_file_size 256k; # 大的响应头被存储为文件。
- 负载平衡后端状态
weight 重量,默认为1
down 当前节点服务器不参与负载平衡
backup 备份服务器
max_fails 的请求数量允许失败
fail_timeout 经过max_fails服务失败后的暂停时间
max_conns 同一ip最大连接
例如:
下面配置 选做 才明白参数。
[root@lb1 ~]# vim /etc/nginx/conf.d/lb1.conf
修改为:
upstream web_cluster {
server 192.168.1.5:80 max_fails=2 fail_timeout=10s max_conns=1;
server 192.168.1.6:80 down; //通常用于关闭维护
}
web服务器配置
- web1配置
web1配置和web2配置基本上是相同的,配置web1以后可以使用scp命令复制到web2然而,在实验过程中,网页内容需要区分。nfs或gfs等)。
[root@web1 ~]# cd /etc/nginx/conf.d/
[root@web1 conf.d]# rm -rf default.conf
[root@web1 conf.d]# vim web.conf
server {
listen 80;
server_name www.web.com; //不需要使用一个虚拟主机,只是自由填写域名
location / {
root /www;
index index.html;
}
}
[root@web1 conf.d]# nginx -t
[root@web1 conf.d]# mkdir /www //创建网站根目录
[root@web1 conf.d]# echo "192.168.1.5" > /www/index.html //创建web页面内容
[root@web1 conf.d]# systemctl restart nginx
- web2配置
web1已经配置了,scp复制命令。
[root@web2 ~]# scp -rp root@192.168.1.5:/etc/nginx/* /etc/nginx/
[root@web2 ~]# cd /etc/nginx/conf.d/
[root@web2 conf.d]# ls //检查它是否存在nginx默认首页
default.conf web.conf
[root@web2 conf.d]# rm -rf default.conf //删除nginx默认首页
[root@web2 conf.d]# mkdir /www //创建网站根目录
[root@web2 conf.d]# echo "192.168.1.6" > /www/index.html //创建web页面内容
[root@web2 conf.d]# systemctl restart nginx
验证
客户端访问代理服务器http://192.168.1.4经过多次刷新,你可以看到下面的页面。tail -f /var/log/nginx/access.log辨别。
网络层负载均衡
拓扑图如下:
环境搭建
根据代理服务器web1安装nginx和一台mysql数据库,nginx安装代理服务器作为一个例子。 【 注意区分主机名
[root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# systemctl enable nginx
[root@mysql ~]# rpm -ivh /media/mysql5.6-rpm/* --nodeps --force
[root@mysql ~]# systemctl start mysqld
[root@mysql ~]# systemctl enable mysqld
[root@mysql ~]# mysqladmin -uroot password
New password: //输入一个新密码
Confirm new password: //再次输入一个新密码
代理服务器配置
[root@lb1 ~]# vim /etc/nginx/nginx.conf //插入以下字段http字段上方
stream {
upstream sshweb1 {
server 192.168.1.5:22;
}
upstream mysql {
server 192.168.1.7:3306;
}
server {
listen 5555; //监听5555端口
proxy_pass sshweb1; //例如,客户端访问5555端口将被指定web1主机
proxy_connect_timeout 30;
proxy_timeout 60;
}
server {
listen 7777; //监听7777端口
proxy_pass mysql; //例如,客户端访问7777端口将被指定mysql主机
proxy_connect_timeout 30;
proxy_timeout 60;
}
}
[root@lb1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb1 ~]# systemctl restart nginx
mysql服务器配置
mysql需要连接服务器,你可以首先创建一个图书馆,创建一个新的用户。
[root@mysql ~]# mysql -uroot -p123456
//省略一些内容
mysql> create database bbs;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on bbs.* to bbs@% identified by 123456;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
验证
测试机器访问代理服务器使用linux端,xshell端,win端测试
- 测试连接web1
linux最后测试如下:(linux端和xhell端)
xshell最后测试如下:
- 测试连接数据库
win有许多的端到端数据库测试工具,如SQLyog、navicat等一下,这一次使用SQLyog通过代理服务器连接mysql数据库。win客户端打开SQLyog软件,如下图所示,添加一个代理服务器IP,mysql点击用户名、密码和端口号连接。
在登录之后,您可以看到你myslq库中创建的服务器现在可以编辑和查看表中。
高可用
高可用性实验目的:这个实验分为两部分:①两组lb构建在服务器nginx和keeplived,实现负载均衡器的高可用。模拟网站服务器损坏,使用客户机访问网站依然正常访问。②解决高可用性大脑分裂问题。
拓扑图如下:
理论部分
-
高可用性:增加容错(HA:High availability)
-
协议: VRRP(虚拟路由冗余协议) 公有协议 224.0.0.18
HSRP(HSRP) 私人协议,Cisco公司 224.0.0.5 224.0.0.6
- 高可用性软件:
keepalived:使用vrrp实现对多个主机高可用性集群
高度可用的角色:master 主服务器 、backup 备服务器
- 高可用性大脑分裂
当高度可用的节点失去联系,认为自己是主服务器,会有多个主机的现象,称为大脑分裂。
大脑出现裂缝的原因:
心跳电缆松散或网卡是错误的。
服务器硬件故障,崩溃。
节点服务器启用了防火墙,但是没有这样做vrrp例外。
nginx服务死掉,不会有分裂现象,但是整个集群不能正常工作。
环境搭建
安装服务基于拓扑图, lb1和lb2都需要安装 nginx及keepalived,下面以lb1例如,两套web服务以web1为例。
lb搭建
[root@lb1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@lb1 ~]# yum -y install keepalived
[root@lb1 ~]# systemctl start nginx keepalived
[root@lb1 ~]# systemctl enable nginx keepalived
web搭建
[root@web1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force
[root@web1 ~]# systemctl start nginx
[root@web1 ~]# systemctl enable nginx
负载均衡高可用性
lb1主服务器配置
-
通过建设实现高可用性的两个负载平衡器,不详细介绍。 代理服务器配置 。
[root@lb1 ~]# cd /etc/nginx/conf.d/
[root@lb1 conf.d]# rm -rf default.conf
[root@lb1 conf.d]# vim lb.conf
upstream web {
server 192.168.1.6:80;
server 192.168.1.7:80;
}
server {
listen 80;
server_name www.lb.com;
location / {
proxy_pass http://web;
include nginx_params;
}
}
[root@lb1 conf.d]# vim /etc/nginx/nginx_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
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;
[root@lb1 conf.d]# systemctl restart nginx
-
修改keepalived配置文件
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
//省略一些内容
router_id lb1 //这个配置的主机名,
vrrp_strict //删除这条线,路由器vrrp一些协议,linux不,因此它需要被删除
//省略一些内容
}
vrrp_instance VI_1 {
state MASTER //编辑是主服务器
interface ens33 //修改网卡ens33
virtual_router_id 51
priority 100 //选举优先,100为最高
advert_int 1
authentication { //验证模块不需要修改,和活动和备用模块需要是相同的
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200 //添加偏移地址
}
}
[root@lb1 ~]# systemctl restart keepalived
lb2备份服务器配置
lb1服务器已经配置了网页通过scp复制命令。
[root@lb2 ~]# scp -rp root@192.168.1.4:/etc/nginx/* /etc/nginx
[root@lb2 ~]# cd /etc/nginx/conf.d/
[root@lb2 conf.d]# ls
default.conf lb.conf
[root@lb2 conf.d]# rm -rf default.conf //删除默认的网页
[root@lb2 conf.d]# systemctl restart nginx
web配置
web1和web2配置是一样的web1例如,引用相关的配置 web服务器配置 。
[root@web1 ~]# cd /etc/nginx/conf.d/
[root@web1 conf.d]# rm -rf default.conf
[root@web1 conf.d]# vim web.conf
server {
listen 80;
server_name www.web.com; //不需要使用一个虚拟主机,只是自由填写域名
location / {
root /www;
index index.html;
}
}
[root@web1 conf.d]# nginx -t
[root@web1 conf.d]# mkdir /www //创建网站根目录
[root@web1 conf.d]# echo "192.168.1.6" > /www/index.html //创建web页面内容,web2设置web页面内容192.168.1.7
[root@web1 conf.d]# systemctl restart nginx
验证
客户端访问http://192.168.1.200刷新两次看web1和web2网站内容。
测试关掉lb1主机访问漂移地址,查看lb2主机获得偏移地址。
从上面的图中,可以看出漂移地址已经到来lb2在主机,访问http://192.168.1.200它是否可以正常访问。
开启lb1主机,检查如果偏移地址返回到本地机器上。
上述测试后,负载均衡的高可用性特性已成功配置,下面,我们将解决它nginx请参阅故障的细节问题 理论部分 。
nginx故障问题
关闭lb1服务器的nginx服务和访问地址漂移,发现偏移地址仍然存在lb1因此,服务不能访问的网站。lb1服务器nginx一个无法访问的问题造成的故障。
[root@lb1 ~]# systemctl stop nginx
[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# vim /sh/check_nginx_proxy.sh
#!/bin/bash
killall -0 nginx
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
[root@lb1 ~]# chmod +x /sh/check_nginx_proxy.sh
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
//省略一些内容
router_id lb1
//省略一些内容
}
vrrp_script check_nginx_proxy { //添加模块内容
script "/sh/check_nginx_proxy.sh"
interval 2
weight 5
}
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200
}
track_script { //启用脚本模块在一个实例
check_nginx_proxy
}
}
[root@lb1 ~]# systemctl restart keepalived
模拟损坏nginx测试结果。
[root@lb1 ~]# systemctl stop nginx
分别再lb1和lb2看着上面的偏移地址,你可以看到lb1上nginx损伤后,漂移地址已经到来lb2上。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除