sql >> Base de Datos >  >> RDS >> PostgreSQL

Agrupación de conexiones de PostgreSQL:Parte 2 – PgBouncer

Cuando se trata de agrupación de conexiones en el mundo de PostgreSQL, PgBouncer es probablemente la opción más popular. Es una utilidad muy simple que hace exactamente una cosa:se ubica entre la base de datos y los clientes y habla el protocolo PostgreSQL, emulando un servidor PostgreSQL. Un cliente se conecta a PgBouncer exactamente con la misma sintaxis que usaría cuando se conecta directamente a PostgreSQL:PgBouncer es esencialmente invisible.

PgBouncer es compatible con casi todos los proveedores de DBaaS de PostgreSQL y se usa ampliamente en la comunidad. En esta publicación de blog, explicaremos cómo funciona PgBouncer, los pros y los contras de usarlo y cómo configurar el agrupador de conexiones. Si desea obtener más información sobre la agrupación de conexiones en general, o si se pregunta si es adecuado para su implementación, consulte nuestra publicación Agrupación de conexiones de PostgreSQL:Parte 1:pros y contras.

Serie de agrupación de conexiones de PostgreSQL

  • Parte 1:ventajas y desventajas
  • Parte 2:PgBouncer
  • Parte 3:Pgpool-II
  • Parte 4:PgBouncer frente a Pgpool-II

¿Cómo funciona PgBouncer?

Cuando PgBouncer recibe una conexión de cliente, primero realiza la autenticación en nombre del servidor PostgreSQL. PgBouncer admite todos los mecanismos de autenticación que admite el servidor PostgreSQL, incluida una configuración de acceso basada en host (nota:no podemos enrutar conexiones de replicación a través de PgBouncer). Si se proporciona una contraseña, la autenticación se puede realizar de dos formas:

  1. PgBouncer primero verifica el archivo userslist.txt:este archivo especifica un conjunto de tuplas (nombre de usuario, contraseñas encriptadas md5). Si el nombre de usuario existe en este archivo, la contraseña se compara con el valor dado. No se realiza ninguna conexión con el servidor PostgreSQL.
  2. Si la autenticación Passthrough está configurada y el usuario no se encuentra en el archivo userslist.txt, PgBouncer busca una auth_query. Se conecta a PostgreSQL como un usuario predefinido (cuya contraseña debe estar presente en el archivo userslist.txt) y ejecuta la consulta de autenticación para encontrar la contraseña del usuario y hacerla coincidir con el valor proporcionado.

Una vez que la autenticación sea exitosa:

  1. PgBouncer busca una conexión en caché, con la misma combinación de nombre de usuario y base de datos.
  2. Si se encuentra una conexión en caché, devuelve la conexión al cliente.
  3. Si no se encuentra una conexión en caché, crea una nueva conexión, siempre que la creación de una nueva conexión no:
    • Aumentar el número de conexiones a> pool_size
    • Aumente el número de conexiones del cliente a> max_client_connections
    • Aumente el número de conexiones a la base de datos a> max_db_connections
    • Aumentar el número de conexiones del usuario a> max_user_connections
  4. Todos estos valores se pueden definir en la configuración de PgBouncer.
  5. Si la creación de una nueva conexión viola alguna de las configuraciones, PgBouncer pone en cola la conexión hasta que se pueda crear una nueva, excepto si viola la restricción max_client_connections.
    Nota:el tiempo de los pasos posteriores a la autenticación difiere ligeramente según el modo PgBouncer. En el modo de agrupación de transacciones o estados de cuenta, los pasos posteriores a la autenticación se ejecutan solo cuando el cliente comienza a ejecutar una transacción o estado de cuenta. Discutimos más sobre los modos de agrupación a continuación.
  6. Si viola la restricción max_client_connections, cancela la conexión.

Basado en la agrupación modo, PgBouncer espera la oportunidad de devolver la conexión a la base de datos:

  • En el modo de agrupación de sesiones, se devuelve una conexión al grupo solo cuando un cliente cierra la sesión.
  • En el modo de agrupación de transacciones, se devuelve una conexión al grupo solo cuando un cliente completa una transacción (por lo general, se ejecuta una reversión o una confirmación). Como resultado, las funciones basadas en sesión no se admiten en este modo. No hay garantía de que dos transacciones ejecutadas en la misma conexión de cliente PgBouncer se ejecuten en la misma conexión de servidor de PgBouncer.
  • En el modo de agrupación de declaraciones, se devuelve una conexión al grupo tan pronto como se ejecuta una declaración. Aquí, la confirmación automática siempre está activada.

Antes de devolver la conexión a la base de datos, PgBouncer ejecuta una consulta de reinicio para eliminar toda la información de la sesión; esto hace que sea seguro compartir conexiones entre clientes. Es posible configurar esta consulta en función de las necesidades de la aplicación.

