你有没有碰到过OpenStack中,VM失去IP地址的问题?如果有的话,你知道那可能是什么问题
——特别是如果你拥有大量的节点和VM。你的客户会因为没有明显原因却断了与VM的连接而感到 挫败。甚至云的支持团队会为log文件里没有提示却出现问题感到挫败。

听起来很熟悉?

在这篇blog里,我将会分享我的一些关于Openstack网络的经验,特别是承担为VM分配IP地址的责任的DHCP子组件。

为什么我们会把问题归咎于DHCP组件?因为这些特定的问通常都是由这个小但明显微不足道的OpenStack组件导致的。
**
DHCP agent和DNSmasq **

在OpenStack中,neutron-dhcp-agent为实例提供ip地址。理论上,neutron-dhcp-agent可以支持多种

后端,但现在它只支持dnsmasq。当启动一个实例时,分配和配置(ip)的程序包含一个在dnsmasq config中储存ip地址的进程,接着启动或重载dnsmasq。通常,OpenStack在每个网络中只有一个neutron-dhcp-agent负责spawn一个dnsmasq,所以一个庞大的网络(包含所有子网)中只会有一个dnsmasq提供服务。理论上,并且根据实用的实验室测试,dnsmasq应该能每秒处理1000个DHCP请求,但这里有些事实要说明下:

1.租赁时间。默认情况下是120s,你大概会知道,在租赁时间内,dhcp客户端会尝试中途延长租赁时间。这意味着每个VM会一分钟更新一次他们的ip地址。

2.去启动一个包含65535个静态租赁的DNSmasq实例几乎需要4分钟(3分43秒)。一般这会发生在neutron为新的VM分配新的ip地址,接着强行reload DNSmasq时。在此时,将没有DHCP服务会为相应的私有Neutron网络提供服务。

3.如果你没有在dnsmasq的配置中使用no-ping选项——这是应归于对安全担忧的OpenStack的默认设置——你会因非常慢的服务速度感到痛苦,因为在dnsmasq中,一个分开的pinger进程会被用于检查所提供的ip地址是否已经在使用中。包含no-ping选项,dnsmasq将能在10分钟内为160个请求提供服务并且不会失去它们,尽管这依赖于核心(core)速度和CPU速度。

4.Ubuntu和CentOS有mac地址表(neighbour table)被限制到/128/512/1024(net.ipv4.neigh.default.gc_thresh1/2/3)个记录。因为如此,不经常使用的 IP 记录将会异常快速老化(IP records that are not frequently used will age abnormally fast)这会影响网络性能并拖慢系统把流量发送至dhcp agent所在节点上的正确的mac地址的能力。

5.企图通过显著的增加ip的租赁时间去解决这些性能问题,这会导致neutron释放ip地址这方面的大问题(如果你的云负载均衡地改变)。默认情况下,neutron会为一个VM分配一个ip地址达24小时(neutron will allocate an IP address to a VM for 24 hours),独立于实际的租赁时间。当然,默认情况下,neutron不会为已经终止了的实例提供ip地址直至24小时。

你可以采取的措施
幸运的是,你可以做点事解决问题,如果你使用openstack并拥有一个地址空间大于255个地址(/24)的私有网络,
接着你应该考虑调整dnsmasq和network节点自身的默认参数。

1.增加ip的租赁时间以减少每秒来自VM的尝试更新ip地址的请求数量。根据一般的场景计算新的租赁时间,
记住虚拟机生命周期的平均时间。由于一个Bug,设置太大的租赁时间值会强迫OpenStack在数据库中保留这个ip地址为“used”的状态。即使VM已经被删除,因为neutron的租赁时间在数据库中,neutron将不会释放这个ip地址。

2.增加MAC地址表的尺寸使其能服务至少一千个主机。要做到这样,典型地,你可以设置dhcp-agent所在主机
的sysctl变量(通常在/etc/sysctl.conf)。视情况,你可以在所有与网络有关的节点执行以下操作,这些变量
如此设置:

net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192

3.为DNSmasq的默认参数加上no-ping选项。这个改变能够使其每秒处理多10-20个请求,因为在被实际分配之前,dnsmasq无需再尝试ping那些ip。如果你使用OpenStack作为你的基础设施的一部分,记住,你必须谨慎地考虑这个选项。比如,如果你正使用提供者网络(provider networks)并且你的VM与其他物理服务器、设备、等等是单一L2域的组成部分,IP冲突是可能发生的的,可以造成严重破坏。
Neutron社区必须思考的改变

不幸地,在neutron中没有任何办法能为用户解决24小时ip分配的问题(the problem of 24 hour IP allocation),这个问题应该从neutron自身的改变去解决。一个简单的解决方法是在neutron或dhcp-agent中增加一个可配置的参数以修改租赁时间,并把它用作neutron数据库中的分配周期。这个方法表面看上去很完美但是仔细检查一下,你会意识到这会大大增加neutron-api/neutron-db的负载。所以这不是一个正确或不正确的方法去解决问题。

