使用捆绑的 PgBouncer 服务
gitlab-jh
包中,免费试用。要获取技术支持,您需要专业版订阅。PgBouncer 用于在故障转移场景下无缝迁移服务器之间的数据库连接。此外,它还可以在非容错设置中用于池连接,加快响应时间,同时减少资源使用。
专业版包含一个捆绑版本的 PgBouncer,可以通过 /etc/gitlab/gitlab.rb
进行管理。
PgBouncer 作为容错 GitLab 安装的一部分
此内容已移至新位置。
PgBouncer 作为非容错 GitLab 安装的一部分
-
使用命令
gitlab-ctl pg-password-md5 pgbouncer
生成PGBOUNCER_USER_PASSWORD_HASH
-
使用命令
gitlab-ctl pg-password-md5 gitlab
生成SQL_USER_PASSWORD_HASH
。 稍后输入明文 SQL_USER_PASSWORD -
在您的数据库节点上,确保在您的
/etc/gitlab/gitlab.rb
中设置以下内容postgresql['pgbouncer_user_password'] = 'PGBOUNCER_USER_PASSWORD_HASH' postgresql['sql_user_password'] = 'SQL_USER_PASSWORD_HASH' postgresql['listen_address'] = 'XX.XX.XX.Y' # Where XX.XX.XX.Y is the ip address on the node postgresql should listen on postgresql['md5_auth_cidr_addresses'] = %w(AA.AA.AA.B/32) # Where AA.AA.AA.B is the IP address of the pgbouncer node
-
运行
gitlab-ctl reconfigure
如果数据库已经在运行,则需要在重新配置后通过运行gitlab-ctl restart postgresql
重新启动。 -
在您运行 PgBouncer 的节点上,确保在
/etc/gitlab/gitlab.rb
中设置以下内容pgbouncer['enable'] = true pgbouncer['databases'] = { gitlabhq_production: { host: 'DATABASE_HOST', user: 'pgbouncer', password: 'PGBOUNCER_USER_PASSWORD_HASH' } }
您可以为每个数据库传递额外的配置参数,例如:
pgbouncer['databases'] = { gitlabhq_production: { ... pool_mode: 'transaction' } }
请谨慎使用这些参数。有关完整的参数列表,请参阅 PgBouncer 文档。
-
运行
gitlab-ctl reconfigure
-
在运行 Puma 的节点上,确保在
/etc/gitlab/gitlab.rb
中设置了以下内容gitlab_rails['db_host'] = 'PGBOUNCER_HOST' gitlab_rails['db_port'] = '6432' gitlab_rails['db_password'] = 'SQL_USER_PASSWORD'
-
运行
gitlab-ctl reconfigure
-
此时,您的实例应该通过 PgBouncer 连接到数据库。如果您遇到问题,请参阅故障排查部分
备份
不要通过 PgBouncer 连接备份或恢复极狐GitLab:它会导致中断。
启用监控
如果您启用监控,则必须在所有 PgBouncer 服务器上启用它。
-
创建/编辑
/etc/gitlab/gitlab.rb
并添加以下配置:# Enable service discovery for Prometheus consul['enable'] = true consul['monitoring_service_discovery'] = true # Replace placeholders # Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z # with the addresses of the Consul server nodes consul['configuration'] = { retry_join: %w(Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z), } # Set the network addresses that the exporters will listen on node_exporter['listen_address'] = '0.0.0.0:9100' pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
-
运行
sudo gitlab-ctl reconfigure
以完成配置。
管理控制台
在 Linux 软件包安装中,提供了一个命令来自动连接到 PgBouncer 管理控制台。有关如何与控制台交互的详细说明,请参阅 PgBouncer 文档。
要启动会话,请运行以下命令并为 pgbouncer
用户提供密码:
sudo gitlab-ctl pgb-console
要获取有关实例的一些基本信息:
pgbouncer=# show databases; show clients; show servers;
name | host | port | database | force_user | pool_size | reserve_pool | pool_mode | max_connections | current_connections
---------------------+-----------+------+---------------------+------------+-----------+--------------+-----------+-----------------+---------------------
gitlabhq_production | 127.0.0.1 | 5432 | gitlabhq_production | | 100 | 5 | | 0 | 1
pgbouncer | | 6432 | pgbouncer | pgbouncer | 2 | 0 | statement | 0 | 0
(2 rows)
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time | ptr | link
| remote_pid | tls
------+-----------+---------------------+--------+-----------+-------+------------+------------+---------------------+---------------------+-----------+------
+------------+-----
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44590 | 127.0.0.1 | 6432 | 2018-04-24 22:13:10 | 2018-04-24 22:17:10 | 0x12444c0 |
| 0 |
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44592 | 127.0.0.1 | 6432 | 2018-04-24 22:13:10 | 2018-04-24 22:17:10 | 0x12447c0 |
| 0 |
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44594 | 127.0.0.1 | 6432 | 2018-04-24 22:13:10 | 2018-04-24 22:17:10 | 0x1244940 |
| 0 |
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44706 | 127.0.0.1 | 6432 | 2018-04-24 22:14:22 | 2018-04-24 22:16:31 | 0x1244ac0 |
| 0 |
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44708 | 127.0.0.1 | 6432 | 2018-04-24 22:14:22 | 2018-04-24 22:15:15 | 0x1244c40 |
| 0 |
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44794 | 127.0.0.1 | 6432 | 2018-04-24 22:15:15 | 2018-04-24 22:15:15 | 0x1244dc0 |
| 0 |
C | gitlab | gitlabhq_production | active | 127.0.0.1 | 44798 | 127.0.0.1 | 6432 | 2018-04-24 22:15:15 | 2018-04-24 22:16:31 | 0x1244f40 |
| 0 |
C | pgbouncer | pgbouncer | active | 127.0.0.1 | 44660 | 127.0.0.1 | 6432 | 2018-04-24 22:13:51 | 2018-04-24 22:17:12 | 0x1244640 |
| 0 |
(8 rows)
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time | ptr | link | rem
ote_pid | tls
------+--------+---------------------+-------+-----------+------+------------+------------+---------------------+---------------------+-----------+------+----
--------+-----
S | gitlab | gitlabhq_production | idle | 127.0.0.1 | 5432 | 127.0.0.1 | 35646 | 2018-04-24 22:15:15 | 2018-04-24 22:17:10 | 0x124dca0 | |
19980 |
(1 row)
绕过 PgBouncer 的过程
Linux 软件包安装实例
某些数据库更改必须直接完成,而不是通过 PgBouncer。
-
要查找主节点,请在数据库节点上运行以下命令:
sudo gitlab-ctl patroni members
-
在您正在执行任务的应用程序节点上编辑
/etc/gitlab/gitlab.rb
,并使用数据库主节点的主机和端口更新gitlab_rails['db_host']
和gitlab_rails['db_port']
。 -
运行重新配置:
sudo gitlab-ctl reconfigure
完成任务或程序后,切换回使用 PgBouncer:
- 改回
/etc/gitlab/gitlab.rb
以指向 PgBouncer。 -
运行重新配置:
sudo gitlab-ctl reconfigure
Helm chart 安装实例
出于与基于 Linux 安装包的部署相同的原因,高可用性部署也需要绕过 PgBouncer。 对于 Helm chart 安装:
- 数据库备份和恢复任务由 toolbox 容器执行。
- 迁移任务由 migrations 容器执行。
您应该覆盖每个子 chart 上的 PostgreSQL 端口,以便这些任务可以执行并直接连接到 PostgreSQL:
微调
PgBouncer 的默认设置适合大多数安装。在特定情况下,您可能希望更改特定于性能和特定于资源的变量,以增加可能的吞吐量,或限制可能导致数据库内存耗尽的资源利用率。
您可以在官方 PgBouncer 文档 上找到参数和相应文档。 下面列出的是 Linux 软件包安装中最相关的参数和它们的默认值:
-
pgbouncer['max_client_conn']
(默认值:2048
,取决于服务器文件描述符限制) 这是 PgBouncer 中的“前端”池:从 Rails 到 PgBouncer 的连接。 -
pgbouncer['default_pool_size']
(默认值:100
) 这是 PgBouncer 中的“后端”池:从 PgBouncer 到数据库的连接。
default_pool_size
的理想数量必须足以处理需要访问数据库的所有已配置服务。下面列出的每个服务都使用以下公式来定义数据库池大小:
-
puma
:max_threads + headroom
(默认14
)-
max_threads
是通过以下方式配置的:gitlab['puma']['max_threads']
(默认值:4
) -
headroom
可以通过DB_POOL_HEADROOM
环境变量配置(默认为10
)
-
-
sidekiq
:max_concurrency + 1 + headroom
(默认值:31
)-
max_concurrency
是通过以下方式配置的:sidekiq['max_concurrency']
(默认值:20
) -
headroom
可以通过DB_POOL_HEADROOM
环境变量配置(默认为10
)
-
-
geo-logcursor
:1+headroom
(默认值:11
)-
headroom
可以通过DB_POOL_HEADROOM
环境变量配置(默认为10
)
-
要计算 default_pool_size
,请将 puma
、sidekiq
和geo-logcursor
的实例数乘以上面列出的每个可以消耗的连接数。总数将是建议的 default_pool_size
。
如果您使用多个带有内部负载均衡器的 PgBouncer,您可以将 default_pool_size
除以实例数量,以保证它们之间的负载均匀分布。
pgbouncer['max_client_conn']
是 PgBouncer 可以接受的连接的硬限制。您不太可能需要更改此设置。如果您达到该限制,您可能需要考虑使用内部负载均衡器添加额外的 PgBouncer。
在为指向 Geo 跟踪数据库的 PgBouncer 设置限制时,您可能会忽略等式中的 puma
,因为它只是偶尔访问该数据库。
故障排查
如果您在通过 PgBouncer 连接时遇到任何问题,首先要检查的始终是日志:
sudo gitlab-ctl tail pgbouncer
此外,您可以在管理控制台中检查 show databases
的输出。在输出中,您可能会看到 gitlabhq_production
数据库的 host
字段中的值。此外,current_connections
应该大于 1。