Фон
Я создаю приложение IPAM для отслеживания и хранения метаданных для отдельных адресов IPv4 и IPv6.Бэкэнд должен быть скучной, независимой от поставщика реляционной базой данных.
IPv6 может работать с большими числами в обширном адресуемом пространстве, но рассматриваемая область по сути не является большими данными, поэтому я нежелая изменить архитектуры бэкэнда без каких-либо реальных технических недостатков моего нынешнего подхода, который лучше обслуживается хип-NoSQL-решением за счет отношений и ACIDity.
(Я не пытаюсь задокументировать все адресное пространство, только действующие адреса, используемые произвольными клиентами.)
Схема
Нормализоватьстроковое представление заданного IP-адреса и использование его в качестве первичного ключа.Адреса IPv4 преобразуются в IPv6 и имеют префикс ffff
.Адреса IPv6 сжимаются и в нижнем регистре.
Во втором поле указывается, для какой версии протокола используется рассматриваемая запись - 4 или 6. Идея заключается в том, что если пользователь ищет записи в подсети IPv4, я могу быстроисключить пространство IPv6 или наоборот.
Следующие восемь полей (тьфу) являются целочисленными представлениями каждого октета в адресе (octet_1
, octet_2
и т. д.).
Индексы
Первичный ключ уже должен иметь свой собственный уникальный индекс.
Создать дополнительный индекс на (version, octet_1, ..., octet_8)
.
Запрос
Для поиска определенного IP-адреса любой версии я могу просто нормализовать строку IP так же, как указано выше, и выполнять поиск по первичным ключам.
Для поиска по подсети, приложениевычисляет начальный / конечный адрес для диапазона, преобразует оба в IPv6, преобразует оба в восьмеричные числа и выдает запрос для всех записей с восьмыми числами между ними.
С какими проблемами я могу столкнуться при этом подход?Предложения по улучшению?
Что-нибудь от ipv4s casted as ipv6 are not the same thing
до your index will explode / write performance will suck
- это честная игра.
Я создал тестовый POC, который проверяет функциональность этой схемы, но меня беспокоитлюбые возможные недостатки этой модели в производственной среде.