{"id":26638150,"url":"https://github.com/yandex-cloud-examples/yc-ig-zone-switcher","last_synced_at":"2025-03-24T17:25:22.880Z","repository":{"id":283048088,"uuid":"950121931","full_name":"yandex-cloud-examples/yc-ig-zone-switcher","owner":"yandex-cloud-examples","description":"Yandex Cloud Functions. В погоне за лидером. Переключение зоны доступности Instance Group при MDB master switchover.","archived":false,"fork":false,"pushed_at":"2025-03-18T09:25:17.000Z","size":13,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-03-18T10:31:41.130Z","etag":null,"topics":["instance-group","serverless","terraform","yandex-cloud","yandexcloud"],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yandex-cloud-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-17T17:01:21.000Z","updated_at":"2025-03-18T09:25:22.000Z","dependencies_parsed_at":"2025-03-18T10:31:57.606Z","dependency_job_id":"f65ab758-b562-47fd-8746-a5dbbf52d827","html_url":"https://github.com/yandex-cloud-examples/yc-ig-zone-switcher","commit_stats":null,"previous_names":["yandex-cloud-examples/yc-ig-zone-switcher"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-ig-zone-switcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-ig-zone-switcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-ig-zone-switcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-ig-zone-switcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yandex-cloud-examples","download_url":"https://codeload.github.com/yandex-cloud-examples/yc-ig-zone-switcher/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245316923,"owners_count":20595527,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["instance-group","serverless","terraform","yandex-cloud","yandexcloud"],"created_at":"2025-03-24T17:25:22.393Z","updated_at":"2025-03-24T17:25:22.868Z","avatar_url":"https://github.com/yandex-cloud-examples.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# В погоне за лидером\n\nПример описывает вариант использования облачной функции для \"слежения\" за MDB мастером.\nПод слежением здесь понимаем управление атрибутами Yandex Cloud Instance Group таким образом, чтобы ВМ с \"пишушей\" нагрузкой всегда были в зоне мастера. Такие требования зачастую накладываются на приложения в высокой интенсивностью взаимодействия между сервером приложения и базой данных \nв данном примере - Managed Service for PostgreSQL. Но ничего не помешает подобную функцию использовать и для Managed MySQL. Но, данный пример этот вариант не закрывает.\n\n\nИтак, из чего состоит пример\n\n- тестовое приложение, генерирующее нагрузку, схожую нагрузкой из [1С-Битрикс \"Монитор производительности\"](https://www.1c-bitrix.ru/products/cms/modules/productive/)\n\n- Terraform конфигурация, которая создает\n  - Необходимую для тестирования инфраструктуру:\n     - сеть, подсети, группы безопасности и пр\n  - Managed Service for PostgreSQL\n  - Instance Group с тестовым приложением\n  - Application Load Balancer для балансировки запросов на ВМ Instance Group\n  - Функцию переключения зоны для Instance Group\n  - Таймер, запускающий функцию из предыдущего пункта раз в 5 минут\n\n\nДля развертывания конфигурации нужно склонировать проект, положить в него файл terraform.tfvars с заполненными параметрами, которые соответствуют Вашему облаку \n\n```json\n    yc_cloud_id  = \"your_cloud_id\"\n    yc_folder_id = \"your_folder_id\"\n    pg_cluster = {\n    db_user = \"your_db_user\"\n    db_pass = \"your_db_user_password\"\n    }\n    ssh_key_path = \"pass_to_public_key\"\n    log_group_id = \"your_log_group_id\"\n```\n\nПолучить IAM токен\n```bash\nexport TF_VAR_yc_token=$(yc iam create-token)\n```\n\nПроиницализировать terraform и применить конфигурацию \n```bash\nterraform init\nterraform apply\n```\n\n\nСкорость работы тестового приложения после выполнения terraform apply\n```bash\nwatch curl -s http://\u003cyour_output_alb_external_ip\u003e/api/status\n```\n\n```bash\nEvery 2.0s: curl -s http://84.201.170.12/api/status                                                            kspoluektov-osx: Tue Mar  4 18:41:29 2025\n\n{select=2083 operations per second at 15:41:29.313765, host=4ef71af1c328, insert=150 operations per second at 15:41:29.978649, update=151 operations per second at 15:41:29.264949}\n```\n\nСмотрим статистику работы сервера приложений\n - скорость выборки по ключу - более 2 тысяч операций в секунду\n - скорость вставки и изменения - около 150 \n\nПроизводим переключение мастера\n```bash\nyc postgres cluster start-failover --id \u003cyour_output_mdb_cluster_id\u003e\n```\n\nСкорость работы с базой резко падает \n```bash\nEvery 2.0s: curl -s http://84.201.170.12/api/status                                                            kspoluektov-osx: Tue Mar  4 18:46:11 2025\n\n{select=261 operations per second at 15:46:11.357227, host=18bfc6d0e282, insert=138 operations per second at 15:46:10.335967, update=156 operations per second at 15:46:10.975641}\n```\n\nВ течение пяти минут функция отследит факт расхождения зоны между Instance Group и Managed Service и сменит зону для Instance Group (смену мы можем отследить в записях лог-группы - там появится сообщение \"Instance group has been updated\"). Параметры управления деплоем последней плавно пересоздадут ВМ без потери доступности и в скором времени мы увидим прежнюю скорость работы приложения с базой\n\n```bash\nEvery 2.0s: curl -s http://84.201.170.12/api/status                                                            kspoluektov-osx: Tue Mar  4 18:51:10 2025\n\n{select=2439 operations per second at 15:51:09.188837, host=a4eae84482dd, insert=126 operations per second at 15:51:09.979863, update=165 operations per second at 15:51:09.147909}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-ig-zone-switcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyandex-cloud-examples%2Fyc-ig-zone-switcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-ig-zone-switcher/lists"}