Quantcast
Channel: flyinweb's blog - 系统架构
Viewing all articles
Browse latest Browse all 10

LVS集群部署详细过程(LVS+OSPF)

$
0
0

一、前言

        2013年下半年大部时候都用在LVS实施上面了,一路摸爬滚打走来,遇到各种问题,感谢同事们对我的帮助和指导,感谢领导对我的信任,本文总结一下lvs集群(ospf+fullnat)的详细部署情况以及需要注意的问题点,先大概说一下LVS在我们公司的应用情况吧,LVS在我们公司走过了以下三个阶段:
阶段一,一个业务一套LVS调度(主备模式),优缺点如下:
优点:业务和业务之间隔离,A业务有问题不会影响B业务
缺点:1、管理不方便,2、LB多了虚拟路由ID冲突导致业务异常,3、业务量足够大LB成为瓶颈

阶段二,一个IDC一套LVS调度(主备模式),优缺点如下:
优点、业务统一集中管理
缺点:1、A业务突发上流(超过LB的承受能力)会影响整个集群上的业务,2、LB很容易成为瓶颈

阶段三,一个IDC一套调度(ospf+fullnat集群模式),优缺点如下:
优点:1、LB调度机自由伸缩,横向线性扩展(最多机器数受限于三层设备允许的等价路由数目 ),2、业务统一集中管理,3、LB资源全利用,All Active。不存在备份机
缺点:部署相对比较复杂

二、环境说明

1、架构图

2、fullnat是淘宝开源的一种lvs转发模式,主要思想:引入local address(内网ip地址),cip-vip转换为lip->rip,而 lip和rip均为IDC内网ip,可以跨vlan通讯,这刚好符合我们的需求,因为我们的内网是划分了vlan的。

3、环境说明

  1. 软件环境:  
  2. 系统版本:centos6.4  
  3. keepalived版本:v1.2.2  
  4. ospfd版本:version 0.99.20  
  5. zebra版本: version 0.99.20  
  6. 交换机:  
  7. 外网核心交换IP:114.11x.9x.1  
  8. 内网核心交换IP:10.10.2.1  
  9. LB1外网机柜交换IP:114.11x.9x.122  
  10. LB2外网机柜交换IP:114.11x.9x.160  
  11. LB1内网机柜交换IP:10.10.15.254  
  12. LB2内网机柜交换IP:10.10.11.254  
  13. LB1:  
  14. 调度机IP(外网bond1):10.10.254.18/30   ##外网需要配置一个与核心交换机联通的私有地址  
  15. 调度机IP(内网bond0):10.10.15.77  
  16. 内网分发私有网段:10.10.251.0/24         ##local address  
  17. 外网ospf转发网段网关:10.10.254.17  
  18. LB2:  
  19. 调度机IP(外网bond1):10.10.254.22/30   #外网需要配置一个与核心交换机联通的私有地址  
  20. 调度机IP(内网bond0):10.10.11.77  
  21. 内网分发私有网段:10.10.250.0/24         ##local address  
  22. 外网ospf转发网段网关:10.10.254.21  

为了提升网络吞吐量,网络冗余,我们LB上网卡是做bond的,详细说明如下图:

三、具体部署

 部署分三大部分,网卡绑定、ospf配置和lvs配置,下面依次介绍:

A、网卡绑定部分

