微服务和数据库

3
什么是在微服务架构中部署数据库的最佳实践,更准确地说,在分布式环境下,例如docker swarm?微服务原则指出,为了实现可扩展性,每个服务都应该是无状态的。由于数据库显然具有状态,因此它应该位于集群外的固定位置上,在集群初始化之前部署和配置吗?
我感到困惑,因为所有的docker compose示例都包括在服务定义中的数据库容器。但事情并不那么简单。通常需要对数据库进行大量配置,使其准备好使用。此外,docker在协调服务启动顺序方面表现不佳。
如果在docker swarm中与服务一起部署数据库确实是一个好的实践,如何确保关键数据的一致性和持久性?
1个回答

1
这是一个好问题,我认为很多人仍在思考最佳实践。答案取决于您的需求。有几种方法可以解决这个问题,但这是我现在正在使用的两种方法:
- 在专用机器上运行数据库,进行复制等操作。 - 我目前正在尝试在Docker Swarm集群上将数据库作为服务运行,并使用GlusterFS在整个集群中持久化数据。
- 我在集群中标记了三台机器作为数据库机器。 - 这些数据库机器都运行一个GlusterFS容器,提供GlusterFS功能。
- 当启动数据库服务时,我将GlusterFS共享映射到容器中,并指定服务只应在标记为数据库节点的机器上运行。通过这种设置,无论数据库服务在哪个节点上启动,如果一台机器失败,数据库服务会自动迁移到另一台标记为数据库节点的机器上。 GlusterFS对数据的复制确保了持久化数据的完整性。
正如我所提到的,据我了解,仍然有很多关于此方面的实验,'最佳实践'并没有完全确定下来。这些最佳实践将最终取决于您的需求和风险容忍度。

使用glusterFS和数据库的最大问题在于网络流量和gluster的最大容量问题。去年,我为一个包含日志的PHP应用程序使用了gluster分布式数据存储。事实上,我们达到了一个点,仅从分布式读写日志的负载就频繁地使gluster超载。 - Dockstar
@Dockstar,同意并感谢您发布您的经验。这就是为什么我现在正在测试它的原因。您是如何配置您的GlusterFS的?分布式?条带化,分布式+条带化,复制,复制+分发? - Chris Townsend
1
我们的是条带化而不是复制,因为我们有多个端点。老实说,除非你有专用的Flash(不是磁盘,而是闪存卡),否则我看不到IO能够以同样的速度条带化数据以及复制。我一直在寻找的是一种自动服务发现的方法,用于活动的Galera集群。将在数据库级别而不是存储级别进行复制,但即使如此,你仍然会一遍又一遍地命中相同的块。 - Dockstar
@Dockstar,这听起来像是值得探究的另一种方式。您在什么大小的数据库和日志文件中开始注意到性能问题?您的GlusterFS设置中的网络环境如何? - Chris Townsend
在我们的环境中,数据库实际上是它们自己的服务器。这些只是应用程序日志。我们有22个队列运行器通过生成大约100MB的日志来运行作业。问题出现在您有8个主机以这种方式分带时。为了跟上它所需的读写数量之多,导致Gluster失败,因此我们大大减少了应用程序日志记录,并决定不朝这个方向发展。如果你将一个数据库扔进去,那就取决于你的负载和复制策略。 - Dockstar
@ChrisTownsend 当涉及到多个无状态冗余微服务时,您的方法是什么?它们是否应该使用相同的数据库模式,还是应该拥有自己的模式?在后一种情况下,冗余服务之间可能存在不一致性,对吧?另一个挑战是模式/滚动升级。通常如何处理? - TechEnthusiast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接