9.4 设置复制和负载均衡

要配置pgpool,我们可以简单地使用一个包含一种典型的配置信息的已经存在的样本文件,将它拷贝到我们的配置目录并修改之:

$ cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf

改写这个配置文件比从头写这个文件要容易的多。在下面的列表中,您将看到一个实例配置,您可以把它用于两个节点的简单配置:

listen_addresses = 'localhost'

port = 9999

socket_dir = '/tmp'

pcp_port = 9898

pcp_socket_dir = '/tmp'

backend_hostname0 = 'localhost'

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = '/home/hs/db'

backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'localhost'

backend_port1 = 5433

backend_weight1 = 1

backend_data_directory1 = '/home/hs/db2'

backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = off

pool_passwd = 'pool_passwd'

authentication_timeout = 60

ssl = off

num_init_children = 32

max_pool = 4

child_life_time = 300

child_max_connections = 0

connection_life_time = 0

client_idle_limit = 0

connection_cache = on

reset_query_list = 'ABORT; DISCARD ALL'

replication_mode = on

replicate_select = off

insert_lock = on

load_balance_mode = on

ignore_leading_white_space = on

white_function_list = ''

black_function_list = 'nextval,setval'

现在让我们来详细讨论这些设置,看看每个设置的意义:

• pid_file_name: 就像大多数软件组件一样,pgpool会写一个PID文件。我们可以精确地定义这个文件的位置。通常PID文件处于/var/目录下面。

• listen_addresses: 这个设置和PostgreSQL的listen_address设置一样。这里的想法是这个设置定义监听哪些IP地址。

• port: 这个设置定义了哪个系统上的TCP端口将会被监听。

• socket_dir: 没有使用TCP端口的硬性要求。UNIX套接字也是可以的。socket_dir将定义这些UNIX套接字存放在哪里。

• pcp_port: 管理界面将会监听哪个TCP端口。

• pcp_socket_dir: 管理界面将会使用的UNIX套接字目录。

• backend_hostname0:在我们的设置中的第一个数据库主机名。

• backend_port0:该系统的TCP端口。

• backend_weight0:在pgpool中,我们可以设置独立节点的权重。权重较高的节点将会自动确保较多的请求会发送到该节点。

• backend_data_directory0: 属于该实例的PGDATA目录。

• backend_flag:这个设置告诉pgpool是否一个节点允许故障转移。

允许两个设置: ALLOW_TO_FAILOVER 和 DISALLOW_TO_FAILOVER。

• enable_pool_hba:如果该设置为true,pgpool将使用pool_hba.conf进行身份验证。这里pgpool遵循PostgreSQL相同的概念。

• pool_passwd: pgpool的密码文件。

• authentication_timeout: 为连接池身份验证定义超时时间。

• ssl: 如果该设置被设置为true,客户端和后端连接将启动SSL。

• num_init_children: 当pgpool启动时,一些连接将被预先分配出来,确保响应时间保持在低水平。该设置将定义初始子进程的数目。默认值为32。

• max_pool: 该设置定义了每个连接池尺寸的最大值。

请注意,从pgpool进程到后端的连接数可能达到num_init_children * max_pool。该参数只能在服务器启动是设置。

• child_life_time: 这里定义了允许一个子进程在它被终止之前所允许的秒数。

• child_max_connections:   这个数目的连接连到相同的子进程之后,它将被终止。换而言之,一个进程在它被回收在利用之前,它将处理如此多的连接。

• connection_life_time: 这会告诉您在一个连接被回收利用之前,它将存活多久。

• client_idle_limit: 如果一个子进程已经闲置了这么长的时间,它将断开以客户端。

• connection_cache: 如果该设置为true,到(存储)后端的连接将被缓存。

• reset_query_list: 这里定义了一个命令行列表,当一个客户端推出一个会话是,它必须被执行。它用于清理一个连接。

• replication_mode: 这将明确地打开复制,默认值为false。

• replicate_select: 我们是否应该复制SELECT语句?

• insert_lock:当复制有关联(数据类型序列)的表时,pgpool必须确保这些数据保持同步。

• load_balance_mode: pgpool是否该把负载分割到系统中的所有主机上?默认值为false。

• ignore_leading_white_space: 以空白开始的查询是否该被忽略?

• white_function_list: 当pgpool运行一个存储过程,pgpool不知道它实际在做什么。SELECT func() 可以是读操作或者写操作—没有办法从外部知道实际会发生什么。white_function_list允许您教pgpool哪些函数可以安全地进行负载均衡。如果一个函数写入数据,它一定不是负载均衡的,否则数据将不会同步到这些服务器上。不同步一定节省了任何开销。

