我们有一个非常大型的企业级数据库。作为我们业务模型的一部分,所有Web用户每个月都在同一时间访问我们的Web服务器,这反过来又会破坏我们的sql框。业务量非常大,并且随着公司规模的增长,流量还会继续增加。已执行sql proc优化,并且硬件已经扩展到很高的水平。
我们正在寻求对数据库进行分片,以确保我们能够处理公司的增长和未来的负载。
我们已决定应分拆哪些特定数据。它是我们数据库的一个子集,利用率很高。
但是,我的问题是关于通用/通用的非分片数据。这样的数据示例可能是一个库存表(例如),也可能是雇员表,用户表等。
我看到两个选项来处理此通用/通用数据:
1)设计1-将通用/通用数据放置在外部数据库中。所有写入将在此处发生。然后,该数据将被复制到每个分片中,从而允许每个分片在t-sql proc中读取此数据并内部联接至此数据。
2)设计2-为每个分片提供所有常见/通用数据的自己的副本。让每个分片在本地写入这些表,并利用sql合并复制来更新/同步所有其他分片上的数据。
对设计#1的担忧
1)事务性问题:例如,如果您必须先在一个分片中写入或更新数据,然后再在1个存储的proc中写入/更新一个通用/通用表,那么您将无法再轻松地做到这一点。现在,数据存在于单独的sql实例和数据库上。您可能需要让MS DTS来查看是否可以将这些写操作包装到事务中,因为它们位于单独的数据库中。在这里,性能是一个问题,可能会对写入分片和公共数据的proc进行重写。
2)失去参照完整性。不可能做到跨数据库引用完整性。
3)重新编码系统的大部分区域,以便它知道将公共数据写入新的通用数据库,但从分片中读取公共数据。
4)。增加数据库旅行。像上面的#1一样,当您遇到必须更新分片数据和公用数据的情况时,由于数据现在位于单独的数据库中,因此您将进行多次往返以完成此操作。这里有些网络延迟,但是我不像上面的3一样担心这个问题。
对设计2的担忧
在设计2中,每个分片都拥有自己的所有通用/通用数据实例。这意味着加入或更新公共数据的所有代码将像今天一样继续工作/运行。开发团队几乎不需要进行任何编码/重写。但是,此设计完全依赖合并复制来使所有分片之间的数据保持同步。dbas非常熟练,并且非常担心合并复制可能无法处理此问题,并且合并复制失败,因此从该失败中恢复并不好,并且可能会对我们造成负面影响。
我很想知道是否有人采用了第二种设计方案。我也很好奇我是否忽略了我没有看到的第三或第四设计方案。
先感谢您。