合 pgpool-II-3.2.5入门教程
pgpool-II 入门教程
欢迎阅读 pgpool-II 入门教程。从本教程中,你将学会如何安装,设置 pgpool-II 以及使用 pgpool-II 运行并行查询和复制。我们假设你已经知道PostgreSQL的基础操作,所以如果有需要,请先参考 PostgreSQL 的文档。
1. 让我们开始吧!
首先,在使用复制和并行查询前,我们必须学习如何安装、配置 pgpool-II 和数据库节点。
1.1. 安装 pgpool-II
安装 pgpool-II 非常简单。在你解压源码 tar 包的目录中,执行以下命令。
1 2 3 | $ ./configure $ make $ make install |
configure
脚本收集你的系统信息并用于编译过程。你可以通过传递命令行参数到 configure
脚本来改变它的默认行为,例如安装目录。默认情况下,pgpool-II将安装到 /usr/local
目录。
make
命令编译源码,make install
命令将安装执行文件。你必须对安装目录有写入权限。
在本教材中,我们将安装 pgpool-II 到默认的 /usr/local
目录中。
注: pgpool-II 需要 PostgreSQL 7.4 或更高版本(版本 3 的协议)的 libpq 。如果 configure
脚本显示以下的错误信息,则可能是 libpq 库没有被安装或者它不是版本 3 的。
1 | configure: error: libpq is not installed or libpq is old |
如果是版本 3 的库,但还是显示了以上消息,则你的 libpq 库可能无法被 configure
脚本识别。
configure
脚本会在 /usr/local/pgsql
目录搜索 libpq 库。如果你安装 PostgreSQL 到 /usr/local/pgsql
之外的其他目录,在执行 configure
时,请使用 --with-pgsql
,或者同时使用 --with-pgsql-includedir
和 --with-pgsql-libdir
的命令行选项。
1.2. 配置文件
pgpool-II 的配置参数保存在 pgpool.conf
文件中。文件以每行 “parameter = value
” 的格式保存。当你安装 pgpool-II 后, pgpool.conf.sample
被自动建立。我们建议拷贝或者重命名它为 pgpool.conf
,然后你可以随意编辑它。
1 | $ cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf |
pgpool-II 默认只接受到 9999 端口的本地连接。如果你希望从其他主机接受连接,请设置 listen_addresses
为 '*'.
1 2 | listen_addresses = '*' port = 9999 |
建议配置,否则可能会报错如下的错误:
1 2 | FATAL: failed to create INET domain socket DETAIL: bind on socket failed with error "Cannot assign requested address" |
1.3. 配置 PCP 命令
pgpool-II 有一个用于管理功能的接口,用于通过网络获取数据库节点信息、关闭 pgpool-II 等。要使用 PCP 命令,必须进行用户认证。这种认证和 PostgreSQL 的用户认证不同。这需要在 pcp.conf 文件中定义一个用户和密码。在这个文件中,一个用户名和密码成对地出现在每一行中,它们用冒号(:)隔开。密码为用 md5 哈希加密的格式。
1 | postgres:e8a48653851e28c69d0506508fb27fc5 |
在你安装 pgpool-II时, pcp.conf.sample
被自动建立。我们建议复制一份并重命名为 pcp.conf
并且编辑它。
1 | $ cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf |
为了加密你的密码为 md5 哈希格式,请使用 pg_md5 命令,它作为 pgpool-II 执行文件套件的一部分被安装。pg_md5
使用一个命令行参数,并显示它的 md5 哈希文本。
例如,使用 “postgres” 作为命令行参数,pg_md5
会显示 md5 哈希的文本到标准输出。
1 2 | $ /usr/bin/pg_md5 postgres e8a48653851e28c69d0506508fb27fc5 |
PCP 命令通过网络执行,所以必须在 pgpool.conf
文件中配置 pcp_port
端口。
在本教程中,我们将使用默认的 9898 作为 pcp_port
的参数。
1 | pcp_port = 9898 |
1.4. 准备数据库节点
现在,我们需要设置用于 pgpool-II 的后台 PostgreSQL 服务器了。这些服务器可以与 pgpool-II 在同一台主机上,也可以在独立的主机上。如果你决定将所有服务器都放在同一台主机上,必须为每个服务分配不同的端口。如果服务器被安置在不同的机器上,他们必须被正确以便可以通过网络接受 pgpool-II 的连接。
在本教程中,我们将三台服务器放在与 pgpool-II 相同的机器上,分别给它们分配端口号 5432,5433,5434。要配置 pgpool-II,请如下编辑 pgpool.conf
。
1 2 3 4 5 6 7 8 9 | backend_hostname0 = 'localhost' backend_port0 = 5432 backend_weight0 = 1 backend_hostname1 = 'localhost' backend_port1 = 5433 backend_weight1 = 1 backend_hostname2 = 'localhost' backend_port2 = 5434 backend_weight2 = 1 |
分别为 backend_hostname
,backend_port
,backend_weight
设置节点的主机名,端口号和负载均衡系数。在每个参数串的后面,必须通过添加从0开始(例如 0,1,2,…)的整数来指出节点编号。
backend_weight
参数都为 1 ,这意味着 SELECT 查询被平均分配到三台服务器上。
1.5. 启动/停止 pgpool-II
要启动 pgpool-II,在终端中执行以下命令。
1 | $ pgpool |
然而,以上的命令不打印日志信息,因为 pgpool 脱离终端了。如果你想显示 pgpool 日志信息,你需要传递 -n
到 pgpool 命令。此时 pgpool-II 作为非守护进程模式运行,也就不会脱离终端了。
1 | $ pgpool -n & |
日志消息会打印到终端,所以推荐使用如下的选项。
1 | $ pgpool -n -d > /tmp/pgpool.log 2>&1 & |
-d
选项启用调试信息生成。
以上命令持续追加日志消息到 /tmp/pgpool.log
中。如果你需要切换日志文件,可以将日志传递到一个支持日志轮换功能的外部命令。例如,你可以使用 Apache2 带的 rotatelogs 工具。
1 2 | $ pgpool -n 2>&1 | /usr/local/apache2/bin/rotatelogs \ -l -f /var/log/pgpool/pgpool.log.%A 86400 & |
这将生成名称类似于 “pgpool.log.Thursday
” 的日志文件,然后在每天午夜 00:00 轮换日志文件。如果日志文件已经存在,rotatelogs 将追加日志到这个文件中。如果想在轮换前删除旧日志文件,你可以使用 cron:
1 | 55 23 * * * /usr/bin/find /var/log/pgpool -type f -mtime +5 -exec /bin/rm -f '{}' \; |
请注意 rotatelogs 在某些发行版中可能存在于 /usr/sbin/rotatelogs2
。-f 选项让 rotatelogs 在启动的时候生成一个日志文件,这个功能随 apache 2.2.9 或更高版本提供。
而且 cronolog
对你可能有用。
1 2 3 | $ pgpool -n 2>&1 | /usr/sbin/cronolog \ --hardlink=/var/log/pgsql/pgpool.log \ '/var/log/pgsql/%Y-%m-%d-pgpool.log' & |
要停止 pgpool-II 进程,执行以下的命令。
1 | $ pgpool stop |
如果还有客户端连接着, pgpool-II 等待它们断开连接,然后才结束运行。如果你想强制关闭 pgpool-II ,执行以下的命令来代替之前的命令。
1 | $ pgpool -m fast stop |
2. 你的第一个复制
复制可以让相同的数据拷贝到多个数据库节点。
在本节中,我们将使用三个已经在“1. 让我们开始吧!”小节中设置好了的数据库节点,一步步建立数据库复制系统。用于复制的示例数据将由 pgbench 基准测试程序生成。
2.1. 配置复制
要启用数据库复制功能,需要设置 pgpool.conf
文件中的 replication_mode
为 true 。
1 | replication_mode = true |
当 replication_mode
被设置为 true,pgpool-II 将发送一份接收到的查询的拷贝到所有的数据库节点。
当 load_balance_mode
被设置为 true,pgpool-II 将在数据库节点之间分发 SELECT 查询。
1 | load_balance_mode = true |
在本章中,我们将同时启用 replication_mode
和 load_balance_mode
。
2.2. 检查复制
要使 pgpool.conf
中的改动生效,必须重启 pgpool-II 。请参考“1.5 启动/停止 pgpool-II”小节。
在配置完 pgpool.conf
且重新启动 pgpool-II 后,让我们试试复制,检查它是否工作正常。
首先,我们需要建立一个用于复制的数据库。我们将给它命名为“bench_replication”。这个数据库需要被建立在所有的节点中。在 pgpool-II 中使用 createdb
命令,数据库将被在所有节点中建立。
1 | $ createdb -p 9999 bench_replication |
然后,使用 -i
选项执行 pgbench。-i
使用预设的表和数据初始化这个数据库。
1 | $ pgbench -i -p 9999 bench_replication |