• black_function_list: 这与white_function_list相反。它会告诉 pgpool 哪些函数必须被复制,以确保事情保持同步。

请记住,在max_pool和pgpool的子进程之间有一个重要的关系。单个子进程可以处理max_pool个连接。

9.4.1 密码认证

一旦您完成了一个pgpool配置文件,我们就可以进一步配置身份验证。在我们的例子中,我们想添加一个叫 hs 的用户。hs的密码仅仅是hs。pool_passwd将负责存储密码。该文件的格式很简单:它将保存用户的名字,冒号,和MD5加密的密码。

要加密一个密码,我们可以使用pg_md5脚本:

$ pg_md5 hs

789406d01073ca1782d86293dcfc0764

然后,我们可以把所有这些东西添加到存储用户和密码的配置文件。在pgpool的例子中,这个文件是pcp.conf:

# USERID:MD5PASSWD

hs:789406d01073ca1782d86293dcfc0764

9.4.2 启动pgpool和测试设置

既然我们已经把所有的组件都放到了各自的位置,我们可以启动pgpool了:

$ pgpool –f /usr/local/pgpool/pgpool.conf

如果没有错误,我们应该看到几等待来自客户端的工作的个进程在那里:

$ ps ax | grep pool

30927 pts/4 S+ 0:00 pgpool -n

30928 pts/4 S+ 0:00 pgpool: wait for connection request

30929 pts/4 S+ 0:00 pgpool: wait for connection request

30930 pts/4 S+ 0:00 pgpool: wait for connection request

30931 pts/4 S+ 0:00 pgpool: wait for connection request

30932 pts/4 S+ 0:00 pgpool: wait for connection request

正如您可以清晰地看到,pgpool将在进程表中显示几个进程。

9.4.3 连接主机

基本上,我们已经可以连接到pgpool,并执行查询—但是,这将会立即导致灾难和不一致。在我们继续执行一些实际的操作之前,我们应该检查一下集群中所有节点的状态。要这样做,我们可以使用一个叫做pcp_node_info 的工具:

$ pcp_node_info 5 localhost 9898 hs hs 0

localhost 5432 3 0.500000

$ pcp_node_info 5 localhost 9898 hs hs 1

localhost 5433 2 0.500000

如果这是您第一次看到它,这种调用pcp_node_info的格式有点复杂并且不容易阅读。

请注意,这里权重都是0.5。在配置中,我们已经设置了两个后端的权重都为1。pgpool已经自动调整 了权重,以便它们相加结果为1。

这里是 pcp_node_info 的语法:

pcp_node_info - display a pgpool-II node's information

Usage: pcp_node_info [-d] timeout hostname port# username password nodeID

-d, --debug : enable debug message (optional)

timeout : connection timeout value in seconds.

command exits on timeout

hostname : pgpool-II hostname

port# : PCP port number

username : username for PCP authentication

password : password for PCP authentication

nodeID : ID of a node to get information for

Usage: pcp_node_info [options]

Options available are:

-h, --help : print this help

-v, --verbose : display one line per information

with a header

第一个参数是timeout。它将定义一个请求的最大时间。然后我们知道那个主机和PCP端口基础设施。最后,我们通过用户名和密码,以及我们想要的信息的主机的数量。该系统将响应主机名,端口,状态和节点的权重。在我们的例子中,我们必须把注意力集中到状态列。它可以返回四个不同的值。

• 0: 这个状态只在初始化时使用。PCP永远都不会显示它。

• 1: 节点运行。但没有连接。

• 2: 节点运行。连接在连接池中。

• 3: 节点关闭。

在我们的例子中,我们可以看到节点1基本上返回状态3—它是关机的。这显然是一个问题,如果我们现在执行写操作。它不会在两个节点结束,而是只在它们中的一个节点结束。

要解决这个问题,我们可以调用 pcp_attach_node并使节点工作:

$ pcp_attach_node 5 localhost 9898 hs hs 0

$ pcp_node_info 5 localhost 9898 hs hs 0

localhost 5432 1 0.500000

一旦我们增加了节点,我们可以 再次检查它的状态。它的状态将是开机并运行。

为了测试我们的设置,我们可以检查psql并显示系统中的数据库列表:

$ psql -l -p 9999

List of databases

Name | Owner | Encoding | Collate | Ctype ...

----------+-------+-----------+-------------+-- ...

postgres | hs | SQL_ASCII | en_US.UTF-8 | C ...

template0 | hs | SQL_ASCII | en_US.UTF-8 | C ...

template1 | hs | SQL_ASCII | en_US.UTF-8 | C ...

(3 rows)

