一次lvs10万+并发的优化实例

1 缘起

在一次实际项目中,lvs 只能承载量很低,需要对lvs和Linux内核参数进行优化。

创新互联公司专注于柳江企业网站建设,自适应网站建设,商城网站开发。柳江网站建设公司,为柳江等地区提供建站服务。全流程定制制作,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务

2 为什么使用lvs+keepalived架构

(1)LVS可以实现负载均衡,但是不能够进行健康检查。比如一个RS出现故障,LVS 仍然会把请求转发给故障的RS服务器,这样就会导致请求的无效性;keepalived 软件可以进行健康检查。

(2)使用keepalived能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题。

3 lvs+keepalived部署

3.1 部署图

注意:
(1)lvs+keepalived至少需要2台服务器。
(2)需要一个VIP。
(3)RS服务器不能和LVS以及Keepalived复用。

4.2 lvs+keepalived部署(2台DS服务器)

  • 安装ipvs和keepalived
 
 
 
 
  1. yum install ipvsadm keepalived -y 
  • keepalived配置

注意:
(1)keepalived是否需要争抢主IP,如果不需要,需要把state都修改为BACKUP,并配置nopreempt。
(2)persistence_timeout的作用是:在一定时间内使来自于同一个Client的所有TCP请求被负载到同一个RealServer上,查看ipvsadm -S -n

