V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
51Reboot
V2EX  ›  Python

戏说:负载均衡

  •  
  •   51Reboot · 2017-09-04 10:33:37 +08:00 · 3134 次点击
    这是一个创建于 2397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://i.v2ex.co/Cu8woxB3l.jpeg

    负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

    一、lvs Linux Virtual Server (lvs) 是 Linux 内核自带的负载均衡器,也是目前性能最好的软件负载均衡器之一。

    1、转发模式

    https://i.v2ex.co/60Te2A6rl.jpeg

    2、调度算法

    ( 1 )轮叫调度( Round-Robin Scheduling )

    ( 2 )加权轮叫调度( Weighted Round-Robin Scheduling )

    ( 3 )最小连接调度( Least-Connection Scheduling )

    ( 4 )加权最小连接调度( Weighted Least-Connection Scheduling )

    ( 5 )基于局部性的最少链接( Locality-Based Least Connections Scheduling )

    ( 6 )带复制的基于局部性最少链接( Locality-Based Least Connections with Replication Scheduling )

    ( 7 )目标地址散列调度( Destination Hashing Scheduling )

    ( 8 )源地址散列调度( Source Hashing Scheduling )

    ( 9 )最短预期延时调度( Shortest Expected Delay Scheduling )

    ( 10 )不排队调度( Never Queue Scheduling )

    3、lvs 配置示例

    安装 ipvs 包并开启 ip 转发

    yum -y install ipvsadm keepalived sysctl -w net.ipv4.ip_forward=1 修改 /etc/keepalived/keepalived.conf,增加 vip 和 lvs 的配置

    vrrp_instance VI_3 { state MASTER # 另一节点为 BACKUP interface eth0 virtual_router_id 11 priority 100 # 另一节点为 50 advert_int 1 authentication { auth_type PASS auth_pass PASSWORD }

    track_script {
        chk_http_port
    }
    
    virtual_ipaddress {
        192.168.0.100
    }
    

    }

    virtual_server 192.168.0.100 9696 { delay_loop 30 lb_algo rr lb_kind DR persistence_timeout 30 protocol TCP

    real_server 192.168.0.101 9696 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 9696
        }
    }
    
    real_server 192.168.0.102 9696 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 9696
        }
    }
    

    } 重启 keepalived:

    systemctl reload keepalived 最后在 neutron-server 所在机器上为 lo 配置 vip,并抑制 ARP 响应:

    vip=192.168.0.100 ifconfig lo:1 ${vip} broadcast ${vip} netmask 255.255.255.255 route add -host ${vip} dev lo:1 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

    4、LVS 缺点

    ( 1 ) Keepalived 主备模式设备利用率低;不能横向扩展; VRRP 协议,有脑裂的风险。

    ( 2 ) ECMP 的方式需要了解动态路由协议,LVS 和交换机均需要较复杂配置;交换机的 HASH 算法一般比较简单,增加删除节点会造成 HASH 重分布,可能导致当前 TCP 连接全部中断;部分交换机的 ECMP 在处理分片包时会有 BUG。

    二、Haproxy

    Haproxy 也是 Linux 最常用的负载均衡软件之一,兼具性能和功能的组合,同时支持 TCP 和 HTTP 负载均衡。

    配置和使用方法请见 https://nginx.org/en/。

    三、Nginx

    Nginx 也是 Linux 最常用的负载均衡软件之一,常用作反向代理和 HTTP 负载均衡(当然也支持 TCP 和 UDP 负载均衡)。

    配置和使用方法请见 https://nginx.org/en/。

    四、自研负载均衡

    1、Google Maglev

    Maglev 是 Google 自研的负载均衡方案,在 2008 年就已经开始用于生产环境。Maglev 安装后不需要预热 5 秒内就能处理每秒 100 万次请求。谷歌的性能基准测试中,Maglev 实例运行在一个 8 核 CPU 下,网络吞吐率上限为 12M PPS (数据包每秒)。如果 Maglev 使用 Linux 内核网络堆栈则速度会慢下来,吞吐率小于 4M PPS。

    https://i.v2ex.co/gsi6N7Ifl.jpeg

    ( 1 )路由器 ECMP (Equal Cost Multipath) 转发包到 Maglev (而不是传统的主从结构)

    ( 2 ) Kernel Bypass, CPU 绑定,共享内存

    ( 3 )一致性哈希保证连接不中断

    2、UCloud Vortex

    Vortex 参考了 Maglev,大致的架构和实现跟 Maglev 类似:

    ( 1 ) ECMP 实现集群的负载均衡

    ( 2 )一致性哈希保证连接不中断

    即使是不同的 Vortex 服务器收到了数据包,仍然能够将该数据包转发到同一台后端服务器

    后端服务器变化时,通过连接追踪机制保证当前活动连接的数据包被送往之前选择的服务器,而所有新建连接则会在变化后的服务器集群中进行负载分担

    ( 3 ) DPDK 提升单机性能 (14M PPS,10G, 64 字节线速)

    通过 RSS 直接将网卡队列和 CPU Core 绑定,消除线程的上下文切换带来的开销

    Vortex 线程间采用高并发无锁的消息队列通信

    ( 4 ) DR 模式避免额外开销

    五、总结

    本文为大家详细讲解了关于 Linux 配置中的负载均衡的装置,适应现代社会的需求, 作为运维工程师的你,学会了吗?

    clino
        1
    clino  
       2017-09-04 10:53:21 +08:00
    Haproxy 链接给错了
    51Reboot
        2
    51Reboot  
    OP
       2017-09-04 10:58:46 +08:00
    @clino https://nginx.org/en/ 你试一下这个哦
    51Reboot
        3
    51Reboot  
    OP
       2017-09-04 11:10:08 +08:00
    由于一些问题,图片链接没有加载出来,大家可以点开链接查看哦
    51Reboot
        4
    51Reboot  
    OP
       2017-09-04 13:26:50 +08:00
    51Reboot
        5
    51Reboot  
    OP
       2017-09-04 13:31:51 +08:00
    51Reboot
        6
    51Reboot  
    OP
       2017-09-04 13:32:38 +08:00
    @51Reboot 错误地址
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5866 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:15 · PVG 10:15 · LAX 19:15 · JFK 22:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.