1、服务器(LB1)上配置如下:

  1. [root@lvs_cluster_C1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0  
  2. DEVICE=bond0  
  3. ONBOOT=yes  
  4. BOOTPROTO=static  
  5. IPADDR=10.10.11.77    ##LB2为10.10.15.77  
  6. NETMASK=255.255.255.0  
  7. USERCTL=no  
  8. TYPE=Ethernet  
  9. [root@lvs_cluster_C1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond1  
  10. DEVICE=bond1  
  11. ONBOOT=yes  
  12. BOOTPROTO=static  
  13. IPADDR=10.10.254.22  ##LB2为10.10.254.18  
  14. NETMASK=255.255.255.252  
  15. USERCTL=no  
  16. TYPE=Ethernet  
  17. [root@lvs_cluster_C1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0  
  18. DEVICE=eth0  
  19. BOOTPROTO=none  
  20. ONBOOT=yes  
  21. USERCTL=no  
  22. MASTER=bond0  
  23. SLAVE=yes  
  24. [root@lvs_cluster_C1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1  
  25. DEVICE=eth1  
  26. BOOTPROTO=none  
  27. ONBOOT=yes  
  28. USERCTL=no  
  29. MASTER=bond0  
  30. SLAVE=yes  
  31. [root@lvs_cluster_C1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth2  
  32. DEVICE=eth2  
  33. BOOTPROTO=none  
  34. ONBOOT=yes  
  35. USERCTL=no  
  36. MASTER=bond1  
  37. SLAVE=yes  
  38. [root@lvs_cluster_C1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth3  
  39. DEVICE=eth3  
  40. BOOTPROTO=none  
  41. ONBOOT=yes  
  42. USERCTL=no  
  43. MASTER=bond1  
  44. SLAVE=yes  
  45. [root@lvs_cluster_C1 ~]# vi /etc/modprobe.d/openfwwf.conf  
  46. options b43 nohwcrypt=1qos=0  
  47. alias bond0 bonding  
  48. options bond0 miimon=100mode=0  #bond的几种模式的详细说明我之前写的博文中有介绍或者去百度、谷歌吧  
  49. alias bond1 bonding  
  50. options bond1 miimon=100mode=0  
  51. alias net-pf-10off 

2、交换机上配置

  1. bond0:10.10.15.77  eth0-GigabitEthernet1/0/29eth1-GigabitEthernet1/0/30  
  2. LB1对应的内网机柜交换机操作:  
  3. interfaceBridge-Aggregation10  
  4. port access vlan 150  
  5. interfaceGigabitEthernet1/0/29  
  6. port link-aggregation group 10  
  7. interfaceGigabitEthernet1/0/30  
  8. port link-aggregation group 10  
  9. bond1:10.10.254.18GigabitEthernet1/0/26GigabitEthernet1/0/28  
  10. LB1对应的外网机柜交换机操作:  
  11. vlan 50  
  12. interfaceBridge-Aggregation10  
  13. port access vlan 50  
  14. interfaceGigabitEthernet1/0/26  
  15. port link-aggregation group 10  
  16. interfaceGigabitEthernet1/0/28  
  17. port link-aggregation group 10  
  18. bond0:10.10.11.77eth0:GigabitEthernet1/0/14  eth1:GigabitEthernet1/0/05  
  19. LB2对应的内网机柜交换机操作:  
  20. interfaceBridge-Aggregation110  
  21. port access vlan 110  
  22. interfaceGigabitEthernet1/0/05  
  23. port link-aggregation group 110  
  24. interfaceGigabitEthernet1/0/14  
  25. port link-aggregation group 110  
  26. bond1:10.10.254.22eth2:GigabitEthernet1/0/38  eth3:GigabitEthernet1/0/46  
  27. LB2对应的外网机柜交换机操作:  
  28. vlan 60  
  29. interfaceBridge-Aggregation110  
  30. port access vlan 60  
  31. interfaceGigabitEthernet1/0/38  
  32. port link-aggregation group 110  
  33. interfaceGigabitEthernet1/0/46  
  34. port link-aggregation group 110  
  35. display  link-aggregation verbose #查看绑定状态是否ok 

 B、ospf配置部分

1、交换机上配置:


外网核心操作:
  1. vlan 50  
  2. vlan 60  
  3. interfaceVlan-interface50  
  4. ip address 10.10.254.17255.255.255.252  
  5. ospf timer hello 1  
  6. ospf timer dead 4  
  7. ospf dr-priority 96  
  8. interfaceVlan-interface60  
  9. ip address 10.10.254.21255.255.255.252  
  10. ospf timer hello 1  
  11. ospf timer dead 4  
  12. ospf dr-priority 95  
  13. #配置ospf的参数, timer hello是发送hello包的间隔,timer dead是存活的死亡时间。默认是10、40,hello包是ospf里面维持邻居关系的报文,这里配置是每秒发送一个,当到4秒还没有收到这个报文,就会认为这个邻居已经丢失,需要修改路由  
  14. ospf 1  
  15. area 0.0.0.0  
  16. network 10.10.254.160.0.0.3  
  17. network 10.10.254.200.0.0.3 
内网核心:
  1. interfaceVlan-interface110  
  2. ip address 10.10.250.1255.255.255.0sub  
  3. interfaceVlan-interface150  
  4. ip address 10.10.251.1255.255.255.0sub 

 2、服务器上配置

  1. mkdir/etc/quagga/  
  2. mkdir-p /var/log/quagga/  
  3. chmod-R 777  /var/log/quagga/  

配置文件:

  1. cat /etc/quagga/zebra.conf  
  2. hostname lvs_cluster_C2    ##LB2为:hostname lvs_cluster_C1  
  3. cat /etc/quagga/ospfd.conf  
  4. log file /var/log/quagga/ospfd.log  
  5. log stdout  
  6. log syslog  
  7. interfacebond1  
  8. ip ospf hello-interval 1  
  9. ip ospf dead-interval 4  
  10. router ospf  
  11. ospf router-id 10.10.254.17  ##LB2为:10.10.254.21  
  12. log-adjacency-changes  
  13. auto-cost reference-bandwidth 1000  
  14. network 114.11x.9x.0/24area 0.0.0.0  
  15. network 10.10.254.16/30area 0.0.0.0   ##LB2为:10.10.254.20/30 

ospfd的启动脚本:

  1. [root@lvs_cluster_C1 ~]# cat  /etc/init.d/ospfd  
  2. #!/bin/bash  
  3. # chkconfig: - 16 84  
  4. # config: /etc/quagga/ospfd.conf  
  5. ### BEGIN INIT INFO  
  6. # Provides: ospfd  
  7. # Short-Description: A OSPF v2 routing engine  
  8. # Description: An OSPF v2 routing engine for use with Zebra  
  9. ### END INIT INFO  
  10. # source function library  
  11. . /etc/rc.d/init.d/functions  
  12. # Get network config  
  13. . /etc/sysconfig/network  
  14. # quagga command line options  
  15. . /etc/sysconfig/quagga  
  16. RETVAL=0  
  17. PROG="ospfd"  
  18. cmd=ospfd  
  19. LOCK_FILE=/var/lock/subsys/ospfd  
  20. CONF_FILE=/etc/quagga/ospfd.conf  
  21. case"$1"in  
  22. start)  
  23. # Check that networking is up.  
  24. [ "${NETWORKING}"= "no"] && exit1  
  25. # The process must be configured first.  
  26. [ -f $CONF_FILE ] || exit6  
  27. if[ `id-u` -ne0 ]; then  
  28. echo$"Insufficient privilege"1>&2  
  29. exit4  
  30. fi  
  31. echo-n $"Starting $PROG: "  
  32. daemon $cmd -d $OSPFD_OPTS  
  33. RETVAL=$?  
  34. [ $RETVAL -eq0 ] && touch$LOCK_FILE  
  35. echo  
  36. ;;  
  37. stop)  
  38. echo-n $"Shutting down $PROG: "  
  39. killproc $cmd  
  40. RETVAL=$?  
  41. [ $RETVAL -eq0 ] && rm-f $LOCK_FILE  
  42. echo  
  43. ;;  
  44. restart|reload|force-reload)  
  45. $0 stop  
  46. $0 start  
  47. RETVAL=$?  
  48. ;;  
  49. condrestart|try-restart)  
  50. if[ -f $LOCK_FILE ]; then  
  51. $0 stop  
  52. $0 start  
  53. fi  
  54. RETVAL=$?  
  55. ;;  
  56. status)  
  57. status $cmd  
  58. RETVAL=$?  
  59. ;;  
  60. *)  
  61. echo$"Usage: $PROG {start|stop|restart|reload|force-reload|try-restart|status}"  
  62. exit2  
  63. esac  
  64. exit$RETVAL 

 zebra的启动脚本:

  1. [root@lvs_cluster_C1 ~]# cat /etc/init.d/zebra  
  2. #!/bin/bash  
  3. # chkconfig: - 1585  
  4. # config: /etc/quagga/zebra.conf  
  5. ### BEGIN INIT INFO  
  6. # Provides: zebra  
  7. # Short-Description: GNU Zebra routing manager  
  8. # Description: GNU Zebra routing manager  
  9. ### END INIT INFO  
  10. # source functionlibrary  
  11. . /etc/rc.d/init.d/functions  
  12. # quagga command line options  
  13. . /etc/sysconfig/quagga  
  14. RETVAL=0  
  15. PROG="zebra"  
  16. cmd=zebra  
  17. LOCK_FILE=/var/lock/subsys/zebra  
  18. CONF_FILE=/etc/quagga/zebra.conf  
  19. case"$1"in  
  20. start)  
  21. # Check that networking isup.  
  22. [ "${NETWORKING}"= "no"] && exit 1  
  23. # The process must be configured first.  
  24. [ -f $CONF_FILE ] || exit 6  
  25. if[ `id -u` -ne 0]; then  
  26. echo $"Insufficient privilege"1>&2  
  27. exit 4  
  28. fi  
  29. echo -n $"Starting $PROG: "  
  30. /sbin/ip route flush proto zebra  
  31. daemon $cmd -d $ZEBRA_OPTS  
  32. RETVAL=$?  
  33. [ $RETVAL -eq 0] && touch $LOCK_FILE  
  34. echo  
  35. ;;  
  36. stop)  
  37. echo -n $"Shutting down $PROG: "  
  38. killproc $cmd  
  39. RETVAL=$?  
  40. [ $RETVAL -eq 0] && rm -f $LOCK_FILE  
  41. echo  
  42. ;;  
  43. restart|reload|force-reload)  
  44. $0stop  
  45. $0start  
  46. RETVAL=$?  
  47. ;;  
  48. condrestart|try-restart)  
  49. if[ -f $LOCK_FILE ]; then  
  50. $0stop  
  51. $0start  
  52. fi  
  53. RETVAL=$?  
  54. ;;  
  55. status)  
  56. status $cmd  
  57. RETVAL=$?  
  58. ;;  
  59. *)  
  60. echo $"Usage: $0 {start|stop|restart|reload|force-reload|try-restart|status}"  
  61. exit 2  
  62. esac  
  63. exit $RETVAL 

 

 quagga的配置:

  1. [root@lvs_cluster_C1 ~]# cat /etc/sysconfig/quagga  
  2. #  
  3. # Default: Bind all daemon vtys to the loopback(s) only  
  4. #  
  5. QCONFDIR="/etc/quagga"  
  6. BGPD_OPTS="-A 127.0.0.1 -f ${QCONFDIR}/bgpd.conf"  
  7. OSPF6D_OPTS="-A ::1 -f ${QCONFDIR}/ospf6d.conf"  
  8. OSPFD_OPTS="-A 127.0.0.1 -f ${QCONFDIR}/ospfd.conf"  
  9. RIPD_OPTS="-A 127.0.0.1 -f ${QCONFDIR}/ripd.conf"  
  10. RIPNGD_OPTS="-A ::1 -f ${QCONFDIR}/ripngd.conf"  
  11. ZEBRA_OPTS="-A 127.0.0.1 -f ${QCONFDIR}/zebra.conf"  
  12. ISISD_OPTS="-A ::1 -f ${QCONFDIR}/isisd.conf"  
  13. # Watchquagga configuration (please check timer values before using):  
  14. WATCH_OPTS=""  
  15. WATCH_DAEMONS="zebra bgpd ospfd ospf6d ripd ripngd"  
  16. # To enable restarts, uncomment thisline (but first be sure to edit  
  17. # the WATCH_DAEMONS line to reflect the daemons you are actually using):  
  18. #WATCH_OPTS="-Az -b_ -r/sbin/service_%s_restart -s/sbin/service_%s_start -k/sbin/service_%s_stop"  