主节点

 
 
 
 
  1. #主节点( MASTER )配置文件 
  2. cat > /etc/keepalived/keepalived.conf <<'EOF' 
  3. ! Configuration File for keepalived 
  4. global_defs { 
  5.    router_id LVS_DEVEL 
  6. vrrp_instance VI_1 { 
  7.     state BACKUP  ! 主为master,不争抢模式改为BACKUP 
  8.     nopreempt  !不争抢模式添加 
  9.     interface eth0 
  10.     virtual_router_id 51 
  11.     priority 100 
  12.     advert_int 1 
  13.     authentication { 
  14.         auth_type PASS 
  15.         auth_pass 1111 
  16.     } 
  17.     virtual_ipaddress { 
  18.         192.168.112.10 
  19.     } 
  20. virtual_server 192.168.112.10 80 { 
  21.     delay_loop 6 
  22.     lb_algo rr 
  23.     lb_kind DR 
  24.     ! persistence_timeout 0 
  25.     protocol TCP 
  26.     real_server 192.168.112.13 80 { 
  27.         weight 1 
  28.         TCP_CHECK { 
  29.             connect_timeout 10 
  30.             retry 3 
  31.             delay_before_retry 3 
  32.             connect_port 80 
  33.         } 
  34.     } 
  35.     real_server 192.168.112.14 80 { 
  36.         weight 1 
  37.         TCP_CHECK { 
  38.             connect_timeout 10 
  39.             retry 3 
  40.             delay_before_retry 3 
  41.             connect_port 80 
  42.         } 
  43.     } 
  44.     real_server 192.168.112.15 80 { 
  45.         weight 1 
  46.         TCP_CHECK { 
  47.             connect_timeout 10 
  48.             retry 3 
  49.             delay_before_retry 3 
  50.             connect_port 80 
  51.         } 
  52.     } 
  53. EOF 

从节点

 
 
 
 
  1. cat > /etc/keepalived/keepalived.conf <<'EOF' 
  2. ! Configuration File for keepalived 
  3. global_defs { 
  4.    router_id LVS_DEVEL 
  5. vrrp_instance VI_1 { 
  6.     state BACKUP 
  7.     nopreempt  ! 不争抢模式添加 
  8.     interface eth0 
  9.     virtual_router_id 51 
  10.     priority 90 
  11.     advert_int 1 
  12.     authentication { 
  13.         auth_type PASS 
  14.         auth_pass 1111 
  15.     } 
  16.     virtual_ipaddress { 
  17.         192.168.112.10 
  18.     } 
  19. virtual_server 192.168.112.10 80 { 
  20.     delay_loop 6 
  21.     lb_algo rr 
  22.     lb_kind DR 
  23.     ! persistence_timeout 0 
  24.     protocol TCP 
  25.     real_server 192.168.112.13 80 { 
  26.         weight 1 
  27.         TCP_CHECK { 
  28.             connect_timeout 10 
  29.             retry 3 
  30.             delay_before_retry 3 
  31.             connect_port 80 
  32.         } 
  33.     } 
  34.     real_server 192.168.112.14 80 { 
  35.         weight 1 
  36.         TCP_CHECK { 
  37.             connect_timeout 10 
  38.             retry 3 
  39.             delay_before_retry 3 
  40.             connect_port 80 
  41.         } 
  42.     } 
  43.     real_server 192.168.112.15 80 { 
  44.         weight 1 
  45.         TCP_CHECK { 
  46.             connect_timeout 10 
  47.             retry 3 
  48.             delay_before_retry 3 
  49.             connect_port 80 
  50.         } 
  51.     } 
  52. EOF 
  • 内核参数
 
 
 
 
  1. echo 1 > /proc/sys/net/ipv4/ip_forward 
  2.  
  3. sysctl -w net.ipv4.ip_forward=1 
  • 启动
 
 
 
 
  1. systemctl enable keepalived 
  2.  
  3. systemctl start keepalived 

4.3 真实服务器配置

  • 配置脚本

不需要在lvs+keepalived的服务器上配置,需要在所有的真实服务器上配置。注意vip必须与前面keepalived上的vip相同。

 
 
 
 
  1. # vim lvs_dr_rs.sh 
  2. SNS_VIP=192.168.112.10 
  3. /etc/rc.d/init.d/functions 
  4. case "$1" in 
  5. start) 
  6.        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP 
  7.        /sbin/route add -host $SNS_VIP dev lo:0 
  8.        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
  9.        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 
  10.        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore 
  11.        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 
  12.        sysctl -p >/dev/null 2>&1 
  13.        echo "RealServer Start OK" 
  14.        ;; 
  15. stop) 
  16.        ifconfig lo:0 down 
  17.        route del $SNS_VIP >/dev/null 2>&1 
  18.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
  19.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce 
  20.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore 
  21.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce 
  22.        echo "RealServer Stoped" 
  23.        ;; 
  24. *) 
  25.        echo "Usage: $0 {start|stop}" 
  26.        exit 1 
  27. esac 
  28. exit 0 
  29. 执行生效 
  30. # 所有RS节点上分别执行脚本: 
  31. chmod +x lvs_dr_rs.sh 
  32.  ./lvs_dr_rs.sh start 

5 参数优化

5.1 LVS参数

  • 增大ipvs模块hash table的大小

ipvs模块hash table默认值为2^12=4096,改为2^20=1048576。可以用ipvsadm -l命令查询当前hash table的大小。

 
 
 
 
  1. IP Virtual Server version 1.2.1 (size=4096) 

修改方法:

在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为:

 
 
 
 
  1. options ip_vs conn_tab_bits=20 

重新加载ipvs模块。

 
 
 
 
  1. IP Virtual Server version 1.2.1 (size=1048576) 
  • 修改 LVS 表中的 timeout
 
 
 
 
  1. ipvsadm --set  900 60 300 
  2.  
  3. ipvsadm -ln --timeout 
  4. Timeout (tcp tcpfin udp): 900 60 300 

5.2 文件句柄及进程数

 
 
 
 
  1. *  soft nofile 1024000 
  2. *  hard nofile 1024000 
  3. *  soft nproc 1024000 
  4. *  hard nproc 1024000 

5.3 内核参数

 
 
 
 
  1. fs.file-max = 1048576 
  2. net.ipv4.ip_forward = 1 
  3. net.core.wmem_default = 8388608 
  4. net.core.wmem_max = 16777216 
  5. net.core.rmem_default = 8388608 
  6. net.core.rmem_max = 16777216 
  7. net.core.somaxconn = 65535 
  8. net.core.optmem_max = 81920 
  9. net.core.netdev_max_backlog = 262144 
  10. net.ipv4.route.gc_timeout = 20 
  11. net.ipv4.tcp_syncookies = 1 
  12. net.ipv4.tcp_abort_on_overflow = 1 
  13. net.ipv4.tcp_max_tw_buckets = 6000 
  14. net.ipv4.tcp_sack = 1 
  15. net.ipv4.tcp_window_scaling = 1 
  16. net.ipv4.tcp_no_metrics_save = 1 
  17. net.ipv4.tcp_rmem = 32768   131072  16777216 
  18. net.ipv4.tcp_wmem = 8192   131072  16777216 
  19. net.ipv4.tcp_mem = 94500000 915000000 927000000 
  20. net.ipv4.tcp_max_syn_backlog = 262144 
  21. net.ipv4.tcp_max_orphans = 3276800 
  22. net.ipv4.tcp_timestamps = 0 
  23. net.ipv4.tcp_synack_retries = 1 
  24. net.ipv4.tcp_syn_retries = 1 
  25. net.ipv4.tcp_tw_recycle = 1 
  26. net.ipv4.tcp_tw_reuse = 1 
  27. net.ipv4.tcp_fin_timeout = 10 
  28. net.ipv4.tcp_keepalive_time = 120 
  29. net.ipv4.tcp_keepalive_probes = 3 
  30. net.ipv4.tcp_keepalive_intvl = 15 
  31. net.ipv4.tcp_retries2 = 5 
  32. net.ipv4.ip_local_port_range = 1024    65000 
  33. net.ipv4.conf.default.rp_filter = 1 
  34. net.ipv4.conf.default.accept_source_route = 0 
  35. net.ipv4.conf.all.arp_ignore = 1 
  36. net.ipv4.conf.all.arp_announce = 2 
  37. #modprobe ip_conntrack  
  38. net.netfilter.nf_conntrack_tcp_timeout_established = 180 
  39. net.netfilter.nf_conntrack_max = 1048576 
  40. net.nf_conntrack_max = 1048576 
  41. kernel.sysrq = 0 
  42. kernel.core_uses_pid = 1 
  43. kernel.msgmnb = 65536 
  44. kernel.msgmax = 65536 
  45. kernel.shmmax = 68719476736 
  46. kernel.shmall = 4294967296 

注意:
net.ipv4.tcp_tw_recycle = 1有坑,在nat环境下慎用。

越是大并发,越要注意net.ipv4.tcp_max_tw_buckets的值不能太大。

文章题目:一次lvs10万+并发的优化实例
标题链接:http://www.shufengxianlan.com/qtweb/news23/400473.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联