Я создаю настройку облака Google с несколькими группами экземпляров (3) в нескольких регионах. Все они находятся в одном VP C.
Регионы:
- us-central1
- европа-север1
- азия-восток1
Все три группы экземпляров имеют 2 виртуальные машины. Он работает как балансировщик нагрузки HTTP (S), и когда я захожу на publi c IP-адрес балансировщика нагрузки, я вижу страницу приветствия apache (apache установлена на виртуальных машинах). Так что это работает.
У меня также есть база данных Cloud SQL (PostgreSQL). Я хочу получить доступ к этой базе данных через ее частный IP. Я связал сеть VP C, которую используют виртуальные машины, с частным IP-адресом экземпляра Cloud SQL. Этот экземпляр работает в регионе us-central1.
Теперь проблема в том, что он не работает. :) Я провел некоторые исследования в документации и обнаружил следующее:
Вы должны выбрать сеть VP C для использования. Ресурсы Google Cloud, которые вы будете использовать для подключения к своему экземпляру Cloud SQL (экземплярам Compute Engine [VM] или экземплярам Google Kubernetes Engine), должны использовать эту сеть VP C для подключения. Эти ресурсы также должны находиться в том же регионе, что и ваш экземпляр Cloud SQL.
Источник: https://cloud.google.com/sql/docs/postgres/configure-private-ip
Кому тест, я добавляю новую виртуальную машину в регионе us-central1 (не связан с группой экземпляров) и с правильным VP C. Когда я устанавливаю postgresql -клиента на этой виртуальной машине, я могу подключиться к базе данных. Но когда я создаю другую виртуальную машину в регионе europe-north1 (также не связанной с группой экземпляров) и с правильным VP C, я не могу подключиться к базе данных. Таким образом, документация (неожиданно) верна: экземпляры в другом регионе, отличном от региона, в котором работает экземпляр Cloud SQL, не могут подключиться к Cloud SQL через частный IP-адрес.
Мой вопрос сейчас является: каков наилучший способ решить эту проблему, чтобы все виртуальные машины в разных группах экземпляров могли подключаться к одной и той же базе данных. Должен ли я создать несколько экземпляров Cloud SQL в разных регионах и копировать каждую базу данных всякий раз, когда некоторые данные вставляются / обновляются / удаляются? Мне кажется, это много ненужных траффиков c и загрузки.
Другой вариант (я думаю) - использовать Cloud Spanner. Я только что обнаружил эту опцию и сейчас читаю документы. Это путь к go?
Редактировать: Облачный гаечный ключ кажется многообещающим, но я также вижу, что он очень дорогой. Стоимость 1 узла с хранилищем 1 ГБ составляет около 650 долларов США в месяц.
Другой вариант - доступ к облачной базе данных SQL через IP-адрес publi c. Проблема в том, что я должен вносить в белый список каждый IP-адрес виртуальной машины, и поскольку я использую автоматическое масштабирование, виртуальные машины создаются на go (с новыми IP-адресами). Как я могу решить эту проблему, чтобы новые виртуальные машины автоматически помещались в белый список базы данных?
Редактировать: с ответом Гейба Вейса, я создал новую (тестовую) виртуальную машину и установил ее облачный SQL прокси и postgresql -клиент. Это работает, когда я устанавливаю соединение или делаю запрос, все хорошо.
Теперь проблема в том, что это не работает в моем nodejs -app. Я использую node- postgres (https://node-postgres.com/), и моя конфигурация подключения выглядит следующим образом:
const db = new Pool({
host: '127.0.0.1',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres'
})
Я также попытался заменить '127.0.0.1' на localhost, я удалил порт, ... ничего не работает. Учетные данные верны.
Редактировать 2: Когда я запускаю cloud_sql_proxy в фоновом режиме, а также запускаю свое приложение nodejs и я перехожу к http://external_ip_address : 8000 / узел , я вижу журнал в консоли:
2020/01/22 17:55:20 New connection for "project-id:region:instance-name"
Но через 10 секунд я получаю это:
2020/01/22 17:57:00 Client closed local connection on 127.0.0.1:5432
Редактировать 3:
Я также попытался изменить хост на / cloudsql / instance_connection_name, но также не дал результатов.
const db = new Pool({
host: '/cloudsql/[project-id]:[region]:[instance-name]',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres'
})