我是从应用程序开发的角度(我的日常工作)而不是基础设施或运营的角度出发的,所以如果这是一个完全无聊的问题,请告诉我!
我们的应用服务器前面有代理,这通常对我们很有用。此(硬件/软件)代理提供了一个抽象端点(除了其他服务,例如负载平衡/分发),以便我们的客户始终知道如何连接。
有没有人有在应用程序服务器和数据库之间放置代理的经验?
似乎必须有人这样做,特别是在托管服务提供商或云空间中,但当我与我们的(企业)基础设施团队交谈时,他们只是说“不”,尽管我仍然很难理解为什么。
我不明白这是否是由于数据库前面的额外抽象层而导致的功能或性能问题,或者只是使得在出现问题时更难排除故障。
有人能分享这方面的想法、经验或资源吗?我将不胜感激!
谢谢!
是
答案1
我也喜欢 TomTom 的 DNS 理念。TTL 较短,这比你想象的要简单。
但您当然可以在数据库前运行代理。例如,SQLProxy 和 HAProxy 可以做到这一点。但同样,如果您关心的不是负载平衡或分离读写,为什么要增加这种额外的延迟(往返于代理),而您只需使用 CNAME 即可做到这一点——我认为您的 Ops/Systems 人员会考虑这个论点。
答案2
我知道这是一个老问题,但目前至少有几个不错的数据库代理产品可供选择。也就是说,如果您使用的是 MariaDB 或 MySQL:
我只使用过 MaxScale,目前我觉得我可以推荐它。MaxScale 在 Galera 集群等场合下运行良好。它需要一段时间才能成熟,也许是因为它是一个从零开始开发的相对较新的概念,而且它正在解决一些不平凡的问题。
值得注意的是,MaxScale 有一个特殊的非开源许可证 - BSL。(另一方面,ProxySQL 是在 GPL 下获得许可的。)
我还可以提一下HAProxy它不是一个数据库感知代理,但仍然被广泛用作 MariaDB/MySQL 和 PostgreSQL 的数据库代理。
答案3
主要问题:
应用服务器和后端之间的数据库连接更加持久 - 因此通过它们实现负载平衡很困难。
代理必须遵循协议。那里有大量的 HTTP 代理。尝试获取一个例如 SQL Server 协议。不需要,没有市场 - 没有产品。
最后,尽管 SQL Server 是这样的,但缓存是不可能的。没有使结果无效的协议等,缓存也不是任何 SQL 实现的一部分。没有“如果自此修改”标签。因此,您要么一无所获,要么处理过时的数据 - 这两种情况在该层上都是不可接受的。