LVS NAT + Keepalived HOWTO

 

这篇文章主要讲解了,基于LVS/NAT,安装,运行与检测keepalived

目录

    1、什么是keepalived?

    2、规划你的网络    

    3、配置内核参数

    4、编译ipvsadm (可选)

    5、编译keepalived(可选)

    6、一个简单的keepalived实例。一个负载均衡器,一个ssh 服务器

    7、故障转移

    8、一个稍微复杂的keepalived实例,负载均衡器,两个ssh server,两个httpd server

    9、开机启动脚本(空)

    10、注意事项

    11、总结

1、什么是keepalived

    keepalived的作者说:

    keepalived的主要目第是为了给linux virtual server项目提供健壮的keepalive功能。这个项目使用C编写,可以在TCP/IP第三,四,五层实现检测功能。这个检测框架给予了keepalived进程检查LVS 服务池状态的能力。keepalived实现了vrrpv2 处理director的故障转移。简单来说,keepalived是一个用户空间进程,主要目的就是为了LVS的健康状况检查和LVdirector的故障转移

    keepalived是一个项目,包括通过LVS实现负载均衡,通过VRRP实现故障转移,监视real server的健康状况。重要的是,它是一个包实现了 lvs+mon+fake+heartbeat的所有功能 。使用keepalived,管理员可以快速的构建一个冗余的负载均衡解决方案而不需要解决大量安装包和脚本的问题。 

    本实例使用的软件:

        CentOS 6.6
        keepalived-1.2.13-5.el6_6.x86_64      
        ipvsadm-1.26-4.el6.x86_64
        openssh-5.3p1-104.el6.x86_64        
        httpd-2.2.15-39.el6.centos.x86_64

2、规划你的网络

画出你的网络的逻辑结构,规划好你的网络有助于减少以后遇到的困难。列出你打算使用的IP,任何额外的路由IP,负载均衡机器打算使用的IP,或者其它相关的信息。

3、配置内核参数:

echo "1" > /proc/sys/net/ipv4/ip_forwarding


4. 编译ipvsadm(可选的)

5. 编译keepalived

[root@node4 src]# tar -xf keepalived-1.2.19.tar.gz; cd keepalived-1.2.19; ./configure; make; make install

 keepalived编译起来很简单,中间报错,安装相应的软件包就可以了,从www.keepalived.org,获取最新版本的包,获取更多信息,请阅读下载keepalived附带的INSTALL文件

6、配置keepalived:一个简单的网络,1负载均衡/虚拟路由 ,一个real server22号端口

  Client (on the internet somewhere) --> load balancer --> realserver 

负载均衡器的IP:
Eth0: 192.168.198.160
VIP :192.168.198.161
Eth1:10.0.0.4
VIP eth1:10.0.0.1
Real server:
IP:10.0.0.2 确保网关指向10.0.0.1

主要配置文件在/etc/keepalived/keepalived.conf ,如果keepalived什么错误都没报告,意味着你很难发现配置的错误,启动keepalived使用-d选项,将会加载配置到syslog里面去。

配置

! 以!开头的都是注释
 
global_defs { 
  
     ! 这是警告邮件将会发送谁那里去 
   notification_email {                    
        [email protected] 
    [email protected] 
    ! 这里可以添加一些其它的,你想添加的邮件。
   } 
   notification_email_from [email protected] 
 
   !使用恩地机器发送邮件
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30 
 
   ! 每一个负载均衡器应该有不同的ID,这将会在SMTP警告中使用,因此你应该让每一个路由很容易的辨别。
   lvs_id LVS_EXAMPLE_01 
} 
 
 
vrrp_sync_group VG1 { 
   group { 
      VI_1 
      VI_GATEWAY 
   } 
} 
 
 
!每一个接口需要至少一个vrrp_instance ,每一个vrrp_instance 是一个逻辑上划分的VIPs组,你也可以有多个vrrp_instance ,如果你喜欢的话。
 
vrrp_instance VI_1 { 
        state MASTER 
        interface eth0 
        lvs_sync_daemon_inteface eth0 
        virtual_router_id 51 
 
        !主节点和备节点是根据优先级选出来的,如果你的state为master但是,优先级低,还是会变为备份节点的。
        priority 150 
    ! 投票的时间间隔
        advert_int 1 
     ! 从主节点切换为备节点是时发送警告。
        smtp_alert 
        authentication { 
                auth_type PASS 
                auth_pass example 
        } 
     ! 配置在keppalived机器上面的IP地址,后面我们会指定那些real server会绑定在这个IP地址上面
        virtual_ipaddress { 
                192.168.1.11 
        ! and more if you want them   
        ! 你也可以指定更多的地址。
        } 
} 
 
 ! 现在配置一个实例real server 默认使用网关方式。
 
