我正在为一家在各大洲都设有数据中心的全球分散公司设计横向扩展解决方案。超过 10,000 台服务器向洛杉矶的 SQL Server 集群报告,并查询它以执行某些任务。
正当理由
为了从集群、垂直扩展的问题以及由于许多节点之间的全球网络距离到洛杉矶集群而提高性能,我想在特定核心表上使用事务复制到订阅者(单发布多子)作为我的第一步,传播到世界各地。
有待解决的问题
如果出于某种原因数据超过 X 分钟(假设 10 分钟),我希望他们转到发布者(或另一个定义的服务器)并从那里读取它。如果首选实例不可用或过时,我想自动从发布者实例中获取数据。
我不确定执行此操作的最佳方法是什么,尤其是在数据“陈旧”的情况下。我知道我们有复制监控工具,但我如何使用它来了解数据是否过时并强制连接到另一台未过时的服务器?
原因是我担心某些问题需要 10 分钟以上才能解决,在此期间维护和自动配置等关键应用程序将获得过时数据,业务可能会受到很大影响。
可能的解决方案和问题:
将订阅者/发布者置于“只读”负载平衡器中,并让所有查询都去那里。
如果数据库服务器都在同一个数据中心,我可能会使用负载平衡器并将服务器从中拉出来,但这需要手动干预,我希望系统强制所有读取到发布者(或另一个订阅者)并绕过他们连接的订阅者。
但是,这不会解决陈旧数据的问题,例如复制落后并且需要一个小时才能修复。
修改代码以检查未完成的复制查询并相应地进行调整
这将需要对许多查询进行代码修改,而开发人员没有时间这样做,而且这听起来不像是一个非常合理的想法。
如果未复制 X 个查询,则查询复制状态并自动更改连接字符串
我应该能够在 Powershell 中执行此操作,但大多数服务器都是 Linux,因此它们需要一个“应用程序”来查询复制状态,并在未复制命令数量超过 X 时修改它们的连接字符串。
谢谢!我有 1 个 2012 环境和几个 2008 环境,我想在其上实现它,我们的想法是我们将它们全部移动到 2012。企业是一个选项。
其他思考
在洛杉矶有一个负载均衡器,世界会向其发送一个非常快速的小查询,以决定选择哪个服务器实际上可能工作得很好,因为这将是一个小查询,也许请求端可以临时缓存该信息。
似乎我必须让 SQL 或其他数据库引擎将“只读”对吐回应用程序“此数据已过时,去其他地方,最好是在这里”
事务复制可以用于这样的事情,但它会很棘手。但是,听起来您正在做的是使多个前置缓存保持最新状态。
这很棘手,因为轮询机制限制了可扩展性。最有效的是推送机制,如果发生更改,或者某些数据满足特定条件,它将发送到所有缓存,在其他工作中是消息传递框架。
如果这是在 SQL Server 中完成的,那么在节点数量多而事务少的情况下,服务代理可能更适合。如果事务量很大且节点数相对较少,则事务复制可能更合适。
如果数据库是提供全局故障转移服务的应用程序的后端,则应用程序解决方案可能更合适。我碰巧认识一个人,他为一个大型拍卖网站实施了类似的缓存机制,然后