3、服务启动:

  1. /etc/init.d/zebra start && chkconfig zebra on  
  2. /etc/init.d/ospfd start && chkconfig ospfd on  

PS:先启动zebra再启动ospf,不然LB会学习不到路由信息

C、lvs部署部分 

1、安装组件

  1. #安装带fullnat功能内核(淘宝已开源)  
  2. rpm -ivh kernel-2.6.32-220.23.3.el6.x86_64.rpm kernel-firmware-2.6.32-220.23.3.el6.x86_64.rpm --force  
  3. #安装lvs-tools(ipvsadm,keepalived,quagga),这些工具都是依据新内核修改过的,所以不要用原生的  
  4. rpm -ivh lvs-tools-1.0.0-77.el6.x86_64.rpm 

 

2、添加local_address网段

  1. cat /opt/sbin/ipadd.sh  
  2. #!/bin/bash  
  3. arg=$1  
  4. dev=bond0  
  5. network="10.10.251"##LB2 10.10.250  
  6. seq="2 254"  
  7. functionstart() {  
  8. fori in`seq $seq`  
  9. do  
  10. ip addr add $network.$i/32dev $dev  
  11. done  
  12. }  
  13. functionstop() {  
  14. fori in`seq $seq`  
  15. do  
  16. ip addr del $network.$i/32dev $dev  
  17. done  
  18. }  
  19. case"$arg"in  
  20. start)  
  21. start  
  22. ;;  
  23. stop)  
  24. stop  
  25. ;;  
  26. restart)  
  27. stop  
  28. start  
  29. ;;  
  30. esac  
  31. echo "/opt/sbin/ipadd.sh">> /etc/rc.local ##加入开机启动   