取而代之的是,neutron应该在实例被终止时简单地从数据库中移除ip地址。这会解决所有问题并在云上实现
动态负载和ip地址的完美重用。【实际上,这恰好是Icehouse版本的情况,尽管目前问题有所减轻】

结论

正如我说的,我的所述只是覆盖了一个很小的OpenStack网络的子组件——DHCP服务。正如你所看到的, 如果配置不正确,特别是当你使用了DNSmasq的默认选项将会导致许多痛苦。上面我所推荐的希望能帮助你 了解如何选择具体的DNSmasq选项和如何根据情况调整他们

改善OpenStack上DHCP的性能 【已翻译100%】相关推荐

  1. ASP.NET MVC 的 WebGrid 的 6 个重要技巧 【已翻译100%】

    ASP.NET MVC 中 WebGrid 的 6 个重要技巧 https://www.oschina.net/translate/webgrid-in-asp-net-mvc-important-t ...

  2. 从 C++ 到 Objective-C 的快速指南 【已翻译100%】

    **简介 ** 当我开始为iOS写代码的时候,我意识到,作为一个C++开发者,我必须花费更多的时间来弄清楚Objective-C中怪异的东西.这就是一个帮助C++专家的快速指南,能够使他们快速的掌握A ...

  3. 开发原生的 Google 眼镜应用 【已翻译100%】(2/2)

    使用传感器 Glass没有键盘或触摸屏,但仍然具有移动设备所有的标准的传感器.你可以使用标准的传感器组件来访问这些传感器. 定位和GPS Glass内置有GPS.TLocationSensor具有一个 ...

  4. 编程语言python这个词怎么翻译_五大理由从 Python 转到 Go 语言【已翻译100%】...

    #3 优化 令人惊讶的是,在大多数的应用场景中,Go 语言比 Python(版本2或3)更快.Benchmarking Game 中可以看到对比的结果,当然这是不公平的,这依赖于应用类型和用户用例. ...

  5. 开发原生的 Google 眼镜应用 【已翻译100%】(1/2)

    与谷歌眼镜打交道时,在开发者预览版本 或 先睹为快状态版本里,谷歌有两个可用的API / SDK.第一个是谷歌眼镜的 Mirror API,这是一个基于RESTful接口,从远程服务器发送卡片到谷歌眼 ...

  6. 微服务最佳实践 【已翻译100%】

    在我还不知道什么叫微服务架构的时候我就使用过它.以前,我写了一些管道程序(pipeline application),它由一些相互和队列交互的模块构成.自那之后,一批ThoughtWorks的专家也讨 ...

  7. java 翻译 go语言_cgo 和 Go 语言是两码事【已翻译100%】...

    cgo不是Go 借用 JWZ的一句话 有些人,当他们面临一个问题时,认为"我知道,我会使用 cgo ".那么现在,他们有了两个问题. 最近有人在 Gopher 的 Slack Ch ...

  8. 并发编程下的性能定律(翻译)

    并发编程下的性能定律(翻译) 理解Amdahl定律 如果你想利用多核的优势在尽可能少的时间运行尽可能多的指令,那么就需要以并行的序列分离代码.然而,大多的算法需要运行一些串行代码来调整并行执行.例如, ...

  9. stackoverflow上Java相关回答整理翻译

    原文链接:https://github.com/giantray/stackoverflow-java-top-qa stackoverflow-Java-top-qa 对stackoverflow上 ...

最新文章

  1. Fedora 安装WIN字体(如 宋体)
  2. 用JSP实现基于Web的RSS阅读器
  3. 分布式离线计算—MapReduce—为什么被淘汰了?
  4. python字符串大全_python学习笔记:字符串操作大全
  5. 三种嵌入式操作系统的分析与比析
  6. 二元相图软件_Materials Studio 领先的材料模拟软件
  7. Linux 下 Oracle 内核参数优化
  8. Git 历史记录内容对比
  9. Django之数据表增删改查
  10. Moddable SDK为物联网开发提供JavaScript引擎:不到32KB
  11. 【2021ACL】NLP的应用
  12. 用视频录制软件Captura学习网课
  13. qnap raid5升级raid6_实践出真知!100TB的RAID5到底能否重建成功?
  14. CodeForces - 1144C Two Shuffled Sequences【优先队列】
  15. springboot2整合二维码 生成二维码图片及输出web端及打印
  16. 使用certbot工具制作免费https证书
  17. Dumpling 导出表内并发优化丨TiDB 工具分享
  18. hdu 4745 区间dp
  19. mybatis按姓名或手机号搜索
  20. 年薪百万的好苗头!不俗套的情人节,爱之丘比特走心了

热门文章

  1. VMware 如何通过现有虚拟机克隆新的虚拟机
  2. springboot:spring.profiles.active
  3. C九:free与malloc
  4. ReactOS 0.0.21从开机启动,到加载驱动的过程
  5. SQL Server Extended Events (扩展事件)
  6. 使用 Xtrabackup 在线对MySQL做主从复制
  7. 手动安装K8s第六节:node节点部署-kubelet
  8. springboot @ConfigurationProperties
  9. ASP.NET中AJAX的UpdatePannel控件的用法
  10. vsphere中虚机的cpu热插拔和内存热添加