2019独角兽企业重金招聘Python工程师标准>>>

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

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

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_rollback
def 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_rollback
def 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)

转载于:https://my.oschina.net/tantexian/blog/626571

LB-createLB整理架构图-loadbalancer-openstack F版相关推荐

  1. OpenStack介绍说明、OpenStack架构说明、OpenStack核心服务详细说明【keystone,nova,cinder,neutron...】、OpenStack创建VM,服务间交互示例

    文章目录 OpenStack介绍说明 OpenStack起源 认识openstack[重要] OpenStack架构说明 OpenStack架构概览 OpenStack逻辑架构 OpenStack生产 ...

  2. 两万字讲全数据实时同步方案(附代码及架构图)(建议收藏)

    一.早期关系型数据库之间的数据同步 二.大数据时代下的数据同步 三.总结 一.早期关系型数据库之间的数据同步 1).全量同步 比如从oracle数据库中同步一张表的数据到Mysql中,通常的做法就是 ...

  3. 从上百幅架构图中学大型网站建设经验(上)

    http://blog.csdn.net/v_JULY_v/article/details/6839360 引言 近段时间以来,通过接触有关海量数据处理和搜索引擎的诸多技术,常常见识到不少精妙绝伦的架 ...

  4. plsql如何显示表结构图_产品经理需了解的架构图/结构图知识

    产品经理在工作过程中会遇到各种架构图(结构图),这些名词很容易混淆.一般情况下,3-5年经验.善于总结归纳的产品经理才能逐步理解这些概念的含义,并且相对灵活的运用到工作中.下面针对这些概念来系统地梳理 ...

  5. 从上百幅架构图中学得半点大型网站建设经验(上)

    近段时间以来,通过接触有关海量数据处理和搜索引擎的诸多技术,常常见识到不少精妙绝伦的架构图.除了每每感叹于每幅图表面上的绘制的精细之外,更为架构图背后所隐藏的设计思想所叹服.个人这两天一直在搜集各大型 ...

  6. 电网调度计算机系统目前有三种,电网调度厂站端调试员高级工技能鉴定试题整理(包括图).doc...

    电网调度厂站端调试员高级工技能鉴定试题整理(包括图).doc 技能鉴定试题库(高级) 一.选择题: 1.8251有(C)8位I/O口 A.2个: B.16个; C.4个: D.5个. 2.在WIN98 ...

  7. Oracle 18c体系架构图创作之路 - 设计者说(精品海报大放送)

    编辑说明:在刚刚落幕的第八届数据技术嘉年华大会现场,我们正式发布了『Oracle 18c体系架构图』,应广大网友的呼吁,特别向不能到场的朋友放送. (回顾嘉年华:云数据库时代:企业数据架构的云化智能重 ...

  8. 技术文档中的各种架构图该怎么画? by彭文华

    这是彭文华的第173篇原创 哎呀妈呀,现在催稿群里的要求越来越高了啊!你看看这哥们的要求,太难了好吗??? 不过这还真是系统架构师该干的事情.话说我最近写的东西的确有些偏了,我认真反省,坚决改正!感谢 ...

  9. 人人都在说的数据中台是什么?附9张架构图优质模板!

    数据中台的概念由阿里巴巴首次提出,它的目的是将企业沉睡的数据变成数据资产,从而实现数据价值变现的系统和机制.本文从什么是数据中台.数据中台的价值.数据中台必备的能力和一些优质的数据中台的架构图模板来展 ...

  10. 数据中台是什么?附9张架构图优质模板

    数据中台的概念由阿里巴巴首次提出,它的目的是将企业沉睡的数据变成数据资产,从而实现数据价值变现的系统和机制.本文小编从什么是数据中台.数据中台的价值.数据中台必备的能力和一些优质的数据中台的架构图模板 ...

最新文章

  1. python函数编程-偏函数partial function
  2. UNITY引擎变量调用产生不必要内存分配
  3. MySQL查询的性能优化
  4. Redis哈希数详解
  5. webinf目录下的没有什么_为什么你的减肥没有效果? 来看下这些习惯是否中招...
  6. 软件测试 学习之路 linux基础命令 (二)
  7. vc++图形编程基础
  8. php等待参数跳转,Thinkphp页面跳转设置跳转等待时间的操作
  9. 查询数据总数_Web | Django 与数据库交互,你需要知道的 9 个技巧
  10. sm2和sm4加密算法浅析
  11. Android硬件加速
  12. 3分钟为你的应用添加声波通讯功能
  13. springBoot 报警告 Could not find acceptable represent
  14. Python函数命名-PEP8编码规范的说明及IDE提示的忽略
  15. 饱和蒸汽比容计算、 温压补偿系数计算
  16. 获取京东pt_key(cookie)的方法 -- 文末有自动获取cookie的视频
  17. python 用pandas读取excel并画图
  18. 液晶屏背光板的分类及知识点
  19. LiveQing流媒体服务无插件直播
  20. 红外控制Windows音量by python

热门文章

  1. Java知识系统回顾整理01基础03变量03字面值
  2. javascript举例介绍事件委托的典型使用场景
  3. [原创]django+ldap+memcache实现单点登录+统一认证
  4. Youtube最佳Red5 官方视频下载指南,字幕【亲测成功】
  5. leetcode 100.Same Tree
  6. SVN使用import导入新数据到版本库
  7. JavaEE实战班第18天
  8. 一文看懂用Python读取Excel数据
  9. 最近都在谈的「私域流量」,究竟有没有前途?
  10. python importlib_学习python importlib的导入机制