7.8.6 Примеры руководств по маршрутизации
Руководство по маршрутизации для высокой доступности и восстановления после аварий
Этот пример демонстрирует, как создать руководство по маршрутизации ClusterSet, которое поддерживает отказ от работы, гарантируя, что трафик может быть перенаправлен на альтернативные узлы в случае сбоев. В этом примере настройка руководства по маршрутизации придает приоритет локальным узлам, но включает удаленные узлы в качестве вариантов отказа. Он маршрутизирует трафик чтения/записи на первичные узлы, а трафик только для чтения – на вторичные и масштабируемые узлы, с несколькими уровнями резервного копирования для максимальной доступности.
-
Получить объект ClusterSet:
clusterset = dba.get_cluster_set() -
Создать руководство по маршрутизации:
rg = clusterset.create_routing_guideline("HA_DR_Guideline") -
Добавить следующие первичные и вторичные пункты назначения для локальных и удаленных кластеров:
-
Первичный локальный:
rg.add_destination("Primary_Local", "$.server.clusterRole = PRIMARY AND $.server.memberRole = PRIMARY AND $.server.isClusterInvalidated = false AND $.server.clusterName = $.router.localCluster"); -
Первичный удаленный:
rg.add_destination("Primary_Remote", "$.server.clusterRole = PRIMARY AND $.server.memberRole = PRIMARY AND $.server.isClusterInvalidated = false AND $.server.clusterName <> $.router.localCluster"); -
Вторичный локальный:
rg.add_destination("Secondary_Local", "$.server.memberRole = SECONDARY AND $.server.isClusterInvalidated = false AND $.server.clusterName = $.router.localCluster"); -
Вторичный удаленный:
rg.add_destination("Secondary_Remote","$.server.memberRole = SECONDARY AND $.server.isClusterInvalidated = false AND $.server.clusterName <> $.router.localCluster"); -
Масштабируемый локальный:
rg.add_destination("Scale_Out_Local","$.server.memberRole = READ_REPLICA AND $.server.isClusterInvalidated = false AND $.server.clusterName = $.router.localCluster"); -
Масштабируемый удаленный:
rg.add_destination("Scale_Out_Remote","$.server.memberRole = READ_REPLICA AND $.server.isClusterInvalidated = false AND $.server.clusterName <> $.router.localCluster"); -
Только для чтения, резервный локальный:
rg.add_destination("Read_Only_Fallback_Local", "$.server.isClusterInvalidated = true AND ($.server.memberRole = SECONDARY OR $.server.memberRole = READ_REPLICA) AND $.server.clusterName = $.router.localCluster"); -
Только для чтения, резервный удаленный:
rg.add_destination("Read_Only_Fallback_Remote", "$.server.isClusterInvalidated = true AND ($.server.memberRole = SECONDARY OR $.server.memberRole = READ_REPLICA) AND $.server.clusterName <> $.router.localCluster");
_Локальные и _удаленные версии пункта назначения относятся к расположению каждого конкретного экземпляра маршрутизатора. При начальной настройке MySQL Router,
--conf-target-clusterможно использовать для указания имени InnoDB Cluster, который считается локальным для маршрутизатора. То есть расположенным в одном дата-центре, регионе или по другим критериям, релевантным вашей настройке. Локальные серверы – это те, которые находятся в том же дата-центре, что и маршрутизатор, независимо от того, является ли кластер PRIMARY или SECONDARY. -
-
Определите следующие маршруты для обработки трафика чтения/записи и только для чтения:
Чтение/запись (rw_traffic): Устанавливает приоритет локальных первичных серверов с удаленным первичным сервером в качестве резервного. Маршрутизирует трафик чтения/записи на Primary_Local в первую очередь, а затем переходит на Primary_Remote.
Только для чтения (ro_traffic): Балансирует трафик только для чтения между локальными вторичными и масштабируемыми узлами с несколькими уровнями резервного копирования. Маршрутизирует трафик только для чтения на локальные вторичные и масштабируемые узлы в первую очередь. Если они недоступны, происходит переход на удаленные вторичные и масштабируемые узлы, затем на первичные узлы и, в конце концов, на узлы резервного копирования для только чтения, если необходимо. Многоуровневый приоритет обеспечивает непрерывную доступность.
rg.add_route( "rw_traffic", "$.session.targetPort in ($.router.port.rw, $.router.port.rw_split)", ["first-available(Primary_Local, Primary_Remote)"], {"connectionSharingAllowed": True, "enabled": True}); rg.add_route( "ro_traffic", "$.session.targetPort = $.router.port.ro", [ "round-robin(Secondary_Local, Scale_Out_Local)", "round-robin(Secondary_Remote, Scale_Out_Remote)", "round-robin(Primary_Local, Primary_Remote)", "round-robin(Read_Only_Fallback_Local, Read_Only_Fallback_Remote)" ], {"connectionSharingAllowed": True, "enabled": True}); -
Руководство по маршрутизации было создано с использованием метода создания по умолчанию. В результате должен быть удален пункт назначения по умолчанию (PrimaryClusterReadReplica) и маршрут (ro), которые не имеют отношения к этому примеру. Для удаления этих записей выполните следующие команды:
// Remove destination rg.remove_destination("PrimaryClusterReadReplica") // Remove route rg.remove_route("ro") -
Активировать руководство по маршрутизации, сделав его конфигурацией маршрутизации по умолчанию для набора кластеров. Выполните следующую команду:
clusterset.set_routing_option("guideline", "HA_DR_Guideline");
Руководство HA_DR_Guideline активировано. Эта конфигурация обеспечивает избыточность и высокую доступность, гарантируя бесперебойный отказ от работы как в локальных, так и в удаленных кластерах. Вы можете протестировать эту настройку, моделируя сбои узлов или перенаправление сессий, чтобы убедиться, что трафик должным образом маршрутизируется на обозначенные резервные узлы.
Трафик чтения/записи направляется сначала на локальные первичные узлы с резервным копированием на удаленные первичные узлы.
Трафик только для чтения распределяется между локальными вторичными и масштабируемыми узлами с несколькими уровнями резервного копирования, включая удаленные и первичные узлы.
Маршрутизация, основанная на геолокации, и соответствие требованиям
Если приложениям необходимо маршрутизировать трафик на основе географического местоположения или требований соответствия, руководства по маршрутизации, основанной на геолокации, являются необходимыми. Этот пример демонстрирует, как создать руководство по маршрутизации из предварительно определенного файла JSON, гарантируя, что трафик направляется на основе регионов серверов и тегов соответствия для соблюдения нормативных требований и оптимальной задержки.
-
Создайте руководство по маршрутизации в виде файла JSON:
guideline = { "destinations": [ { "match": "$.server.address IN (\"us-east-1.example.com\", \"us-west-2.example.com\")", "name": "US_Regions" }, { "match": "$.server.address IN (\"eu-central-1.example.com\", \"eu-west-1.example.com\")", "name": "EU_Regions" }, { "match": "$.server.tags.compliance = \"GDPR\"", "name": "GDPR_Compliant" } ], "name": "Geo_Based_Guideline", "routes": [ { "connectionSharingAllowed": true, "destinations": [ { "classes": [ "US_Regions", "EU_Regions" ], "strategy": "round-robin", "priority": 0 } ], "enabled": true, "match": "NETWORK($.session.sourceIP, 24) = NETWORK('192.168.1.0', 24) OR NETWORK($.session.sourceIP, 8) = NETWORK('10.0.0.0', 8)", "name": "geo_based" }, { "connectionSharingAllowed": true, "destinations": [ { "classes": [ "GDPR_Compliant" ], "strategy": "round-robin", "priority": 0 } ], "enabled": true, "match": "$.session.connectAttrs.region = \"EU\"", "name": "compliance_based" } ], "version": "1.0" } -
Создайте руководство по маршрутизации из файла JSON. Это удобнее для начальной настройки, чем добавлять маршруты и пункты назначения по отдельности к руководству по умолчанию.
rg = replicaset.create_routing_guideline("Geo_Based_Guideline", guideline);В этом примере руководство определено программно. Вы также можете определить его как локальный файл и импортировать его с помощью
.ClusterSet.import_routing_guideline() -
Изменение маршрутов или пунктов назначения для адаптации к изменениям местоположения или нормативных требований можно выполнить с помощью
set_destination_option()иset_route_option(). Например// Get the guideline object rg = replicaset.get_routing_guideline("Geo_Based_Guideline"); // Modify the match expression for the 'EU_Regions' destination rg.set_destination_option("EU_Regions", "matchExpr", "$.server.address IN (\"eu-west-1.example.com\", \"eu-south-1.example.com\")"); // Disable the 'compliance_based' route temporarily rg.set_route_option("compliance_based", "enabled", False);
Эта настройка направляет:
Трафик, основанный на геолокации: Маршрутизирует трафик на основе IP-сетей к конкретным региональным пунктам назначения, таким как US_Regions и EU_Regions.
Трафик, основанный на требованиях соответствия: Направляет трафик, требующий соответствия GDPR, на серверы с тегом GDPR_Compliant.
Этот пример демонстрирует эффективный способ определения и повторного использования руководств по маршрутизации для похожих сценариев геолокации и соответствия требованиям в различных развертываниях с использованием файлов конфигурации JSON. Этот подход идеально подходит для сценариев, где требуется согласованная конфигурация маршрутизации в различных средах.
Сбалансирование нагрузки и управление ресурсами
Руководства по сбалансированию нагрузки и управлению ресурсами распределяют трафик на основе ролей серверов и конкретных уровней доступа пользователей, оптимизируя использование ресурсов и обеспечивая высокую доступность. Этот пример демонстрирует, как импортировать руководство по маршрутизации из файла JSON, хранящегося локально на вашем компьютере, что позволяет использовать предварительно настроенные конфигурации, которые легко повторно использовать.
-
Создайте файл JSON. Сохраните следующий JSON как
load_balancing_guideline.json:{ "destinations": [ { "match": "$.server.clusterRole = PRIMARY AND $.server.memberRole = READ_REPLICA", "name": "ReadReplica" }, { "match": "$.server.clusterRole = PRIMARY AND $.server.memberRole = SECONDARY", "name": "Secondary" }, { "match": "$.server.clusterRole = PRIMARY AND $.server.memberRole = PRIMARY", "name": "Primary" } ], "name": "Load_Balancing_Guideline", "routes": [ { "connectionSharingAllowed": true, "destinations": [ { "classes": [ "Secondary", "ReadReplica" ], "strategy": "round-robin", "priority": 0 }, { "classes": [ "Primary" ], "strategy": "round-robin", "priority": 1 } ], "enabled": true, "match": "$.session.targetPort = $.router.port.ro AND $.session.user = 'readonly_user'", "name": "ro" }, { "connectionSharingAllowed": true, "destinations": [ { "classes": [ "Primary" ], "strategy": "round-robin", "priority": 0 } ], "enabled": true, "match": "$.session.targetPort in ($.router.port.rw, $.router.port.rw_split) AND $.session.user = 'admin_user'", "name": "rw" } ], "version": "1.0" }Это руководство направляет трафик только для чтения на вторичные и серверы чтения реплик, в то время как операции записи резервируются для первичного сервера, оптимизируя как использование ресурсов, так и распределение нагрузки.
-
Импортируйте руководство по маршрутизации с помощью
import_routing_guideline():rg2 = clusterset.import_routing_guideline("/path/to/load_balancing_guideline.json");ПримечаниеРуководства по маршрутизации можно экспортировать с помощью
export(".filepath") Активируйте руководство по маршрутизации.
Эта настройка гарантирует следующее:
Трафик только для чтения: Направляет сессии с использованием учетной записи readonly_user на вторичные и узлы чтения реплики в режиме круговой очереди, переходя к первичному узлу при необходимости.
Трафик чтения/записи: Маршрутизирует сессии с использованием учетной записи admin_user на первичный узел, гарантируя, что операции записи изолированы на первичном сервере.
Эта конфигурация оптимизирует распределение ресурсов, распределяя трафик только для чтения между доступными репликами, сохраняя ресурсы первичного узла для операций записи. Импорт руководств из файлов JSON позволяет быстро развертывать согласованные конфигурации маршрутизации в различных топологиях, гарантируя эффективное сбалансирование нагрузки и управление ресурсами.
Маршрутизация, специфичная для приложения и схемы, в наборе кластеров
Маршрутизация, специфичная для приложения и схемы, позволяет руководствам по маршрутизации направлять трафик на определенные кластеры или узлы кластера на основе схемы приложения или других данных сессии. Эта конфигурация особенно полезна для вертикально разнесенных установок, где разные схемы управляются отдельными кластерами для оптимизации производительности и организации.
{
"destinations": [
{
"match": "$.server.clusterRole = REPLICA AND $.server.memberRole = PRIMARY AND $.server.clusterName = 'AppCluster'",
"name": "App_ClusterSet_Primary_Replica"
},
{
"match": "$.server.clusterRole = REPLICA AND $.server.memberRole = SECONDARY AND $.server.clusterName = 'AppCluster'",
"name": "App_ClusterSet_Secondary_Replica"
},
{
"match": "$.server.clusterRole = PRIMARY AND $.server.memberRole = PRIMARY",
"name": "Data_ClusterSet_Primary_Primary"
},
{
"match": "$.server.clusterRole = PRIMARY AND $.server.memberRole = SECONDARY",
"name": "Data_ClusterSet_Secondary_Primary"
}
],
"name": "Vertical_Partitioning_Guideline",
"routes": [
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"App_ClusterSet_Primary_Replica",
"App_ClusterSet_Secondary_Replica"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.schema = 'app_schema'",
"name": "app_schema_routing"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Data_ClusterSet_Primary_Primary",
"Data_ClusterSet_Secondary_Primary"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.schema = 'data_schema'",
"name": "data_schema_routing"
}
],
"version": "1.0"
}
С руководством Vertical_Partitioning_Guideline на месте:
Трафик схемы приложения: Сессии с использованием app_schema направляются в AppCluster с использованием стратегии круговой очереди между первичными и вторичными репликами.
Трафик схемы данных: Сессии с использованием data_schema направляются в основной кластер данных, распределяемый по круговой очереди между первичными и вторичными узлами.
Эта настройка позволяет эффективно управлять трафиком между кластерами, настроенными под конкретные требования приложений, повышая производительность и упрощая организацию базы данных для вертикально разнесенных сред.
Маршрутизация, зависящая от версии MySQL
Маршрутизация, зависящая от версии MySQL, полезна, когда определённые приложения или сессии должны подключаться к серверам с конкретной версией MySQL. Это может быть важно для обеспечения совместимости или тестирования. Данное руководство направляет трафик чтений и записи, а также трафик только для чтения на серверы с определёнными версиями MySQL, что позволяет осуществлять точное управление трафиком на основе версии.
{
"destinations": [
{
"match": "$.server.version = 80403",
"name": "MySQL_8_4_3"
},
{
"match": "$.server.version = 80039",
"name": "MySQL_8_0_39"
}
],
"name": "Version_Specific_Guideline",
"routes": [
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"MySQL_8_4_3"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.targetPort IN ($.router.port.rw, $.router.port.rw_split)",
"name": "rw_traffic_to_8_4_3"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"MySQL_8_0_39"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.targetPort = $.router.port.ro",
"name": "ro_traffic_to_8_0_39"
}
],
"version": "1.0"
}
При использовании руководства Version_Specific_Guideline:
Трафик чтений и записей: Маршрутизирует сессии на портах чтений и записей (rw, rw_split) на серверы, на которых запущена MySQL версии 8.4.3, отдавая им приоритет как первым доступным.
Трафик только для чтения: Маршрутизирует сессии на порте только для чтения на серверы, на которых запущена MySQL версии 8.0.39, отдавая им приоритет как первым доступным.
Эта настройка обеспечивает тонкую маршрутизацию трафика на основе версии MySQL, гарантируя совместимость, зависящую от версии, для различных приложений или тестовых сред.
Маршрутизация на основе тегов и производительности
Маршрутизация на основе настраиваемых тегов и производительности позволяет направлять трафик на основе тегов серверов, таких как уровни производительности или настраиваемые атрибуты соответствия. В данном примере используются теги для направления критического трафика приложения на серверы с высокой производительностью и направления сессий, связанных с соответствием, на основе определённых атрибутов пользователя.
{
"destinations": [
{
"match": "$.server.tags.performance = \"high\"",
"name": "High_Performance"
},
{
"match": "$.server.tags.performance = \"low\"",
"name": "Low_Performance"
},
{
"match": "$.server.tags.type = \"compliance\"",
"name": "Compliance_Tag"
}
],
"name": "Tag_Performance_Based_Guideline",
"routes": [
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"High_Performance",
"Low_Performance"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.connectAttrs.app = \"critical\"",
"name": "app_critical_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Compliance_Tag"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.user in (\"admin\", \"finance\")",
"name": "admin_finance_traffic"
}
],
"version": "1.0"
}
При использовании руководства Tag_Performance_Based_Guideline:
Критический трафик приложения: Маршрутизирует сессии с атрибутом app, установленным в «critical», на серверы с тегами высокой или низкой производительности, отдавая приоритет узлам High_Performance по стратегии «первый доступный».
Трафик, связанный с соответствием: Маршрутизирует сессии пользователей с ролями admin и finance на серверы с тегом Compliance_Tag, используя стратегию round-robin для балансировки нагрузки, связанной с соответствием.
Эта настройка позволяет осуществлять маршрутизацию на основе производительности и настраиваемых тегов, направляя определённые приложения и сессии пользователей к наиболее подходящим ресурсам на основе потребностей в производительности или атрибутов соответствия.
Тестирование, этапы разработки и аффинити сессий
В средах с различными этапами, такими как тестирование, разработка и производство, рекомендации по маршрутизации могут направлять трафик на основе этих обозначений, гарантируя, что различные сессии направляются в соответствующую среду. Кроме того, аффинити сессий направляет трафик от конкретных пользователей для поддержания постоянства сессий во время запросов.
{
"destinations": [
{
"match": "$.server.tags.environment = \"production\"",
"name": "Production_Servers"
},
{
"match": "$.server.tags.environment = \"staging\"",
"name": "Staging_Servers"
},
{
"match": "$.server.tags.environment = \"testing\"",
"name": "Testing_Servers"
}
],
"name": "Testing_Stage_Session_Guideline",
"routes": [
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Testing_Servers"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.randomValue < 0.1",
"name": "testing_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Staging_Servers"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.randomValue >= 0.1 AND $.session.randomValue < 0.3",
"name": "staging_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Production_Servers"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.randomValue >= 0.3",
"name": "production_traffic"
},
{
"connectionSharingAllowed": false,
"destinations": [
{
"classes": [
"Production_Servers",
"Staging_Servers",
"Testing_Servers"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.user = 'persistent_user'",
"name": "session_affinity"
}
],
"version": "1.0"
}
При использовании руководства Testing_Stage_Session_Guideline:
Трафик тестирования: Маршрутизирует небольшой процент,
randomValue < 0.1например, запросов на серверы тестирования, что позволяет протестировать определённые сессии без влияния на другие среды.Трафик этапа разработки: Маршрутизирует средний трафик,
0.1 <= randomValue < 0.3например, на серверы разработки для предварительной проверки.Трафик производства: Маршрутизирует оставшиеся сессии на серверы производства, обеспечивая стабильную работу рабочих нагрузок.
Аффинити сессий: Маршрутизирует весь трафик от persistent_user для поддержания непрерывности сессии через среды, при этом трафик распределяется по всем средам с помощью стратегии round-robin.
Эта настройка эффективно разделяет трафик по средам, поддерживает тестирование и разработку и обеспечивает постоянство сессий по мере необходимости.
Маршрутизация по характеристикам клиента
Маршрутизация по характеристикам клиента позволяет направлять трафик на основе определённых атрибутов сессии клиента, таких как операционная система, платформа, тип лицензии или уникальные идентификаторы. Эта настройка особенно полезна для управления ресурсами в средах с разнообразными потребностями клиентов, гарантируя, что сессии направляются на серверы, оптимизированные для этих характеристик.
{
"destinations": [
{
"match": "$.server.tags.backup = true",
"name": "Backup_Servers"
},
{
"match": "$.server.tags.os = \"Linux\"",
"name": "Linux_Clients"
},
{
"match": "$.server.tags.platform = \"x86_64\"",
"name": "x86_64_Servers"
},
{
"match": "$.server.tags.license = \"Commercial\"",
"name": "Commercial_Servers"
},
{
"match": "$.server.tags.test = true",
"name": "Testing_Servers"
}
],
"name": "Comprehensive_ConnectAttrs_Routing",
"routes": [
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Linux_Servers"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.connectAttrs._os = \"Linux\"",
"name": "linux_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"x86_64_Servers"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.connectAttrs._platform = \"x86_64\"",
"name": "x86_64_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Backup_servers"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.connectAttrs.program_name = \"mysqldump\"",
"name": "backup_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Commercial_Servers"
],
"strategy": "round-robin",
"priority": 0
}
],
"enabled": true,
"match": "$.session.schema = \"audit\"",
"name": "commercial_traffic"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": [
"Testing_Servers"
],
"strategy": "first-available",
"priority": 0
}
],
"enabled": true,
"match": "$.session.user = \"test_user\"",
"name": "testing_traffic"
}
],
"version": "1.0"
}
При использовании Comprehensive_ConnectAttrs_Routing:
Трафик Linux: Маршрутизирует сессии, где атрибут
"_os"равен"Linux", на серверы, работающие на Linux, распределяя подключения методом round-robin.Трафик x86_64: Маршрутизирует сессии с атрибутом
"_platform", установленным в"x86_64", на серверы x86_64, используя стратегию «первый доступный».Трафик GPL: Маршрутизирует сессии с лицензией GPL,
_client_license = "GPL-2.0", на серверы, совместимые с GPL.Трафик коммерческой лицензии: Маршрутизирует сессии с коммерческой лицензией на серверы, обозначенные как Commercial_Servers.
Трафик тестирования: Маршрутизирует определённые тестовые сессии, такие как
_pid = "12345", на серверы, помеченные как тестовые ресурсы.
Данное руководство обеспечивает гибкость в маршрутизации трафика на основе атрибутов клиента, что позволяет осуществлять целевое распределение ресурсов и оптимизацию для разнообразных характеристик клиентов.
© 2025 Oracle
Licensed under the GPLv2 License.