我们有一个云系统,每个客户都有自己的虚拟网络。目前,我们已经为DB上的每个客户分配了网络子网列表。
它们存储在具有以下列的网络表中:
| network | ip_start | ip_end | subnet_mask |新的,我们希望能够让客户请求个人知识产权(预订)。当不再需要时,客户也可以释放他的IP。
现在,我可以考虑创建一个新表,存储所有已经保留的IP。
当请求一个新IP时,我们需要扫描新的IP表,以便在相应的网络中找到一个空闲的IP。
当IP被释放时,我们需要从新表中删除IP记录。
但这似乎非常缓慢和繁琐,我想知道是否有一个更好的DB设计。
添加更多信息
假设我们维护了保留的IP表,我仍然想不出找到下一个免费IP的好方法。
由于会有免费IP位于连续范围的中间,要找到这些免费IP,需要查找每个IP,而下一个IP则需要查找空白。
我必须从DB检索整个IP范围,然后每次搜索间隙以获得免费IP吗?
此外,必须在系统中支持IPV6。
发布于 2015-03-24 11:45:04
我猜最好的设计是每个IP都有一行。如果你使用的是IP-v4,那么最多有40亿种的可能性,而你的公司并不拥有其中的大部分。这意味着:
| network | ip | reserved_by | reserved_date在预留新地址时,拥有不可用的ips对您的环境非常有帮助。这是特别正确的,因为你可能有不连续的范围--如果不是现在,那么随着你变得更加成功,你必须获得更多的IP地址。
您还可以使用触发器或存储过程来保持两个表的同步,正如您已经描述的那样,可以维护一个表。
这种解决方案可能不可行的IPv-6,至少在最好的粒度水平。
发布于 2015-03-24 12:03:43
我会推荐您在问题中建议的设计,除了为了更好的性能,您可能想要存储IP有点不同。每个部分都可以用零填充,然后整个IP可以转换为BIGINT (使用IPv4)。这将允许有效地使用大于或小于比较的索引,而查找未使用的IP的“繁琐”过程可以实现为在范围内已经使用的第一个相邻IP集中找到最大值,然后再递增一个。如果有一个函数来转换IP的整数表示,那将是很有帮助的。
要与IPv6兼容,您将无法转换为BIGINT,因此您可以将其保留为VARCHAR (或拆分为多个ints)。在这一点上,将IP增加一个将变得不那么琐碎,但仍然可行。
无论哪种方式,策略都是将IP的各个部分放置起来,这样您就可以使用索引尽可能地提高进程的效率。
https://stackoverflow.com/questions/29231614
复制相似问题