3、keepalived的配置文件

1>配置问的大概说明

  1. .  
  2. ├── gobal_module              ##全局配置文件  
  3. ├── info.txt                  ##记录集群部署的业务信息  
  4. ├── keepalived.conf           ##主配置文件  
  5. ├── kis_ops_test.conf         ##业务配置文件  
  6. ├── local_address.conf        ##local_address  
  7. ├── lvs_module                ##所有业务的include配置  
  8. └── realserver                #rs目录  
  9. └── kis_ops_test_80.conf  ##业务的realserver的配置文件  

2>配置文件的内容说明

  1. [root@lvs_cluster_C1 keepalived]# cat /etc/keepalived/gobal_module   
  2.  
  3. ! global configure file  
  4. global_defs {  
  5. notification_email {  
  6. navy@qq.com  
  7. }  
  8. notification_email_from navy@qq.com  
  9. smtp_server 127.0.0.1  
  10. smtp_connect_timeout 30  
  11. router_id LVS_CLUSTER  
  12. }   
  13.  
  14. [root@lvs_cluster_C1 keepalived]# cat /etc/keepalived/local_address.conf   
  15.  
  16. 1  
  17. 2  
  18. 3 local_address_group laddr_g1 {  
  19. 10.10.250.2-254   ##LB1 10.10.251.2-254  
  20. }   
  21.  

