我正在构建自己的分片解决方案.每个ID的构造如下:
>分片ID(小整数)
>表格类型ID(小整数)
>增量数(大整数)
例如00001000010000000015
我使用虚拟分片,因此我可以将所有分片指向一台服务器,当我需要更多容量时,我只需添加另一台服务器,然后将一些虚拟分片指向该服务器,以便下次将数据写入到新服务器上.服务器而不是第一个服务器,尽管读取将进入两个服务器,至少直到我移动数据并在配置文件中更改它为止.
我的问题是增量数.我希望这些独特.在mysql中为特定表使用build int增量ID是不好的,因为我可能会将数据移动到另一台服务器,并且那里可能还有另一个数据使用其表的增量编号,因此我可能会得到重复的ID.
所以我的问题是,如何在不使用会生成该ID的外部表的情况下以可扩展的方式生成唯一的ID,因为它无法缩放.我可以向您指出Pinterest如何解决了这个here可能会有所帮助的问题.我考虑过为每个表提供一个增量值,该增量值会为每个分片跳过不同的值,因此它们在所有分片上的增量值永远不会相同.
这个想法是用Amazon RDS构建我自己的分片解决方案,因此副本已经存在,平衡很容易,因为我可以利用promove slave来控制主文件,而只是删除两台服务器上的数据并更改我的分片配置文件.我认为有可能构建一个可以使用Amazon RDS轻松扩展的解决方案,并且该解决方案将比其他公司今天提供的价格便宜得多(已经做了我的作业).
我不想在我的URL中使用GUID.我不介意使用长整数. Pinterest,Tumblr,Facebook和其他许多人都不使用Guid,所以我知道他们是那里的一种解决方案,只是想知道您想使用哪种数字标识,并想知道您认为哪种解决方案最有效.
我正在ASP.NET C#中开发应用程序
解决方法:
简而言之,您生成ID的方法就注定了:如果要生成唯一的ID,则需要一个*服务,该服务最终将成为瓶颈.
还包括分片ID的气味很差;将数据移到新分片时会发生什么?您是否需要更新所有ID?
如果需要可伸缩的解决方案,则必须考虑UUIDs或类似方法.
或者,您可以使用*服务并为每个呼叫分配一个ID块(例如10’000).这样,您就不必经常敲击*服务,但是如果服务失败,整个系统将失效.