热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LB-createLB整理架构图-loadbalancer-openstackF版

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!如有转载,请保留源作者博客信息。BetterMe的博客:blog.csdn.nettantexian如需交流,

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如有转载,请保留源作者博客信息。

Better Me的博客:blog.csdn.net/tantexian

如需交流,欢迎大家博客留言。

1、第1层 根据:        mapper.resource("loadbalancer", "loadbalancers",         member={'details': 'GET'},         cOntroller=lb_resource, collection={'detail': 'GET'})
self._list()对应底层的index()函数self._create()对应底层的create()函数self._delete()对应底层的delete()函数self._get()对应底层的show()函数


由上图对应关系我们可以知道create()函数的webservice发布为:return self._create("/loadbalancers", body, "loadbalancer")接着就自动调用balancer里面的:    @utils.http_success_code(202)    def create(self, req, body):        LOG.debug("Got create request. Request: %s", req)        #here we need to decide which device should be used        params = body.copy()#将参数复制        LOG.debug("Headers: %s", req.headers)        # We need to create LB object and return its id        tenant_id = req.headers.get('X-Tenant-Id', "")        params['tenant_id'] = tenant_id#参数列表中获取tenant_id        lb_id = core_api.create_lb(self.conf, params)#跟进到1.1层        return {'loadbalancer': {'id': lb_id}}#返回一个包含lb_id的字典列表
2、第1.1层、
def create_lb(conf, params):    nodes = params.pop('nodes', [])#获取nodes参数列表,其详细内容,参考下面注解    probes = params.pop('healthMonitor', [])#获取监测检查的参数列表,其详细内容,参考下面注解    vips = params.pop('virtualIps', [])#获取虚拟VIP参数列表,其详细内容,参考下面注解    values = db_api.loadbalancer_pack_extra(params)#解析参数为一个字典列表    lb_ref = db_api.loadbalancer_create(conf, values)#更新loadbalancer的数据库,返回值为models.LoadBalancer()数据库表。跟进到下一层1.1.1    device = scheduler.schedule_loadbalancer(conf, lb_ref)#根据当前lb数据,修改底层配置device文件,进行调度。跟进到下一层1.1.2    device_driver = drivers.get_device_driver(conf, device['id'])#获取device驱动,跟进到下一层1.1.3    lb = db_api.unpack_extra(lb_ref)#将lb_ref转变为一个字典    lb['device_id'] = device['id']    lb_ref = db_api.loadbalancer_pack_extra(lb)#加入device_id选项之后再次封装    try:        with device_driver.request_context() as ctx:#此处ctx的作用???(相关驱动配置???)            commands.create_loadbalancer(ctx, lb_ref, nodes, probes, vips)#创建loadbalancer,跟进到下一层1.1.4
    except (exception.Error, exception.Invalid):        lb_ref.status = lb_status.ERROR        lb_ref.deployed = 'False'    else:        lb_ref.status = lb_status.ACTIVE        lb_ref.deployed = 'True'    db_api.loadbalancer_update(conf, lb['id'], lb_ref)    return lb_ref['id']

注解:nodes里面包括虚拟机的地址,以及端口和负载均衡调度的权重参数等。
healthMonitor里面包括???
VIP用来连接外部和内部实例IP直接通讯的中间层IP。这样当我们机器出现故障时,我们的VIP还能正常工作接受外部服务和请求。
3、第1.1.1层
更新models.LoadBalancer()数据库表值,返回整个LoadBalancer()表格数据

4、第1.1.2层def schedule_loadbalancer(conf, lb_ref):    conf.register_opts(bind_opts)#绑定特定配置文件,以便于修改为特定配置文件    device_filters = [utils.import_class(foo) for foo in conf.device_filters]    all_devices = db_api.device_get_all(conf)#获取所有 models.Device数据库表 ,跟进到下一层1.1.2.1    if not all_devices:#如果没有设备则报设备找不到异常        raise exp.DeviceNotFound    cost_functiOns= []    for fullname in conf.device_cost_functions:        conf_name = 'device_cost_%s_weight' % fullname.rpartition('.')[-1]        try:            weight = getattr(conf, conf_name)#获取权重        except cfg.NoSuchOptError:            conf.register_opt(cfg.FloatOpt(conf_name, default=1.))            weight = getattr(conf, conf_name)        cost_functions.append((utils.import_class(fullname), weight))    filtered_devices = [dev for dev in all_devices                        if all(filt(conf, lb_ref, dev)                        for filt in device_filters)]    if not filtered_devices:        raise exp.NoValidDevice    costed = []    for dev in filtered_devices:        w = 0.        for cost_func, weight in cost_functions:            w += weight * cost_func(conf, lb_ref, dev)        costed.append((w, dev))    costed.sort()    return costed[0][1]
5、第1.1.2.1层
获取models.Device数据库表里面的所有数据
6、第1.1.3层