PS:local_address每个LB不能重复

  1. [root@lvs_cluster_C1 keepalived]# cat /etc/keepalived/lvs_module  
  2.  
  3.  include./kis_ops_test.conf #测试   
  4.  
  5. [root@lvs_cluster_C1 keepalived]# cat /etc/keepalived/kis_ops_test.conf  
  6.  
  7. #把local_address include进来  
  8. include./local_address.conf  
  9. #VIP组,可以有多个vip  
  10. virtual_server_group kis_ops_test_80 {  
  11. 114.11x.9x.18580  #kis_ops_test  
  12. }  
  13. virtual_server group kis_ops_test_80 {  
  14. delay_loop 7  
  15. lb_algo wrr  
  16. lb_kind FNAT  
  17. protocol TCP  
  18. nat_mask 255.255.255.0  
  19. persistence_timeout 0    #回话保持机制,默认为0  
  20. syn_proxy  ##开启此参数可以有效防范SynFlood攻击  
  21. laddr_group_name  laddr_g1  
  22. alpha       #开启alpha模式:启动时默认rs是down的状态,健康检查通过后才会添加到vs pool  
  23. omega      #开启omega模式,清除rs时会执行相应的脚本(rs的notify_up,quorum_up)  
  24. quorum 1    #服务是否有效的阀值(正常工作rs的wight值)  
  25. hysteresis 0   #延迟系数跟quorum配合使用  
  26. #高于或低于阀值时会执行以下脚本。  
  27. quorum_up " ip addr add 114.11x.9x.185/32 dev lo ;"  
  28. quorum_down " ip addr del 114.11x.9x.185/32 dev lo ;"  
  29. include./realserver/kis_ops_test_80.conf  
  30. }   
  31.  
  32. [root@lvs_cluster_C1 ~]# cat /etc/keepalived/realserver/kis_ops_test_80.conf   
  33.  
  34. #real_server 10.10.2.240 80 {  
  35. #     weight 1  
  36. #     inhibit_on_failure  
  37. #     TCP_CHECK {  
  38. #            connect_timeout 3  
  39. #            nb_get_retry 3        ##TCP_CHECK 方式此参数不生效  
  40. #            delay_before_retry 3  ##TCP_CHECK 方式此参数不生效  
  41. #            connect_port 80  
  42. #               }  
  43. #}  
  44. real_server 10.10.2.240 80 {  
  45. weight 1  
  46. inhibit_on_failure  
  47. HTTP_GET {  
  48. url {  
  49. path /abc  
  50. digest 134b225d509b9c40647377063d211e75  
  51. }  
  52. connect_timeout 3  
  53. nb_get_retry 3  
  54. delay_before_retry 3  
  55. connect_port 80  
  56. }  
  57. }   
  58.  

