一、Keepalievd+Nginx/LVS/HAProxy三者的区别
至于具体使用哪种组合,我们必须知道每个代理服务器自身的优势,在真实的需求下选择一款代理软件
[三种代理服务器的对比]
二、Keepalievd+Nginx
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可以实现web前端服务的高可用。
Keepalived实现的基础是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的.
VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。
VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。
Nginx作为代理服务器,使用反向代理技术,以轮询的方式调用web集群,实现负载均衡
下面我们模拟一个实验看看Keepalievd+Nginx组合是如何工作的
1.拓扑图
拓扑图与ip地址的图表如下
服务器名 | ip地址 | ip类型 |
Nginx代理服务器主 | 192.168.4.80 | VIP |
Nginx代理服务器主 | 192.168.2.10 | DIP |
Nginx代理服务器备 | 192.168.4.80 | VIP |
Nginx代理服务器备 | 192.168.2.20 | DIP |
Web服务1 | 192.168.2.41 | RIP |
Web服务2 | 192.168.2.42 | RIP |
Web服务3 | 192.168.2.43 | RIP |
2.代理服务器安装Nginx
[Nginx的安装]
本例的配置文件如下,修改两个地方,一是在http{} 中的任意一个地方添加一个服务器地址池,二是在http{}中localtion{}下添加一个地址映射规则.这里有两台代理服务器,配置文件是一样的,默认的算法是轮询算法
[Nginx五种算法]
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream webstreams{
server 192.168.4.41:80;
server 192.168.4.42:80;
server 192.168.4.43:80;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_path http://webstreams;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.代理服务器安装Keepalievd
需要修改的地方:
1)将路由id改为本机名
2)主服务器为master 优先级100 备服务器backup 优先级50
3)vrrp:192.168.4.80
proxy1:
1. [root@proxy1 ~]# yum install -y keepalived //安装
2. [root@proxy1 ~]# vim /etc/keepalived/keepalived.conf //修改配置
3. global_defs {
4. notification_email {
5. admin@tarena.com.cn //设置报警收件人邮箱
6. }
7. notification_email_from ka@localhost //设置发件人
8. smtp_server 127.0.0.1 //定义邮件服务器
9. smtp_connect_timeout 30
10. router_id proxy1 //设置路由ID号(实验需要修改)
11. }
12. vrrp_instance VI_1 {
13. state MASTER //主服务器为MASTER(备服务器需要修改为BACKUP)
14. interface eth0 //定义网络接口
15. virtual_router_id 51 //主备服务器VRID号必须一致
16. priority 100 //服务器优先级,优先级高优先获取VIP
17. advert_int 1
18. authentication {
19. auth_type pass
20. auth_pass 1111 //主备服务器密码必须一致
21. }
22. virtual_ipaddress { //谁是主服务器谁获得该VIP(实验需要修改)
23. 192.168.4.80
24. }
25. }
26. [root@proxy1 ~]# systemctl start keepalived
proxy2:
1. [root@proxy1 ~]# yum install -y keepalived //安装
2. [root@proxy1 ~]# vim /etc/keepalived/keepalived.conf //修改配置
3. global_defs {
4. notification_email {
5. admin@tarena.com.cn //设置报警收件人邮箱
6. }
7. notification_email_from ka@localhost //设置发件人
8. smtp_server 127.0.0.1 //定义邮件服务器
9. smtp_connect_timeout 30
10. router_id proxy2 //设置路由ID号(实验需要修改)
11. }
12. vrrp_instance VI_1 {
13. state BACKUP //主服务器为MASTER(备服务器需要修改为BACKUP)
14. interface eth0 //定义网络接口
15. virtual_router_id 51 //主备服务器VRID号必须一致
16. priority 50 //服务器优先级,优先级高优先获取VIP
17. advert_int 1
18. authentication {
19. auth_type pass
20. auth_pass 1111 //主备服务器密码必须一致
21. }
22. virtual_ipaddress { //谁是主服务器谁获得该VIP(实验需要修改)
23. 192.168.4.80
24. }
25. }
26. [root@proxy2 ~]# systemctl start keepalived
4.web服务器
每台web服务器创建一个用于测试的页面
1. [root@web1/ ~]# yum -y install httpd
2. [root@web1 ~]# echo "This is web1" > /var/www/html/index.html
3. [root@web1 ~]# systemctl restart httpd
4. [root@web2/ ~]# yum -y install httpd
5. [root@web2 ~]# echo "This is web2" > /var/www/html/index.html
6. [root@web2 ~]# systemctl restart httpd
7. [root@web3/ ~]# yum -y install httpd
8. [root@web3 ~]# echo "This is web3" > /var/www/html/index.html
9. [root@web3 ~]# systemctl restart httpd
5.测试的方式
使用客户端主机检测
1)开启两台代理服务器,输入命令curl 192.168.4.80.观察到显示的结果轮询变化
2)开启代理服务器1关闭代理服务器2,输入命令curl 192.168.4.80.观察到显示的结果轮询变化
3)关闭两台代理服务器,输入命令curl 192.168.4.80,观察到结果无响应
4)关闭一台web服务器,关闭web3,观察结果将不轮询web3的内容
实验证明:
1)证明了keepalievd的热备效果,即只要非双台代理服务器宕机,都是允许访问网站的
2)证明了Nginx的反向代理的功能,轮询输出结果,而且带有检查web服务器宕机的效果
三、Keepalievd+HAProxy
[HAProxy的使用]
如果阅读了上文Keepalievd+Nginx的组合,做Keepalievd+HAProxy其实非常容易,我们只需要安装HAProxy并稍微修改一下配置文件即可.我们保证实验环境一致,除HAProxy的配置外其余的环境与上一个例子一致.
给两台代理服务器安装HAProxy,内容相同
[root@proxy1 ~]# killall nginx //关闭nginx
[root@proxy1 ~]# yum -y install haproxy //安装haproxy
[root@proxy2 ~]# vim /etc/haproxy/haproxy.cfg //修改haproxy配置文件
global
log 127.0.0.1 local2 192.168.2.100
chroot /usr/local/haproxy ##haproxy启动路径
pidfile /var/run/haproxy.pid ##haproxy的pid存放路径,pid是进程号
maxconn 4000 ##最大连接数,默认4000
user haproxy
group haproxy
daemon #创建1个进程进入deamon模式运行
defaults
mode http ##默认的模式mode { tcp|http|health }
option dontlognull ##不记录健康检查的日志信息
option httpclose ##每次请求完毕后主动关闭http通道
option httplog ##日志类别http日志格式
option forwardfor ##后端服务器可以从Http Header中获得客户端ip
option redispatch ##serverid服务器挂掉后强制定向到其他健康服务器
timeout connect 10000 #如果backend没有指定,默认为10s
timeout client 300000 ##客户端连接超时
timeout server 300000 ##服务器连接超时
maxconn 3000 ##最大连接数
retries 3 ##3次连接失败就认为服务不可用,也可以通过后面设置
listen stats 0.0.0.0:1080 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm Haproxy Manager #进入管理解面查看状态信息
stats auth admin:admin #统计页面用户名和密码设置
listen websrv-rewrite 0.0.0.0:80 //监听全网段80端口 0.0.0.0也可以写*
balance roundrobin #轮叫算法
server web1 192.168.4.41:80 check inter 2000 rise 2 fall 5
server web2 192.168.4.42:80 check inter 2000 rise 2 fall 5server web3 192.168.4.43:80 check inter 2000 rise 2 fall 5
四、Keepalievd+LVS
我们要弄清楚Keepalievd与LVS的关系,如图,Keepalievd本身就是一个使用LVS的一个软件,所以它可以使用LVS的功能,也就是说在这里我们用Keepalievd既实现了热备功能也实现了代理功能,具体看下面的例子
[LVS技术]
与前两种组合不一样,LVS的配置稍微复杂一些,它需要在web服务器上配置虚拟ip地址,并且这个虚拟ip地址是同一个地址
1.拓扑图
服务器名 | ip地址 | ip类型 |
Nginx代理服务器主 | 192.168.4.80 | VIP |
Nginx代理服务器主 | 192.168.2.10 | DIP |
Nginx代理服务器备 | 192.168.4.80 | VIP |
Nginx代理服务器备 | 192.168.2.20 | DIP |
Web服务1 | 192.168.2.41 | RIP |
Web服务2 | 192.168.2.42 | RIP |
Web服务3 | 192.168.2.43 | RIP |
Web服务1 | 192.168.2.41 | VIP |
Web服务2 | 192.168.2.42 | VIP |
Web服务3 | 192.168.2.43 | VIP |
2.web服务器配置
为三个服务器做相同配置d
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
1. [root@web1 ~]# cd /etc/sysconfig/network-scripts/
2. [root@web1 ~]# cp ifcfg-lo ifcfg-lo:0 //在linux中:0代表虚拟网卡
3. [root@web1 ~]# vim ifcfg-lo:0
4. DEVICE=lo:0
5. IPADDR=192.168.4.15
6. NETMASK=255.255.255.255
7. NETWORK=192.168.4.15
8. BROADCAST=192.168.4.15
9. ONBOOT=yes
10. NAME=lo:0
这里因为web1也配置与调度器一样的VIP地址,默认肯定会出现地址冲突。
写入这四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应。
[为什么要给web服务器配置虚拟ip]
1. [root@web1 ~]# vim /etc/sysctl.conf
2. #手动写入如下4行内容
3. net.ipv4.conf.all.arp_ignore = 1
4. net.ipv4.conf.lo.arp_ignore = 1
5. net.ipv4.conf.lo.arp_announce = 2
6. net.ipv4.conf.all.arp_announce = 2
7. #当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
8. #本机不要向外宣告自己的lo回环地址是192.168.4.15
重启网络服务,设置防火墙与SELinux
1. [root@web1 ~]# systemctl stop NetworkManager
2. [root@web1 ~]# systemctl disable NetworkManager
3. [root@web1 ~]# systemctl restart network
4. [root@web1 ~]# ifconfig
5. [root@web1 ~]# systemctl stop firewalld
6. [root@web1 ~]# setenforce 0
配置请求页面是
1. [root@web1/ ~]# yum -y install httpd
2. [root@web1 ~]# echo "This is web1" > /var/www/html/index.html
3.代理服务器配置
安装keepalived
1. [root@proxy1 ~]# yum install -y keepalived
2. [root@proxy1 ~]# systemctl enable keepalived
修改配置文件,proxy1 proxy2修改router_id proxy2 和state为BACKUP,priority 50 即可
1. [root@proxy1 ~]# vim /etc/keepalived/keepalived.conf
2. global_defs {
3. notification_email {
4. admin@tarena.com.cn //设置报警收件人邮箱
5. }
6. notification_email_from ka@localhost //设置发件人
7. smtp_server 127.0.0.1 //定义邮件服务器
8. smtp_connect_timeout 30
9. router_id proxy1 //设置路由ID号(实验需要修改)
10. }
11. vrrp_instance VI_1 {
12. state MASTER //主服务器为MASTER
13. interface eth0 //定义网络接口
14. virtual_router_id 51 //主辅VRID号必须一致
15. priority 100 //服务器优先级
16. advert_int 1
17. authentication {
18. auth_type pass
19. auth_pass 1111 //主辅服务器密码必须一致
20. }
21. virtual_ipaddress { //配置VIP(实验需要修改)
22. 192.168.4.80
23. }
24. }
25. virtual_server 192.168.4.80 80 { //设置ipvsadm的VIP规则(实验需要修改)
26. delay_loop 6
27. lb_algo rr //设置LVS调度算法为RR
28. lb_kind DR //设置LVS的模式为DR(实验需要修改)
29. #persistence_timeout 50 //(实验需要注释)
30. #注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器
31. protocol TCP
32. real_server 192.168.4.41 80 { //设置后端web服务器真实IP(实验需要修改)
33. weight 1 //设置权重为1
34. TCP_CHECK { //对后台real_server做健康检查(实验需要修改)
35. connect_timeout 3
36. nb_get_retry 3
37. delay_before_retry 3
38. }
39. }
40. real_server 192.168.4.42 80 { //设置后端web服务器真实IP(实验需要修改)
41. weight 1 //设置权重为1
42. TCP_CHECK { //对后台real_server做健康检查(实验需要修改)
43. connect_timeout 3
44. nb_get_retry 3
45. delay_before_retry 3
46. }
47. real_server 192.168.4.43 80 { //设置后端web服务器真实IP(实验需要修改)
48. weight 1 //设置权重为1
49. TCP_CHECK { //对后台real_server做健康检查(实验需要修改)
50. connect_timeout 3
51. nb_get_retry 3
52. delay_before_retry 3
53. }
54. }
55. }
56. [root@proxy1 ~]# systemctl start keepalived
57. [root@proxy1 ~]# ip a s #查看VIP配置
58. [root@proxy1 ~]# iptables -F //清空防火墙规则
4.测试的方式
使用客户端主机检测
1)开启两台代理服务器,输入命令curl 192.168.4.80.观察到显示的结果轮询变化
2)开启代理服务器1关闭代理服务器2,输入命令curl 192.168.4.80.观察到显示的结果轮询变化
3)关闭两台代理服务器,输入命令curl 192.168.4.80,观察到结果无响应
4)关闭一台web服务器,关闭web3,观察结果将不轮询web3的内容
实验证明:
1)证明了keepalievd的热备效果,即只要非双台代理服务器宕机,都是允许访问网站的
2)证明了LVS的反向代理的功能,轮询输出结果,而且带有检查web服务器宕机的效果