不时,情况发生了不寻常的情况下要求开箱即用的思考。
例如,假设你有一个系统安装多个数据集群到一个主机。你最终得到的是一个主机分手和分享宝贵的系统资源,即。、CPU、内存、磁盘等,PostgreSQL的多个实例之间数据集群。虽然在开发环境中容易做到,它代表技术债务,当它到达生产。迟早,我们必须解决这个问题;否则,一个人可以承受的后果阻碍了整个数据库的基础设施。
现在让我们前进的时间:你的系统了,当然,这个快捷方式的一个主机上使用多个数据集群已经成为性能瓶颈。问题是你不会或不能重构应用程序服务器;东西,也许,没有足够的时间。正如你可能已经知道的,虽然Postgres可以坐在一个UNIX域套接字和IPv4, IPv6端口,等等,一个仍然是限制仅仅听一个端口。
那么你会怎么做?
经验丰富的系统管理员,实际上有相当多的“神奇”技术。然而,在这种情况下,有一点帮助systemd负责管理所有服务过程中,我们将解决这些小问题使用PgBouncer混合物的配置文件。
场景
配置系统,这样Postgres驻留在其默认端口5432和PgBouncer坐在三个端口,即。、6432、6433和6433年,访问居民Postgres服务器。
PgBouncer连接池将使用一个管理账户,PgBouncer角色,用户身份验证的目的。身份验证是通过访问服务器的Postgrespg_shadow表和比较结果哈希所有传入的连接(这不会为云设置等工作,例如,Amazon RDS)。
一组Systemd配置文件将被创建并编辑为了管理PgBouncer服务。
有关的文件
下面是一个汇总的文件以及它们如何将编辑。记住,这些配置文件是一个假设的性质使用最少的设置,,当然,需要更新以匹配实际的生产环境。
|
1
2
3
4
5
6
7
8
9
|
├──
pgbouncer
│├──
pgbouncer
. ini
│└──
userlist
. txt
├──
postgres
│├──
add_function
. sql
│├──
add_user
. sql
└──
systemd
├──
pgbouncer_override
└──
pgbouncer
.socket
|
pgbouncer.ini
这个配置文件定义所有行为和安装在缺省位置,“/ etc / pgbouncer”。
只使用一个域套接字。就我们的目的而言,listen_port运行时参数只是噪音和取代了其他运行时参数文件中声明pgbouncer.socket。
提示:备份原始pgbouncer。在i as it references ALL runtime parameters.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
|
(数据库)
*=
主机=本地主机
(用户)
#
左
空白
(pgbouncer)
日志文件
=/var/日志/postgresql/pgbouncer
。
日志
pidfile
=/var/运行/postgresql/pgbouncer
。
pid
;;这些参数是隐式地禁用
listen_addr
=
0.0.0.0
listen_port
=
6432年
unix_socket_dir
=/var/运行/postgresql
auth_type
=
md5
auth_file
=/等/pgbouncer/userlist
。
三种
auth_user
=
pgbouncer
auth_query
=
选择
p_user
,
p_password
从
公共
。
查找
(
美元
1
)
pool_mode
=
会话
;;使用<浏览器名称——主机> application_name服务器。
application_name_add_host
=
1
|
userlist.txt
包含一个用户帐户和密码进行身份验证。注意,md5散列密码pgbouncer。
|
1
|
“pgbouncer”
“md5be5544d3807b54dd0637f2439ecb03b9”
|
add_user.sql
添加角色“pgbouncer”Postgres集群数据。虽然在正常情况下这不是必需的,PgBouncer使用这个角色来验证所有的登录。
就我们的目的而言,密码是“pgbouncer”:
|
1
2
3
4
|
- - -
——作为超级用户执行postgres
- - -
创建
角色
pgbouncer
登录
与
PASSSWORDpgbouncer;
|
add_function.sql
这是一个用户定义函数这个角色PgBouncer执行为了获得pg_shadow的密码散列。
这个SQL语句必须执行对每个数据库访问的任何角色使用PgBouncer连接。
提示:对数据库执行此SQL template1,函数调用将包含在每一个新创建的数据库。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
- - -
——作为超级用户执行postgres
- - -
——执行每个数据库用户帐户登录
- - -
创建
函数
public.lookup(
INOUT
p_user
的名字,
出
p_password
文本
)
返回
记录
语言
sql
安全
定义者
集
search_path=pg_catalog
作为
$ $选择
usename,passwd
从
pg_shadow
在哪里
usename=p_user $ $;
——确保只有“pgbouncer”可以使用函数
撤销
执行
在
函数
public.lookup (的名字)
从
公众的;
格兰特
执行
在
函数
public.lookup (的名字)
来
pgbouncer;
|
pgbouncer_override
这systemddropin文件覆盖关键选项默认PgBouncer单位文件,甚至永远不会被覆盖后更新PgBouncer Linux RPM / DEB包。
作为根用户,执行以下命令粘贴所提供的文件的内容pgbouncer_override:
|
1
|
systemctl
编辑
pgbouncer
|
|
1
2
3
4
5
6
7
|
#
# systemctl编辑pgbouncer
# systemctl daemon-reload
#
(
单位
]
需要=pgbouncer
.socket
|
pgbouncer.socket
这是秘密武器;该文件允许PgBouncer监听所有三个港口,6432,6433,6434。您将注意到,添加或删除端口是一个简单的添加或删除地址按下面所示的格式文件。
作为根用户:创建这个文件并执行守护进程重新加载:
|
1
|
六世
/等/systemd/系统/pgbouncer
.socket
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
|
#
#
六世
/等/systemd/系统/pgbouncer
。
套接字
#
systemctl
守护进程- - - - - -重新加载
#
(单位)
描述=套接字
为
PgBouncer
组成部分=pgbouncer
。
服务
(插座)
ListenStream=6432年
ListenStream=6433年
ListenStream=6434年
ListenStream= /var/运行/postgresql/。
年代
。
PGSQL
。
6432年
ReusePort=真正的
RemoveOnStop=真正的
(安装)
WantedBy=套接字
。
目标
|
|
1
|
systemctl
守护进程- - - - - -重新加载
|
把它放在一起
毕竟配置文件创建和编辑,这是我们得到的:
|
1
|
systemctl
重新启动
pgbouncer
|
|
1
|
netstat
- - - - - -tlnp
|
|
1
2
3
4
5
6
7
8
9
|
原型
Recv- - - - - -问
发送- - - - - -问
当地的
地址
外国
地址
状态
tcp
0
0
0.0.0.0
:
22
0.0.0.0
:*
听
tcp
0
0
127.0.0.1
:
5432年
0.0.0.0
:*
听
tcp
0
0
127.0.0.53
:
53
0.0.0.0
:*
听
tcp6
0
0
:
:
:
22
:
:
:*
听
tcp6
0
0
:
:
1
:
5432年
:
:
:*
听
tcp6
0
0
:
:
:
6432年
:
:
:*
听
tcp6
0
0
:
:
:
6433年
:
:
:*
听
tcp6
0
0
:
:
:
6434年
:
:
:*
听
|
最后,执行以下:
- sudo的Postgres
- 创建一个数据库db01
- 创建一个角色usr1 db01访问数据库
- pg_hba更新。conf and postgresql.conf allowing localhost connections by PgBouncer
现在验证端口:
|
1
2
3
4
5
6
|
为
u
在
5432年
6432年
6433年
6434年
做
回声
“= = = =端口:$ u = = = "
出口
PGHOST=本地主机
PGPORT=美元
u
PGDATABASE=db01
psql
“用户= = usr1 usr1密码”
- - - - - -c
“选择“hello world”作为问候”
完成
|
这是输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
|
= = = =
港口
:
5432年
= = =
问候
- - - - - - - - - - - - -
你好
世界
(
1
行
)
= = = =
港口
:
6432年
= = =
问候
- - - - - - - - - - - - -
你好
世界
(
1
行
)
= = = =
港口
:
6433年
= = =
问候
- - - - - - - - - - - - -
你好
世界
(
1
行
)
= = = =
港口
:
6434年
= = =
问候
- - - - - - - - - - - - -
你好
世界
(
1
行
)
|
结论
因为PostgreSQL从头设计与操作系统一起工作,例如,a UNIX type of operating system, we’ve been able to solve an interesting problem using a novel approach. And while systemd is ubiquitous, it isn’t normally considered part of a solution to a Postgres puzzle. We call this黑客
旅行快乐!
雷竞技下载官网Percona分布PostgreSQL提供最好的和最重要的开源社区的企业组件,在一个单一的分布,设计和测试一起工作。
今天下载Perco雷竞技下载官网na分布PostgreSQL !




