PostgreSQL:十六. 高可用、负载均衡和数据复制
十六. 高可用、负载均衡和数据复制
16.1 常见的数据同步解决方案
- 共享磁盘故障转移
- 文件系统复制
- 事务日志
- 基于语句的复制
- 异步复制
- 同步复制
16.2 日志传送备用服务器
1、日志传送概述
使用日志传送,有以下几点好处。
- 无需昂贵的软件或硬件即可实现冗余故障转移系统。
- 备用服务器可以用于其它用途。而不必长期闲置。例如,当辅助数据库因处理进入的日志文件而处于不可访问状态时,可以在备用服务器上运行另一个独立数据库。
- 一旦设置好,配置成本相对低廉并且易于维护。
- 有非常可靠的方法用于提供数据库的冗余副本。
- 实现和维护配置的成本相对低廉。
- 支持本地位置和远程灾难恢复方案。
预写式日志(WAL)是一种实现事务日志的标准方法。通过在备用服务器上的restore_command,可以使两个服务器协同工作。它只是等候主服务器的下一个可用WAL文件。restore_command在备份服务器的recovery.conf 文件中指定。普通的恢复过程需要来自WAL归档的文件,如果无法获取则报告错误。对于备份过程来说,下一个可用WAL 件通常不能马上获取,所以必须耐心等待直到它出现。通过书写代码可以实现等待并判断下一个WAL文件是否可用的目的。同时必须有触发失效切换的机制,它应当中断restore_command,跳出循环并向备份服务器返回一个”文件未找到”的错误。这将导致备份服务器结束恢复过程并取代已失效的主服务器。
2、设置备用服务器
第一步:安装主服务器和备份服务器并尽可能保持完全相同,包括完全相同的数据库副本和 PostgreSQL版本。
第二步:设置从主服务器连续归档WAL到备份服务器上的某个目录。确保主服务器上的 archive_command和 archive_timeout设置恰当。
第三步:为主服务器做一个基础备份,然后在备份服务器上还原这个备份。
第四步:在备份服务器上依照 WAL 归档启动恢复过程,注意在 recovery.conf 中使用正确的 restore_command 设置。
16.3 数据流的复制
1、流复制概述
流复制是异步的,所以在数据同步中,会有一个小的延迟。这个延迟远小于基于文件日志传送,通常1秒内足够与负载保持均衡。流复制有以下几个优点。
- 流复制对于数据库性能的影响更小。
- 流复制相对于其他复制相比,所需的硬件成本较小。
- 流复制更加灵活,支持异构数据库对象的同步。
要使用流复制,建立一个基于文件的日志传送备服务器。需要注意以下设置。
- 将一个基于文件的日志传送备服务器转为流复制备服务器,在recovery.conf文件中设置primary_conninfo 指向主服务器。在主服务器上设置listen_addresses和身份验证选项(设置文件pg_hba.conf),因此备用服务器可以连接到在主服务器的replication数据库。
- 在系统上支持保持活动的的套接字选项,设置tcp_keepalives_idle,tcp_keepalives_interval和tcp_keepalives_count帮助主机及时发现断开的连接。
- 设置备用服务器的最大并发连接数。
- 当启动了备服务器并且正确设置了primary_conninfo,该备服务器在回放所有可用的WAL文件后,将连接到主服务器。如果成功建立了该连接,将在备服务器中看到WAL接收进程,并且在主服务器相应的一个WAL发送进程。
2、身份验证
设置复制的访问权限是很重要的,只有受信任的用户可以读取WAL流,因为很容易从中提取权限信息。备用服务器必须验证作为主服务器的超级用户。所以需要在主服务器上创建一个有SUPERUSER和LOGIN权限的角色
16.4 数据的同步复制
1、同步复制概述
同步复制可以保证所有的数据交易被转移到一个同步的备用服务器中。在同步复制时,每次提交事务时将等待,直到收到确认提交已被写入到磁盘中,然后在主服务器和备用服务器上记录事务日志。
同步复制技术的应用,可以保证主服务器不在线或者崩溃的情况下,任何已提交事务的数据都不会丢失。对于同步复制来 说,事务在返回前需要被写到两个服务器的磁盘上,因此会在响应时间上带来很大的损失。为了缓解这种情况,PostgreSQL除了像其它数据库系统一样提供同步复制功能 外,还额外提供一个可以基于每一次事务提交而做出同步或异步复制的控制功能。这将使应用开发者通过把一些不可丢失的关键数据(比如财务交易)和那些响应时间上要求高的不太关键的数据区分开,来优化系统的性能。
2、同步复制应用案例
步骤1:在主和从服务器上创建replicaton角色为repl:
shell>psql
ode=#CREATE ROLE repl REPLICATION LOGIN PASSWORD ‘123456’
步骤2:在主和从服务器上创建语言plpgsql:
node=# use node;
node=# create language plpgsql;
步骤3:在备用服务器上修改pg_hba.conf配置:
host replication replication_role 192.168.1.15/32 md5
步骤4:在主服务器上备份数据库:
pg_dump node > node_20121120.dmp
步骤5:在备用服务器恢复数据库node :
postgres=#create database node;
postgres=#\q
shell>psql node < node_20121120.dmp ;
步骤6:在备用服务器的数据库/export/script目录下创建一个脚本replication.
步骤7:启动脚本:
./replication start
步骤8:在主服务器的数据库上空表public.hxf中添加一条记录:
insert into hxf(uid,uname) select 1,‘tianyi’;
步骤9:在主服务器的数据库查询:
node=# select * from hxf;
uid | uname
-——±——————
1 | tianyi
(1 row)
步骤10:在备用服务器的数据库中查询:
node=# select * from hxf;
uid | uname
-——±——————
1 | tianyi
(1 row)
还没有评论,来说两句吧...