Рекомендации по балансировке между репликами чтения Google Cloud SQL postgres для App Engine App

#postgresql #google-app-engine #load-balancing #google-cloud-sql #read-replication

#postgresql #google-app-engine #балансировка нагрузки #google-cloud-sql #чтение-репликация

Вопрос:

Прямо сейчас мы делаем шаг к развертыванию в облаке, и в этом процессе хотелось бы создать несколько реплик чтения для нашей базы данных.

Я не понимаю, какой предлагаемый метод балансировки запросов между репликами чтения Cloud SQL. Кажется, что прокси-сервер Cloud SQL может быть правильным методом, но мне неясно, как его следует использовать в производственной среде.

Ответ №1:

Как вы можете видеть здесь (обеспечивает ли Cloud SQL балансировку нагрузки для запросов на чтение реплик?) «Cloud SQL автоматически не обеспечивает и не настраивает балансировку нагрузки. Вы можете использовать пул соединений для распределения запросов на чтение между репликами чтения путем переключения между несколькими конечными точками подключения «.

Ваш код должен выглядеть так, если вы хотите использовать сокеты Unix

 # Remember - storing secrets in plaintext is potentially unsafe. Consider using
# something like https://cloud.google.com/secret-manager/docs/overview to help keep
# secrets secret.
db_user = os.environ["DB_USER"]
db_pass = os.environ["DB_PASS"]
db_name = os.environ["DB_NAME"]
db_socket_dir = os.environ.get("DB_SOCKET_DIR", "/cloudsql")
cloud_sql_connection_name = os.environ["CLOUD_SQL_CONNECTION_NAME"]

pool = sqlalchemy.create_engine(

    # Equivalent URL:
    # postgres pg8000://<db_user>:<db_pass>@/<db_name>
    #                         ?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432
    sqlalchemy.engine.url.URL(
        drivername="postgresql pg8000",
        username=db_user,  # e.g. "my-database-user"
        password=db_pass,  # e.g. "my-database-password"
        database=db_name,  # e.g. "my-database-name"
        query={
            "unix_sock": "{}/{}/.s.PGSQL.5432".format(
                db_socket_dir,  # e.g. "/cloudsql"
                cloud_sql_connection_name)  # i.e "<PROJECT-NAME>:<INSTANCE-REGION>:<INSTANCE-NAME>"
        }
    ),
    **db_config
)
 

И следующий пример предназначен для TCP-соединений

 # Remember - storing secrets in plaintext is potentially unsafe. Consider using
# something like https://cloud.google.com/secret-manager/docs/overview to help keep
# secrets secret.
db_user = os.environ["DB_USER"]
db_pass = os.environ["DB_PASS"]
db_name = os.environ["DB_NAME"]
db_host = os.environ["DB_HOST"]

# Extract host and port from db_host
host_args = db_host.split(":")
db_hostname, db_port = host_args[0], int(host_args[1])

pool = sqlalchemy.create_engine(
    # Equivalent URL:
    # postgres pg8000://<db_user>:<db_pass>@<db_host>:<db_port>/<db_name>
    sqlalchemy.engine.url.URL(
        drivername="postgresql pg8000",
        username=db_user,  # e.g. "my-database-user"
        password=db_pass,  # e.g. "my-database-password"
        host=db_hostname,  # e.g. "127.0.0.1"
        port=db_port,  # e.g. 5432
        database=db_name  # e.g. "my-database-name"
    ),
    **db_config
)