到这里LB上的配置基本上完成了,还有一点需要配置哈,那就是要在LB上配置路由策略,不然vip是ping不通的,但是不影响http访问,具体配置如下:

  1. echo "from 114.11x.9x.0/24 table LVS_CLUSTER">/etc/sysconfig/network-scripts/rule-bond1  
  2. echo "default table LVS_CLUSTER via 10.10.254.21 dev bond1">/etc/sysconfig/network-scripts/route-bond1 ##LB1 via 10.10.254.17  
  3. echo "203       LVS_CLUSTER">> /etc/iproute2/rt_tables  
  4. /etc/init.d/network restart  ##重启网络  
 

四、realserver的配置

1、realserver需要更换带toa模块的内核,如果不更改的话你的web服务(比如nginx)的日志获取不到用户的真实IP,而是记录了LB的local_address的IP

  1. centos5系列的系统:  
  2. rpm -ivh kernel-2.6.18-274.18.2.el5.kis_toa.x86_64.rpm  
  3. centos6系列的系统:  
  4. rpm -ivh kernel-toa-2.6.32-220.23.3.el6.kis_toa.x86_64.rpm  

2、realserver要能和LB的local_address互访即可,这个要看大家的内网环境了。

五、LB的调优

1、网卡调优,这个很重要,如果不调优大流量下,cpu单核耗尽会把LB搞死的,本人亲身体验过,
具体看参考我之前的文章,高并发、大流量网卡调优

2、内核参数调优

  1. #该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目  
  2. net.core.netdev_max_backlog = 500000  
  3. #开启路由转发功能  
  4. net.ipv4.ip_forward = 1  
  5. #修改文件描述符  
  6. fs.nr_open = 5242880  
  7. fs.file-max = 4194304  
  8. sed -i 's/1024/4194304/g'/etc/security/limits.conf  
PS:目前集群有这么个问题,realserver不能访问自己的vip,因为有些业务确实有这样的需要,最后想到以下解决办法:
1、如果realserver上有公网IP且和vip是同一个段则需要加路由:
route add -net vip netmask 255.255.255.255gw 114.11x.9x.1
2、如果realserver走的nat网关,而nat网关的出口是和vip同一个网段,那就需要在nat上加如上功能的路由即可 。

出处:LVS集群部署详细过程(LVS+OSPF)


Viewing all articles
Browse latest Browse all 10

Latest Images

Trending Articles





Latest Images