本文分享了唯品会数据库Docker的异地容灾项目实践经验,项目中针对用户数据库的异地恢复场景的需求进行开发和测试,整合了网络,存储、调度、监控,镜像等多个模块。在实施完成后,从技术上总结关于选型、开发、踩坑、测试等方面的经验。
项目背景数据库Docker的异地备份恢复容灾项目,针对用户数据库的异地备份恢复场景的需求进行开发和测试,整合了容器网络、存储、调度、监控、镜像等多个模块。同时针对数据库的日常运维工作开发了监控、资源调度、日志、Puppet自动推送等工具。
通过Docker天生隔离性和快速部署等特点,实现在单台物理机上运行多个数据库备份/恢复实例,大大提高服务器使用率,节省大量成本。通过对Docker本身和相关组件的研究和改造,从普通开源产品落地到公司内部生产环境,积累宝贵的开发经验。通过对Docker已经在其上层运行的数据库日常运维和监控,也积累宝贵的Docker运维经验,为更大规模推广容器提供基础。
关于容器技术通过实践,证明容器技术在易用性,可管理性,快速部署具备天然的优势。在资源利用率方面,容器部署在上百个物理节点上,提供约500多个数据库灾备实例,提升了硬件资源的利用率,节约了约400台物理机的采购成本。这些是容器技术带来的实实在在收益。在资源分配与隔离方面,又不输于虚拟机。CPU、内存、磁盘IO、网络IO限流等技术的应用,保证了资源的合理使用,从机制上阻止了单一实例的资源过分消耗的问题。
稳定性是使用容器技术非常关注的一个点,也是基石。MySQL备份/恢复属于CPU密集 + 磁盘IO密集 + 网络IO密集型业务,对于Docker daemon是个较大的考验。就目前来看,限制每台宿主机的容器数量(5个左右)的情况下,集群跑了三个多月没有出现因为容器负载过大导致的crash现象,还是值得信赖的。遇到的唯一相关问题是Docker daemon挂死,具体现象是docker info、docker ps没有响应,docker volume、docker images 正常,下面的容器运行正常。这是偶发事件,无法重现,以后需要继续观察。
由于容器以进程方式存在,体现出几乎与物理机上相当的性能,Overheads极低(低于10%)。从数据抽取任务的结果来看,与物理机相比,使用容器对成功率没有影响,效率也差不多。这也很符合最初预想,不管跑容器还是外部服务从物理机角度来说它们之间是没有什么区别的,都是一个进程,唯一不同是父进程不一样而已。
以上是容器“RUN”带来的好处,通过统一开发流程,应用微服务化,CI/CD等方面的改进,能够进一步利用容器“BUILD”、“SHIP” 优势,容器技术还来的潜力是巨大的。要说容器技术的缺点,还真的不明显。硬要提的话一个是需要一定的学习成本,改变开发流程与方式,一个是开发人员对容器技术的接受程度。这个项目仅用了不到二百人/天,对于一个采用新技术的项目来说,真的是很低的了。一开始我们也担心因为采用新技术导致开发推广有困难,后来实际能通过技术上解决问题,打消了大部分用户对使用Docker的疑虑,反而有助于该技术的普遍应用。
关于Docker daemon版本的选择,我们之前是有过一些讨论的。现在Docker社区非常活跃,当时我们用1.10.3, 到现在已经出了两个新版本了。在功能满足的前提下,稳定性是第一考量。Docker自1.9.0引入CNM网络模型,1.10算是比较成熟。CNM是我们希望在这个项目尝试的一部分。网络与Volume插件功能与稳定性的提升,开始支持磁盘IO读写限速,Device Mapper的支持,等等,都是选择了这个版本的原因。另外,Docker插件的引入,很好地解耦了Docker与底层模块的关系,使我们可以专注于底层(网络、存储)实现而不需要修改Docker daemon本身,同时避免产生升级依赖。
关于容器网络技术容器网络基础设施使用的是Contiv Netplugin,这是来自思科的开源方案。Netplugin以网络插件的形式接入Docker daemon,网络功能作为容器生命周期的一部分被调用。Netpluign通过管理OVS,基于OVS VLAN作隔离,容器分配外网IP,可以直接访问,大大简化了容器访问的方式。考虑使用该方案的原因在于:1. 插件形式不会对Docker产生升级依赖。2. Open vSwitch也是业界SDN的事实标准,希望籍此为容器带来各种网络SDN的能力,例如限速,QoS访问控制。事实证明,只在容器创建与删除过程中调用到Netplugin,运行中的容器所有流量只经过Open vSwitch,不依赖Netplugin,它即使挂了容器也能正常访问,这个机制对网络的可靠性是好的一方面。OVS在之前一年半的OpenStack实践中,已经证明是非常稳定的,OVS桥使用带宽为1G的Uplink,与物理机相比只有不到5%的损耗。
Netplugin原方案是有流表的,每新增一个容器都会加一条flow,而且所有节点都添加,容器一多的话这个表的大小是不可想像的。我们把该功能去掉,以降低复杂度,提高稳定性。另外,引入了OVS rate-limit功能,把容器流控也做了,能够根据情况实时的调整每个容器的可用带宽。项目中Netplugin管理的IP地址池有三个,很好地支持了500+容器的运行。
为了防止同一个二层广播域容器增长,导致路由器arp表过快增长的的问题,在大规模部署中,需要在Netplugin增加ARP Proxy功能。
Netplugin很多优秀的功能例如VXLAN、多租户、访问控制我们都没有用到。虽然社区在不断成长,但代码还没完全成熟。也遇到过一些bug,比如容器异常退出IP地址不能释放的问题,这都需要我们自己去解决。我们的做法是基于某一版本,吃透代码,只用基本功能,经过充分测试,边测边改,逐渐扩大上线规模。
项目背景数据库Docker的异地备份恢复容灾项目,针对用户数据库的异地备份恢复场景的需求进行开发和测试,整合了容器网络、存储、调度、监控、镜像等多个模块。同时针对数据库的日常运维工作开发了监控、资源调度、日志、Puppet自动推送等工具。
通过Docker天生隔离性和快速部署等特点,实现在单台物理机上运行多个数据库备份/恢复实例,大大提高服务器使用率,节省大量成本。通过对Docker本身和相关组件的研究和改造,从普通开源产品落地到公司内部生产环境,积累宝贵的开发经验。通过对Docker已经在其上层运行的数据库日常运维和监控,也积累宝贵的Docker运维经验,为更大规模推广容器提供基础。
关于容器技术通过实践,证明容器技术在易用性,可管理性,快速部署具备天然的优势。在资源利用率方面,容器部署在上百个物理节点上,提供约500多个数据库灾备实例,提升了硬件资源的利用率,节约了约400台物理机的采购成本。这些是容器技术带来的实实在在收益。在资源分配与隔离方面,又不输于虚拟机。CPU、内存、磁盘IO、网络IO限流等技术的应用,保证了资源的合理使用,从机制上阻止了单一实例的资源过分消耗的问题。
稳定性是使用容器技术非常关注的一个点,也是基石。MySQL备份/恢复属于CPU密集 + 磁盘IO密集 + 网络IO密集型业务,对于Docker daemon是个较大的考验。就目前来看,限制每台宿主机的容器数量(5个左右)的情况下,集群跑了三个多月没有出现因为容器负载过大导致的crash现象,还是值得信赖的。遇到的唯一相关问题是Docker daemon挂死,具体现象是docker info、docker ps没有响应,docker volume、docker images 正常,下面的容器运行正常。这是偶发事件,无法重现,以后需要继续观察。
由于容器以进程方式存在,体现出几乎与物理机上相当的性能,Overheads极低(低于10%)。从数据抽取任务的结果来看,与物理机相比,使用容器对成功率没有影响,效率也差不多。这也很符合最初预想,不管跑容器还是外部服务从物理机角度来说它们之间是没有什么区别的,都是一个进程,唯一不同是父进程不一样而已。
以上是容器“RUN”带来的好处,通过统一开发流程,应用微服务化,CI/CD等方面的改进,能够进一步利用容器“BUILD”、“SHIP” 优势,容器技术还来的潜力是巨大的。要说容器技术的缺点,还真的不明显。硬要提的话一个是需要一定的学习成本,改变开发流程与方式,一个是开发人员对容器技术的接受程度。这个项目仅用了不到二百人/天,对于一个采用新技术的项目来说,真的是很低的了。一开始我们也担心因为采用新技术导致开发推广有困难,后来实际能通过技术上解决问题,打消了大部分用户对使用Docker的疑虑,反而有助于该技术的普遍应用。
关于Docker daemon版本的选择,我们之前是有过一些讨论的。现在Docker社区非常活跃,当时我们用1.10.3, 到现在已经出了两个新版本了。在功能满足的前提下,稳定性是第一考量。Docker自1.9.0引入CNM网络模型,1.10算是比较成熟。CNM是我们希望在这个项目尝试的一部分。网络与Volume插件功能与稳定性的提升,开始支持磁盘IO读写限速,Device Mapper的支持,等等,都是选择了这个版本的原因。另外,Docker插件的引入,很好地解耦了Docker与底层模块的关系,使我们可以专注于底层(网络、存储)实现而不需要修改Docker daemon本身,同时避免产生升级依赖。
关于容器网络技术容器网络基础设施使用的是Contiv Netplugin,这是来自思科的开源方案。Netplugin以网络插件的形式接入Docker daemon,网络功能作为容器生命周期的一部分被调用。Netpluign通过管理OVS,基于OVS VLAN作隔离,容器分配外网IP,可以直接访问,大大简化了容器访问的方式。考虑使用该方案的原因在于:1. 插件形式不会对Docker产生升级依赖。2. Open vSwitch也是业界SDN的事实标准,希望籍此为容器带来各种网络SDN的能力,例如限速,QoS访问控制。事实证明,只在容器创建与删除过程中调用到Netplugin,运行中的容器所有流量只经过Open vSwitch,不依赖Netplugin,它即使挂了容器也能正常访问,这个机制对网络的可靠性是好的一方面。OVS在之前一年半的OpenStack实践中,已经证明是非常稳定的,OVS桥使用带宽为1G的Uplink,与物理机相比只有不到5%的损耗。
Netplugin原方案是有流表的,每新增一个容器都会加一条flow,而且所有节点都添加,容器一多的话这个表的大小是不可想像的。我们把该功能去掉,以降低复杂度,提高稳定性。另外,引入了OVS rate-limit功能,把容器流控也做了,能够根据情况实时的调整每个容器的可用带宽。项目中Netplugin管理的IP地址池有三个,很好地支持了500+容器的运行。
为了防止同一个二层广播域容器增长,导致路由器arp表过快增长的的问题,在大规模部署中,需要在Netplugin增加ARP Proxy功能。
Netplugin很多优秀的功能例如VXLAN、多租户、访问控制我们都没有用到。虽然社区在不断成长,但代码还没完全成熟。也遇到过一些bug,比如容器异常退出IP地址不能释放的问题,这都需要我们自己去解决。我们的做法是基于某一版本,吃透代码,只用基本功能,经过充分测试,边测边改,逐渐扩大上线规模。
http://gulu076.weebly.com/
http://gulu076.weebly.com/
http://erhrthj.weebly.com/
http://rujeryjtyj.weebly.com/
http://rheerfhbfdb.weebly.com/
http://fjmfmjgh.weebly.com/
http://fndfbfb.weebly.com/
http://dbgfng.weebly.com/
http://ccccccccsdv.weebly.com/
http://dfbdfbfbds.weebly.com/
http://sdbdfbdsv.weebly.com/
http://aogaifei38924.weebly.com/
http://sdbhrfdb.weebly.com/
http://hrtgjghjn.weebly.com/
http://vfsdvdfb.weebly.com/
http://sdgdbvgb.weebly.com/
http://rtyiki14.weebly.com/
http://sfdhgfn.weebly.com/
http://fdfdfn.weebly.com/
http://fbfdfdvv.weebly.com/
http://haozhongmeyi7.weebly.com/
http://fddfhfgh.weebly.com/
http://dsgrhfdf.weebly.com/
http://dvsdbdf.weebly.com/
http://dbdffnfgn.weebly.com/
http://ardedrfhfh.weebly.com/
http://dsvsdvsdvdbb.weebly.com/
http://dsddfbfb.weebly.com/
http://dfbhdfgbngn.weebly.com/
http://sdbdfbfb.weebly.com/
http://dvvvdb.weebly.com/
http://zhang912101.weebly.com/
http://zhang912101.weebly.com/
http://sdsdfbfb.weebly.com/
http://bfdfdf.weebly.com/
http://dbdfbfb.weebly.com/
http://dfgdfhfdvvv.weebly.com/
http://bfdbdfbfb.weebly.com/
http://dsssdfbdfb.weebly.com/
http://fdgfdffvv.weebly.com/
http://djykuk.weebly.com/
http://fnhyju.weebly.com/
http://163comdg.weebly.com/
http://aetuyjuj.weebly.com/
http://gulu076.weebly.com/
http://erhrthj.weebly.com/
http://rujeryjtyj.weebly.com/
http://rheerfhbfdb.weebly.com/
http://fjmfmjgh.weebly.com/
http://fndfbfb.weebly.com/
http://dbgfng.weebly.com/
http://ccccccccsdv.weebly.com/
http://dfbdfbfbds.weebly.com/
http://sdbdfbdsv.weebly.com/
http://aogaifei38924.weebly.com/
http://sdbhrfdb.weebly.com/
http://hrtgjghjn.weebly.com/
http://vfsdvdfb.weebly.com/
http://sdgdbvgb.weebly.com/
http://rtyiki14.weebly.com/
http://sfdhgfn.weebly.com/
http://fdfdfn.weebly.com/
http://fbfdfdvv.weebly.com/
http://haozhongmeyi7.weebly.com/
http://fddfhfgh.weebly.com/
http://dsgrhfdf.weebly.com/
http://dvsdbdf.weebly.com/
http://dbdffnfgn.weebly.com/
http://ardedrfhfh.weebly.com/
http://dsvsdvsdvdbb.weebly.com/
http://dsddfbfb.weebly.com/
http://dfbhdfgbngn.weebly.com/
http://sdbdfbfb.weebly.com/
http://dvvvdb.weebly.com/
http://zhang912101.weebly.com/
http://zhang912101.weebly.com/
http://sdsdfbfb.weebly.com/
http://bfdfdf.weebly.com/
http://dbdfbfb.weebly.com/
http://dfgdfhfdvvv.weebly.com/
http://bfdbdfbfb.weebly.com/
http://dsssdfbdfb.weebly.com/
http://fdgfdffvv.weebly.com/
http://djykuk.weebly.com/
http://fnhyju.weebly.com/
http://163comdg.weebly.com/
http://aetuyjuj.weebly.com/