点击上方蓝色“小哈学Java”,选择“设为星标”
回复“资源”获取独家整理的学习资料!
原文:(2)跑轻量级或分布式数据库
Docker里部署轻量级或分布式数据库,Docker本身就推荐服务挂掉,自动启动新容器,而不是继续重启容器服务。
(3)合理布局应用
对于IO要求比较高的应用或者服务,将数据库部署在物理机或者KVM中比较合适。目前TX云的TDSQL和阿里的Oceanbase都是直接部署在物理机器,而非Docker。
要理解Docker网络,您必须对网络虚拟化有深入的了解。也必须准备应付好意外情况。你可能需要在没有支持或没有额外工具的情况下,进行bug修复。
我们知道:数据库需要专用的和持久的吞吐量,以实现更高的负载。我们还知道容器是虚拟机管理程序和主机虚拟机背后的一个隔离层。然而网络对于数据库复制是至关重要的,其中需要主从数据库间24/7的稳定连接。未解决的Docker网络问题在1.9版本依然没有得到解决。
把这些问题放在一起,容器化使数据库容器很难管理。我知道你是一个顶级的工程师,什么问题都可以得到解决。但是,你需要花多少时间解决Docker网络问题?将数据库放在专用环境不会更好吗?节省时间来专注于真正重要的业务目标。
4、状态在Docker中打包无状态服务是很酷的,可以实现编排容器并解决单点故障问题。但是数据库呢?将数据库放在同一个环境中,它将会是有状态的,并使系统故障的范围更大。下次您的应用程序实例或应用程序崩溃,可能会影响数据库。
知识点在Docker中水平伸缩只能用于无状态计算服务,而不是数据库。
Docker快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在Docker里面,如果Docker中安装数据库,存储服务需要单独提供。
目前,TX云的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都直接运行中在物理机器上,并非使用便于管理的Docker上。
5、资源隔离资源隔离方面,Docker确实不如虚拟机KVM,Docker是利用Cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。如果其他应用过渡占用物理机资源,将会影响容器里MySQL的读写效率。
需要的隔离级别越多,获得的资源开销就越多。相比专用环境而言,容易水平伸缩是Docker的一大优势。然而在Docker中水平伸缩只能用于无状态计算服务,数据库并不适用。
我们没有看到任何针对数据库的隔离功能,那为什么我们应该把它放在容器中呢?
6、云平台的不适用性大部分人通过共有云开始项目。云简化了虚拟机操作和替换的复杂性,因此不需要在夜间或周末没有人工作时间来测试新的硬件环境。当我们可以迅速启动一个实例的时候,为什么我们需要担心这个实例运行的环境?
这就是为什么我们向云提供商支付很多费用的原因。当我们为实例放置数据库容器时,上面说的这些便利性就不存在了。因为数据不匹配,新实例不会与现有的实例兼容,如果要限制实例使用单机服务,应该让DB使用非容器化环境,我们仅仅需要为计算服务层保留弹性扩展的能力。
7、运行数据库的环境需求常看到DBMS容器和其他服务运行在同一主机上。然而这些服务对硬件要求是非常不同的。
数据库(特别是关系型数据库)对IO的要求较高。一般数据库引擎为了避免并发资源竞争而使用专用环境。如果将你的数据库放在容器中,那么将浪费你的项目的资源。因为你需要为该实例配置大量额外的资源。在公有云,当你需要34G内存时,你启动的实例却必须开64G内存。在实践中,这些资源并未完全使用。
怎么解决?您可以分层设计,并使用固定资源来启动不同层次的多个实例。水平伸缩总是比垂直伸缩更好。
总结针对上面问题是不是说数据库一定不要部署在容器里吗?
答案是:并不是
我们可以把数据丢失不敏感的业务(搜索、埋点)就可以数据化,利用数据库分片来来增加实例数,从而增加吞吐量。
docker适合跑轻量级或分布式数据库,当docker服务挂掉,会自动启动新容器,而不是继续重启容器服务。
数据库利用中间件和容器化系统能够自动伸缩、容灾、切换、自带多个节点,也是可以进行容器化的。
END
有热门推荐??
1.NullPointerException的处理新方式,Java14真的太香了!
2.谈谈前后端分离实践中如何提升RESTfulAPI开发效率
3.ServiceMesh和APIGateway关系深度探讨
4.干掉xxl-job:elastic-job王者归来?
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,