El modo de agrupación de transacciones se usa con mayor frecuencia, aunque el modo de agrupación de sesiones puede ser útil para cargas de trabajo particulares. Puede leer más sobre PgBouncer en su página Wiki.

Agrupación de conexiones de PostgreSQL:Parte 2:PgBouncerClick To Tweet

¿Por qué elegir PgBouncer?

Hay muchas razones por las que PgBouncer es la opción más popular cuando se trata de agrupación de conexiones en PostgreSQL. Estas son algunas de las mejores funciones y ventajas que ofrece PgBouncer:

  • Modos de agrupación – Al dar a los usuarios el poder de decidir cuándo se devuelve una conexión al grupo, PgBouncer puede admitir una amplia gama de casos de uso. Y, dado que esta configuración es a nivel de grupo, podría usar el modo de transacción (mejor rendimiento) para sus conexiones de base de datos habituales y el modo de sesión solo cuando necesite características como declaraciones preparadas.
  • Fácil configuración y uso – PgBouncer es uno de los agrupadores de conexiones de PostgreSQL más fáciles de configurar, y tampoco requiere cambios en el código del lado del cliente.
  • Autenticación Passthrough – PgBouncer es uno de los pocos agrupadores de conexiones de "middleware" que pueden autenticar de forma segura a un usuario sin tener acceso a sus contraseñas (en texto sin formato o en forma cifrada). Esto hace que PgBouncer sea más seguro y mucho más fácil de mantener:no necesita actualizar PgBouncer cada vez que un usuario actualiza su contraseña.
  • Ligero – Es un proceso único, y todos los comandos del cliente y las respuestas del servidor pasan por PgBouncer sin ningún procesamiento. Por lo tanto, no necesita "ver" todo el contenido a la vez y, por lo tanto, mantiene una huella de memoria muy pequeña.
  • Escalabilidad y rendimiento – Como discutiremos con más detalle en la parte final de nuestra serie, PgBouncer puede mejorar significativamente las transacciones por segundo que puede admitir su servidor PostgreSQL, y se adapta muy bien a una gran cantidad de clientes.

¿Qué no hace PgBouncer?

PgBouncer, si bien es un excelente agrupador de conexiones, no admite el equilibrio de carga automatizado ni la alta disponibilidad. Recomienda usar otras herramientas comunes de Linux como HAProxy para crear una arquitectura que admita estas funciones.

Eche un vistazo a la arquitectura PostgreSQL de ejemplo para lecturas con equilibrio de carga a continuación:

Nota:el nodo maestro (que todos estos esclavos se estaría replicando) no se muestra en el diagrama.

Cómo configurar PgBouncer

Si tiene una implementación de ScaleGrid PostgreSQL, puede configurar PgBouncer con unos pocos clics. Vaya a la vista de detalles de su clúster de PostgreSQL y haga clic en el icono de PgBouncer. Una vez que seleccione "Habilitar PgBouncer", se le presentarán opciones de configuración para personalizar el modo de agrupación y el tamaño de la agrupación:puede aceptar los valores predeterminados (no se preocupe, puede cambiarlos en cualquier momento sin tiempo de inactividad) y haga clic en ¡Habilitar!

¡Y eso es todo! Estás listo para irte.

Si tiene una implementación que no es de ScaleGrid, PgBouncer se distribuye como parte del repositorio de PostgreSQL y se puede instalar usando los respectivos administradores de paquetes. Para obtener instrucciones más detalladas o para compilar desde la fuente, puede seguir las instrucciones de su blog.

Una vez instalado, PgBouncer solo requiere que configure algunos parámetros de configuración para ponerlo en marcha:

  1. Una lista de (nombre de usuario, contraseña encriptada md5) para autenticar clientes o una configuración de autenticación de paso para una implementación más segura.
  2. Interfaces/IP:puertos para escuchar conexiones entrantes.
  3. Definiciones de grupos. Un 'grupo' es un nombre que los clientes usan como nombre de base de datos cuando se conectan a PgBouncer; se puede asignar a una cadena de conexión completa (host, puerto, nombre de base de datos y usuario). La definición más simple tiene la forma:
    * = host=
    Esto creará grupos dinámicos para cada combinación de nombre de base de datos+usuario y se conectará al host definido utilizando el puerto, el nombre de base de datos y el nombre de usuario proporcionados por el usuario.

¡Y eso es todo! Puede estar en funcionamiento muy rápidamente con PgBouncer. Sin embargo, hay muchas más configuraciones que deben ajustarse para cualquier distribución de producción; están más allá del alcance de esta publicación de blog, pero puede leer más sobre ellas en esta descripción general de las configuraciones de PgBouncer.

PgBouncer, sin embargo, no es la única opción para la agrupación de conexiones de PostgreSQL; en nuestra próxima publicación, hablaremos de Pgpool-II, que es probablemente la principal competidor de PgBouncer. Estén atentos a nuestra cuarta publicación de esta serie de cuatro partes en la que comparamos PgBouncer con Pgpool-II.