vrrp_instance VI_GATEWAY { 
        state MASTER 
        interface eth1 
        lvs_sync_daemon_inteface eth1 
        virtual_router_id 52 
        priority 150 
        advert_int 1 
        smtp_alert 
        authentication { 
                auth_type PASS 
                auth_pass example 
        } 
        virtual_ipaddress { 
                10.20.40.1 
        } 
} 
 
 ! 现在配置更多的信息,我们仅仅配置一个virtual server监听在22号端口。
   
virtual_server 192.168.1.11 22 { 
    delay_loop 6 
    lb_algo rr 
    lb_kind NAT 
    nat_mask 255.255.255.0 
    protocol TCP 
 
    real_server 10.20.40.10 22 { 
        weight 1 
 
        TCP_CHECK { 
                connect_timeout 3 
                connect_port 22 
        } 
    } 
}

然后:

①、Tail -f /var/log/messages  看看输出的日志信息

    ②、Ipvsadm -L -n 查看ipvs的信息

    


  ③、最后看看地址信息

 

最后看看效果。


 启动keepalived 使用-d选项 是一个很好的方式检测你的配置文件是否有效。

 

7、故障转移  

  你需要做的只是在另外一台节点配置keepalived复制keepalived的配置文件,改变优先级,状态到bakcup,运行keepalived。你会看到备份服务的日志信息,服务器接受了它的备份状态,如果你去掉了主服务,备份服务器将会接管Master状态

  主服务和备份服务器,只是  lvs_id 指令, priority ,state 指令不一样其余的都一样 ,

  另外你应该移除主服务器看看备份服务器的日志信息,如果主服务器没挂,备份服务器将会看不到VIP的信息。

8、配置keepalived,一个更加复杂的网络, 2VIPs(1 http/https ,1 ssh) 和同时每个VIP都有两个real server

Load balancer IPs:     
    负载均衡器外部接口(eth0): 192.168.198.160
    外部http/https realservers VIP: 192.168.1.162
    外部 ssh realservers VIP: 192.168.1.161
    负载均衡器内部接口(eth1): 10.0.0.4
    配置在eth1上的real server默认网关: 10.0.0.1
  Realserver 1 (http, [https]): 
    IP: 10.0.0.2
  Realserver 2 (http, [https]): 
    IP: 10.0.0.3
  Realserver 3 (ssh): 
    IP: 10.0.0.2
  Realserver 4 (ssh): 
    IP: 10.0.0.3

确保real server的网关指向10.0.0.1

很少的情况会使用这种配置,有其你想去学习使用genhash 命令,生成HTTP get或者SSL_GETMD5码。同样你想配置https的持久连接--使你的客户一直连接到real server,就像你去购物的事物,这种状态要一直保持着,不然后果很严重。


最后的字符串你需要追踪的,后面的服务检查会使用到。

配置文件:
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
 
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 
    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
 
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
 
    sorry_server 192.168.200.200 1358
 
    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
 
    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
 
virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 
    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
 
    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

最后检查

①、Tail -f /var/log/messages

    ②、查看ipvs

    ③、查看ip

    ④、看看效果

Ssh测试,ssh应该使用源地址绑定好一些。

  。。。

要想实现故障转移,只需要在另外一个节点,复制keepalived.conf 修改lvs_id prioritystate

9.  开机启动脚本实例

这个先留着,

10、故障排除

    运行keepalived使用-d选项,查看/var/log/messages

    查看ipvsadm的输出

    查看ip addr list 的输出

   注意事项

1) 打开IP forwarding (echo "1" > /proc/sys/net/ipv4/ip_forward)

2) 使用新版本的lvs

3) Readl server必须把负载均衡器当做网关

4) Real server是内网和外网不重要,重要的是他们必须在同一个LANs或者VLAN里面。

5) 你必须有一个vrrp_instance 部分定义在 keepalived 来配置VIP.

6) VRRP里面,优先级越小发言权越小。

7) VRRP 实例不能使用相同的route_id keepalived不会报错,但是你将看不到VRRP实例的IP地址。

8) 尽管keepalived不会抱怨你忽略了一些选项,但是不推荐遗留选项,你使用了TCP_CHECK80端口,不要忽略了connect_port 80这条指令。 

 

这些都非常明显,但是他们确实是可能出现在配置问题里面的。

11、总结

    1、还是说,这个博客平台的后台编辑,差劲。。。浪费时间,每次编辑出来都很丑,当然我自己布局也有部分原因

    2、这篇文章是我在keepalived的官网上翻译的,把配置文件修改为自己电脑的配置文件了。

    3、因为刚学,这时候keepalived不够精通,文章质量不够高,另外这样翻译有些事倍功办的效果,说了那么多,很多都是废话。

    4、还是要说我的博客写的不行,可能太赶时间了吧,速度快,文章就不够精品,速度慢,可是时间却没那么多。我下面看情况,把keepalived的配置文件详解,贴出来。

原文链接:

http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html