假设我们正在为一个产品使用微服务架构,并决定采用“每个服务一个数据库”模型,并在像AWS这样的提供者的云服务器上部署。
在开发和测试环境中,将数据库作为容器运行非常方便。
但是,在生产环境中是否可以实现相同的操作?如果可以,那么它有多安全呢? 还是应该选择AWS RDS-DB这样的云解决方案!
但是,在生产环境中是否可以实现相同的操作?如果可以,那么它有多安全呢? 还是应该选择AWS RDS-DB这样的云解决方案!
这篇博客文章列出了一些原因,说明为什么不应该在容器中运行生产数据库。它还引用了另一篇博客文章,描述了更新docker和不稳定存储驱动程序的问题。
对我而言,这里的主要观点可以归结为以下几点:
不稳定的存储驱动程序。当您将数据库状态写入主机系统时,这可能不是一个大问题,但例如Docker明确鼓励用户使用卷来实现这一点(请参见文档:引用:“卷是在Docker中持久保存数据的最佳方法”)。在正常情况下可能会完美地工作,但在像断电或读取错误等特殊情况下怎么办?
在生产环境中管理数据库很难。许多公司雇用全职DBA以确保生产数据库的平稳运行。DevOps范式(每个开发人员在容器中创建大量的DB服务器)使得DBA几乎无法完成工作,除非DBA甚至可以访问这些DB。
总之:容器适用于某些任务,但对于其他任务则是一个不好的想法。在容器中运行生产数据库就是其中的一个不好的想法。
由于您正在使用数据库每个服务模型来进行微服务,因此在生产中,完美的解决方案可以是AWS RDS实例用于数据库,现在您有两种方法:
您可以创建单个RDS实例,并可以在同一RDS实例上为不同的服务拥有不同的数据库,这将节省很多成本,但您需要注意基于数据库的连接和负载,根据这些选择RDS实例类型,如4xlarge等,实例类型越好,它提供的连接越多,可以更有效地处理更多的数据库负载。
第二种解决方案可以创建多个RDS实例,RDS实例的数量将等于您的微服务计数,因为每个服务将独立使用一个RDS实例进行其数据库,这不是有效的解决方案,它将产生很多成本,并且此解决方案将未充分利用AWS RDS实例。