7、第1.1.4层
def create_loadbalancer(ctx, balancer, nodes, probes, vips):    lb = db_api.unpack_extra(balancer)#解封装为字典    sf = db_api.serverfarm_create(ctx.conf, {'lb_id': lb['id']})#创建serverfarm(更新models.ServerFarm()数据库表),跟进下一层1.1.4.1    if 'algorithm' in lb:#如果lb参数中有’algorithm‘则获取type属性字典        predictor_params = {'sf_id': sf['id'], 'type': lb['algorithm']}    else:        predictor_params = {'sf_id': sf['id']}    db_api.predictor_create(ctx.conf, predictor_params)#更新数据到预报器models.Predictor()数据库表中    create_server_farm(ctx, sf)#创建serverfarm(更新models.ServerFarm()数据库表),跟进下一层1.1.4.2    for node in nodes:#如果参数中有node则更新server数据库        node_values = db_api.server_pack_extra(node)        node_values['sf_id'] = sf['id']#加入sf_id重新封装        rs_ref = db_api.server_create(ctx.conf, node_values)#更新models.Server()数据库数据        create_rserver(ctx, rs_ref)#创建rserver,更新models.Server()数据库数据        add_rserver_to_server_farm(ctx, sf, rs_ref)#跟进到下一层1.1.4.3
    for probe in probes:#如果参数中有probe(探测器)则更新probe数据库        probe_values = db_api.probe_pack_extra(probe)        probe_values['lb_id'] = lb['id']        probe_values['sf_id'] = sf['id']        probe_ref = db_api.probe_create(ctx.conf, probe_values)#更新probe数据库        create_probe(ctx,  probe_ref)# 代码pass:???        add_probe_to_server_farm(ctx, sf, probe_ref)
    for vip in vips:#如果参数中有vip则更新virturalIps数据库        vip_values = db_api.virtualserver_pack_extra(vip)        vip_values['lb_id'] = lb['id']        vip_values['sf_id'] = sf['id']        vip_ref = db_api.virtualserver_create(ctx.conf, vip_values)        create_vip(ctx, vip_ref, sf)##跟进到下一层1.1.4.4

8、第1.1.4.1层
更新models.ServerFarm()数据库表
9、第1.1.4.2层@with_rollbackdef create_server_farm(ctx, sf):    try:        pr = db_api.predictor_get_all_by_sf_id(ctx.conf, sf['id'])#通过sf_id过滤获取models.Predictor数据        ctx.device.create_server_farm(sf, pr)    #????        db_api.serverfarm_update(ctx.conf, sf['id'], {'deployed': True})#更新serverfarm数据库表        yield    except Exception:        delete_server_farm(ctx, sf)#出现异常则删除刚刚建立好的数据库数据        raise
10、1.1.4.3层@with_rollbackdef add_rserver_to_server_farm(ctx, server_farm, rserver):    try:        if (rserver.get('parent_id') and rserver['parent_id'] != ""):            #Nasty hack. We need to think how todo this more elegant            rserver['name'] = rserver['parent_id']        ctx.device.add_real_server_to_server_farm(server_farm, rserver)#根据特定的device(以HAproxy为例),跟进到下一层1.1.4.3.1层        yield    except Exception:        ctx.device.delete_real_server_from_server_farm(server_farm, rserver)        raise
11、第1.1.4.3.1层    def add_real_server_to_server_farm(self, serverfarm, rserver):        haproxy_serverfarm = HaproxyBackend()        haproxy_serverfarm.name = serverfarm['id']        haproxy_rserver = HaproxyRserver()        haproxy_rserver.name = rserver['id']        haproxy_rserver.weight = rserver.get('weight') or 1        haproxy_rserver.address = rserver['address']        haproxy_rserver.port = rserver.get('port') or 0        haproxy_rserver.maxcOnn= rserver['extra'].get('maxCon') or 10000        #Modify remote config file, check and restart remote haproxy        logger.debug('[HAPROXY] Creating rserver %s in the '                     'backend block %s' %                     (haproxy_rserver.name, haproxy_serverfarm.name))
        config_file = self._get_config()#???        config_file.add_rserver_to_backend_block(haproxy_serverfarm,                                             haproxy_rserver)#???

12、第 1.1.4.4 层    def create_virtual_ip(self, virtualserver, serverfarm):        if not bool(virtualserver['id']):            logger.error('[HAPROXY] Virtualserver name is empty')            return 'VIRTUALSERVER NAME ERROR'        haproxy_virtualserver = HaproxyFronted()        haproxy_virtualserver.name = virtualserver['id']        haproxy_virtualserver.bind_address = virtualserver['address']        haproxy_virtualserver.bind_port = virtualserver.get('port') or 0        haproxy_serverfarm = HaproxyBackend()        haproxy_serverfarm.name = serverfarm['id']        logger.debug('[HAPROXY] create VIP %s' % haproxy_serverfarm.name)        #Add new IP address        remote_interface = RemoteInterface(self.device_ref,                                           haproxy_virtualserver)        remote_interface.add_ip()        #Modify remote config file, check and restart remote haproxy        config_file = self._get_config()        config_file.add_frontend(haproxy_virtualserver, haproxy_serverfarm)

推荐阅读
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • Nginxgaodaima.comnginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司 ... [详细]
author-avatar
aRuis
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有