Текстовые данные чата маршруются, не похожи на nginx.
Почти каждая распределенная система предоставит пользователям функцию пользовательской маршрутизации. потому что только поrange
,mod
,hash
и другие методы, существует большая вероятность того, что он не сможет удовлетворить потребности пользователей. Давайте возьмем реальный сценарий в качестве примера, чтобы поговорить об идее маршрутизации данных.
Сцены
Крупномасштабное приложение toB использует MySQL для хранения, а объем данных одной таблицы достиг сотен миллионов.С точки зрения изменения структуры и запроса данных оно показало очевидные узкие места, и его необходимо разделить на базы данных и таблицы. .
Этапы реализации
найти раздвоенный ключ
Первый шаг — найти широту сегментации. Например, если бизнес запрашивается по измерению времени, то время создания используется в качестве ключа сегментации.
Ключом сегментации этого бизнеса является идентификатор продавца (аналогичный уникальному идентификатору, присвоенному Meituan при открытии магазина в Meituan). По историческим причинам этот идентификатор является идентификатором первичного ключа используемой базы данных, и он самоувеличивается. Бизнес имеет следующие характеристики:
один,Бизнес-операция инициируется продавцом, и каждая таблица имеет поле идентификатора продавца.два,Данные торговцев неравномерны, у некоторых торговцев десятки миллионов, а у некоторых может быть только дюжина или около того.три,Есть несколько вип-продавцов, и объем данных у них очень большойЧетыре,Хранит большое количество статистических требований, поэтому его нельзя разделить на таблицы, а можно разделить только на базы данныхПятерки,Существует возможность обхода данных, таких как частичная синхронизация
Первый этап требований к сегментации
Филиальная библиотека неизбежна. Благодаря анализу некоторые VIP-продавцы имеют огромное количество данных, и не будет преувеличением передать их в одну только базу данных.
Контролируйте поток VIP-продавцов в хранилище данных, поддерживая файл сопоставления. В это время вам нужно настроить маршрутизацию.
Псевдокод выглядит следующим образом:
function viptable(id){
10 => "mysql-002"
101 => "mysql-003"
}
function router4vip(id){
aimDb = viptable(id)
if(aimDb) return aimDb
return "mysql-001"
}
Если мерчант 10, данные будут отправлены в mysql-002; если мерчант 101, они перейдут в mysql-003; по умолчанию данные хранятся в mysql-001.
Кроме того, поскольку идентификатор является автоматически генерируемым самоинкрементным полем, существует проблема курицы и яйца с маршрутизацией, поэтому поле идентификатора модифицируется для ручной установки для расширения другой системы нумерации, которая не будет упоминаться. здесь.
Второй этап требований к сегментации
Задача решения вип мерчанта нужна для решения проблемы mysql-001. С развитием бизнеса данных в дефолтной библиотеке становится все больше, и они будут сталкиваться с узкими местами.
Способ, который приходит на ум, состоит в том, чтобы разделить его на два. Данные mysql-001 разбросаны по двум библиотекам. Для правил разбивки мы прямо принимаем мод.
Почему бы не разделить на три? В основном на основе следующих соображений предполагается, что разделение базы данных:
mysql-001-1
mysql-001-2
В этом случае mysql-001 становится логическим кластером. Когда mysql-001-1 и mysql-001-2 также достигают узкого места, тогда мы можем продолжить их разделение, которое все еще разделено на два.В это время мод 4 в порядке, и сложные данные не задействованы.
Разделенная БД:
mysql-001-1-1
mysql-001-1-2
mysql-001-2-1
mysql-001-2-2
До сих пор мы использовали подбиблиотеку vip и подбиблиотеку mod 4. Псевдокод выглядит следующим образом:
...
function routertable(pivot){
0 => "mysql-001-1-1"
1 => "mysql-001-1-2"
2 => "mysql-001-2-1"
3 => "mysql-001-2-2"
}
function router4mod(id){
aimDb = router4vip(id)
if(aimDb) return aimDb
pivot = mod4(id)
return routertable(pivot)
}
Пока что мы разделились на шесть библиотек. Благодаря режиму деления он имеет лучшую масштабируемость.
Можете ли вы сесть и расслабиться?
Три этапа требований к сегментации
К сожалению, каждый раз, когда мы расширяемся, это экспоненциально. В следующий раз мод 8, а в следующий раз мод 16. Каждый раз, когда вы расширяетесь, половина данных будет перемещена, wtf.
В конце концов, я решил поднять шумиху вокруг области действия идентификатора продавца.
Во-первых, сделайте идентификатор мерчанта фиксированной длины, который длиннее, чем в любой из существующих систем.Основное соображение состоит в том, что новые правила не повлияют на старые правила маршрутизации.
Затем первый слой виртуальных кластеров сначала делится в соответствии с диапазоном идентификатора продавца, а затем второй слой виртуальных кластеров делится в соответствии с мод. Наша маршрутизация теперь является двухуровневой маршрутизацией.
Например, мы устанавливаем номер продавца на 9 цифр (int — 10 цифр в java) и делаем следующую таблицу маршрутизации:
100 000000 - 100 100000=> 虚拟集群1
100 100000 - 100 200000=> 虚拟集群2
...
Первые три цифры используются для разделения первого уровня виртуальных кластеров и поддержки 899; последние шесть цифр представляют диапазон с максимальным значением 100 000. Ниже каждого диапазона будут свои собственные правила маршрутизации, некоторые из них могут быть модом 2, некоторые могут быть модом 3, а некоторые могут быть снова диапазоном.
Хорошо, давайте присоединимся к новому кластеру:
mysql-range0-0 代表号段在范围1中的偶数id
mysql-range0-1
Псевдокод выглядит следующим образом:
...
function router4range(id){
if(id < 100000000){
return router4mod(id)
}else if
(id in [100000000-100100000]){
return
"mysql-range0-"+mod2(id)
}
}
На данный момент у нас есть в общей сложности 8 библиотек, две из которых для vip, четыре для устаревших алгоритмов маршрутизации и две для новых правил подбиблиотеки.
Наша маршрутизация удовлетворяет трем улучшениям:один,Когда мы обнаружим, что когда идентификатор продавца вырастает до100 056400
, узкое место достигнуто, тогда можно добавить новый диапазон, просто изменить логику таблицы маршрутизации и все будет ок
два,Когда торговец в пределах определенного диапазона перерастает в вип, то мы можем извлечь его отдельно и добавить новую вип-библиотеку
три,Если точка доступа данных в определенном диапазоне серьезна, то мод 4 можно использовать для расширения, не затрагивая данные за пределами диапазона.
Четыре,Идентификатор продавца также имеет понятие широты времени, которое можно заархивировать и очистить для некоторых старых торговцев.
Четыре этапа сегментационных требований
Система хочет зарезервировать другую часть сегмента номера, чтобы предоставить клиентам несколько тестовых учетных записей. После первых трех раундов ремонта мы можем легко его спланировать.
End
Почему я считаю дизайн слота redis-cluster безвкусным ребром, потому что он дает мертвые правила маршрутизации, и если я хочу его спроектировать, я должен поместить его в слой драйвера.
Некоторые архитекторы приходили и уходили лихо, оставляя неизгладимые следы. Чтобы быть совместимым с кодом маршрутизации этих унаследованных систем, филиалы будут более сложными, и у каждой компании есть куча историй, не более чем ругань и ругань. Стабильность так же важна, как гора, и код маршрутизации может быть самым важным, если не иметь технического содержания. Если ты двинешься, ты умрешь.
Просто спросите, боитесь ли вы?