• 基于Python实现的负载均衡模拟(语言类综合项目实践)


    目录
    目录 1
    语言类综合项目实践报告 2

    1. 课程设计目的 2
    2. 课程设计任务 2
    3. 负载均衡的设计 3
      3.1. 负载均衡系统的整体设计 3
      3.2. 基于动态性能指标的负载均衡系统的设计 5
      3.2.1. 计算节点服务器的设计 5
      3.2.2. 负载均衡器的设计 7
      3.2.3. 客户端的设计 8
    4. 负载均衡的实现 9
      4.1. 计算节点服务器的实现 9
      4.1.1. 节点CPU使用率获取模块 9
      4.1.2. 心跳包发送模块 10
      4.1.3. 任务接收返回模块 10
      4.1.4. 任务处理模块 11
      4.2. 负载均衡器的实现 11
      4.2.1. 节点服务器状态相关数据结构 11
      4.2.2. 日志记录模块 12
      4.2.3. 服务器管理模块 12
      4.2.4. 服务器心跳包接收模块 14
      4.2.5. 任务接收转发调度模块 16
      4.3. 客户端的实现 17
      4.3.1. 任务选择模块 17
      4.3.2. 任务发送模块 18
    5. 测试 19
      5.1. 打开所有机器,根据实际情况调整程序中的IP地址 19
      5.2. 先运行机器3、4、5的服务器程序 20
      5.3. 运行机器2的负载均衡程序 21
      5.4. 调整机器1中程序需要同时运行线程数后打开客户端程序 21
      5.5. 运行1分钟查看结果 22
      下图5.6为机器2运行负载均衡程序情况截图 22
      5.6. 查看日志 22
    6. 总结 25
      2.课程设计任务
      本文设计并使用Python语言实现了一个用来构建高并发、高可用、合作式的反向代理负载均衡模拟系统,该系统包括负载均衡服务器、多个模拟客户端、多个模拟服务器。实现了对多并发负载的动态合理的均衡。
      本文的创新性主要有以下几点:
      1、 利用Python语言搭建起集群的通信和信息分发系统,利用Python语言的丰富的多线程和网络编程库实现高并发的负载均衡程序。
      2、 采用心跳包与服务器信息相结合的方式并采用UDP方式以减轻负载均衡器和服务器的处理压力,心跳包不但能够作为判断服务器存活的依据,而且能为动态均衡算法提供数据。
      3、 考虑到动态负载均衡的实现,综合了易于实现而且性能优良的常见的负载均衡调度策略,提出以“单位时间任务的到达数/单位时间任务的完成数”、“CPU利用率*连接数”作为负载指标,并对负载均衡调度算法做了改进。
      4、 使用代理服务器技术将请求均匀转发给多台内部Web服务器之一上,从而达到负载均衡的目的。可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能,具备额外的安全性,外部客户不能直接访问真实的服务器。并且实现起来可以实现较好的负载均衡策略,将负载可以非常均衡的分给内部服务器,不会出现负载集中到某个服务器的偶然现象。
      3.负载均衡的设计
      3.1.负载均衡系统的整体设计
      本节结合的特点,论述了负载均衡系统的总体设计方案与步骤,简化了负载均衡系统模型,使系统的实现更加简洁明了。
      1233.1 负载均衡器的实现方式为:将网络服务的地址(如公网IP地址、TCP套接字等)部署在负载均衡器上,将负载均衡器作为网络服务的总入口,接收客户端的所有访问请求。负载均衡器受到用户的访问请求后,将访问请求按照一定的策略分发给某一台真实的服务器进行处理。真实服务器对访问请求处理后,本文转载自http://www.biyezuopin.vip/onews.asp?id=16986将处理结果返回给负载均衡器,负载均衡器受到真实服务器的处理结果,将它返回给客户端。
      下图3.1展示了一个负载均衡系统的组网结果,图中包含了4台客户端,1台负载均衡器,4台真实的计算节点服务器。公网IP配置在负载均衡器上,负载均衡器与计算节点服务器之间,则通过私网地址进行通讯。
      在这里插入图片描述

    图3.1负载均衡系统

    '''
    Created on Jun 10, 2014
    
    @author: luoding
    '''
    import socket
    import random
    import threading
    import time
    import traceback
    
    taskNum = (1,3)
    host = 'localhost'  
    port = 8080 
    bufsize = 1024  
    addr = (host,port) 
    rate = 0.1
    
    def choice_task():
        '''任务选择,暂时以随机数代替'''
        return random.randint(1,3)
    
    class Client(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self) 
    
        def run(self):
            client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
            client.connect(addr)  
            while True:
                try:  
                    data = choice_task()  
                    if not data or data=='exit':  
                        break  
                    print 'Send task',data
                    client.send(str(data))  
                    data = client.recv(bufsize)  
                    if not data:  
                        break  
                    print data.strip()  
                except:
                    traceback.print_exc()
                    break
                
            client.close() 
    
         
    if __name__ == '__main__':
        for i in range(1) :
            t = Client()
            t.start()
            time.sleep(rate)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    一起学时序分析之建立/保持时间裕量
    使用PM2部署goweb工程
    2023年中国劳保用镜市场规模现状及行业需求前景分析[图]
    [vite] Failed to load source map for */*.css.js
    Flink处理函数(一)
    【无标题】储能电池GB/T 36276测试,储能电池IEC62619测试,储能电池UL1973测试
    Qt-qrencode开发-生成、显示二维码
    测开要做的开发工作到底是做什么
    linux 学习:查找命令 find | grep
    C++ 模板进阶使用
  • 原文地址:https://blog.csdn.net/newlw/article/details/127663078