答案和我们预期的议案。我们可以看到一个空的数据库实例。

PostgreSQL Replication之第九章 与pgpool一起工作(4)的更多相关文章

  1. PostgreSQL Replication之第九章 与pgpool一起工作(7)

    9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...

  2. PostgreSQL Replication之第九章 与pgpool一起工作(6)

    9.6 运行pgpool和流复制 pgpool也可以和除了语句级别的复制之外的流复制一起使用.一个完美的方案是使用PostgreSQL的板载复制和仅仅使用pgpool的负载均衡与连接池. 实际上,这样 ...

  3. PostgreSQL Replication之第九章 与pgpool一起工作(3)

    9.3 理解pgpool的架构 一旦我们安装了pgpool,是时候来讨论软件架构了.从一个用户的角度看,pgpool就像一个 正常的数据库服务器,您可以想连接任何其他服务器一样连接到它: pgpool ...

  4. PostgreSQL Replication之第九章 与pgpool一起工作(1)

    在前面的章节中,我们已经能够深入地理解了pgbouncer,同时也学会了如何使用它来尽可能地优化复制设置.在本章我们将了解一个经常被称作与pgbouncer相对应的工具.尽管pgpool的思想与pgb ...

  5. PostgreSQL Replication之第九章 与pgpool一起工作(2)

    9.2 理解pgpool的功能 pgpool提供了如下功能: •连接池 •语句级别的复制 •负载均衡 •限制连接 •内存缓存 •并行查询 [当决定使用那些功能的时候,记住并非所有的功能可以在同一时间使 ...

  6. PostgreSQL Replication之第九章 与pgpool一起工作(5)

    9.5 检查复制 如果所有的节点都处于开机并运行的状态.我们就可以在集群上运行我们的第一个操作了.在我们的例子中,我们将简单地连接到pgpool并创建一个新的数据库.createdb 是一个命令行工具 ...

  7. PostgreSQL Replication之第一章 理解复制概念(1)

    PostgreSQL Replication系列翻译自PostgreSQL Replication一书 在本章中,将会介绍不同的复制概念,您会了解哪些类型的复制对哪一种实用场景是最合适的. 在本章的最 ...

  8. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(5)

    2.5 XLOG的内部结构 我们将使用事务贯穿本书,并让您在技术层面上更深地洞察事情是如果工作的,我们已经增加了这部分专门处理XLOG的内部工作机制.我们会尽量避免前往下降到C级,因为这将超出本书的范 ...

  9. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(4)

    2.4 调整检查点和XLOG 目前为止,这一章已经提供深入洞察PostgreSQL如何写入数据,一般来说,XLOG是用来干什么的.考虑到这方面的知识,我们现在可以继续并学习我们能做些什么来使我们的数据 ...

随机推荐

  1. PyCharm基本设置、常用快捷键

    1. 下载安装 PyCharm官方下载地址:  https://www.jetbrains.com/pycharm/download/index.html#section=windows 安装完成后在 ...

  2. git使用(公钥私钥产生--远程库添加公钥--本地库关联远程库-使用)

    原文1:http://www.cnblogs.com/wangmingshun/p/5424767.html 原文2(指令):http://blog.csdn.net/xiaohanluo/artic ...

  3. Redis-1-安装

    Redis-1-安装 标签(空格分隔): linux,redis 下载 cd /usr/local/src/ wget http://download.redis.io/releases/redis- ...

  4. 解决JavaScript浮点数(小数) 运算出现Bug的方法

    解决JS浮点数(小数) 运算出现Bug的方法例如37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, ...

  5. C++调用约定和名字约定 thiscall

    调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...

  6. Python 批量处理特定格式文件

    #批量对文件夹下的'.mat'进行处理 def file_name(file_dir,suff): L=[] for root, dirs, files in os.walk(file_dir): f ...

  7. c/s结构的自动化——pyautogui

    环境:Python 3.5.3 pip install pyautogui -i http://pypi.douban.com/simple --trusted-host pypi.douban.co ...

  8. AWS中国EC2 公网IP登录免pemKEY修改shh 配置文件

    个人使用记录 1:KEY 授权 chmod 400 VPN.pem 2:连接 ssh -i "VPN.pem" ubuntu@ec2-54-183-119-93.us-west-1 ...

  9. 题解 洛谷 P4047 【[JSOI2010]部落划分】

    我觉得几乎就是一道最小生成树模板啊... 题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解 (虚边为能选的边,实边为最小生成树) 令n=5,k=2,(1,3)<(1,2)< ...

  10. MarkDown写作之嵌入LaTeX和HTML

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49788741 Markdown 是一种 ...