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

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

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的值不能太大。

 

责任编辑:张燕妮 来源: 今日头条
相关推荐

2020-08-28 08:55:32

商城系统高并发

2015-07-17 10:04:33

MKMapView优化

2009-05-22 17:05:52

2011-02-22 09:29:23

jQueryJavaScript

2023-11-06 07:45:42

单据图片处理

2021-08-02 13:08:56

高并发服务

2022-09-15 10:02:58

测试软件

2011-06-28 10:41:50

DBA

2019-08-15 11:30:06

SQL数据库ASH

2021-01-08 13:52:15

Consul微服务服务注册中心

2020-09-04 16:38:01

网络攻击勒索软件数据泄露

2020-10-24 13:50:59

Python编程语言

2021-12-27 10:08:16

Python编程语言

2017-08-31 15:41:17

MysqlLVSRS机器

2019-03-19 14:52:00

性能优化MySQL数据库

2022-09-07 09:09:13

高并发架构

2019-01-21 11:17:13

CPU优化定位

2023-11-29 12:12:24

Oceanbase数据库

2017-11-09 09:06:29

流量暴增优化

2019-12-16 07:18:42

数据库SQL代码
点赞
收藏

51CTO技术栈公众号