一、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

keepalived结合haproxy keepalived和haproxy区别_Keepalievd+HAProxy

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技术]

    keepalived结合haproxy keepalived和haproxy区别_服务器_02

      与前两种组合不一样,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

    keepalived结合haproxy keepalived和haproxy区别_Keepalievd+HAProxy

     

    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服务器宕机的效果