Linux系统中postgresql双机热备(流复制)

来源:互联网 发布:读取身份证照片软件 编辑:程序博客网 时间:2024/05/17 08:37

环境:
宿主机系统:windows7

虚拟机:Oracle VMVirtualBox

Linux: ubuntukylin-14.04.1-amd64.iso

postgresql:9.3.12


虚拟主机2台
MASTER: 192.16.41.125
 SLAVE:    192.16.41.121

数据存储位置
/var/lib/postgresql/9.3/main/

 

/var/lib/postgresql/9.3/main/

 

Step1:安装PG数据库
安装过程可参考:http://blog.csdn.net/lanonola/article/details/51376640

mater端安装,并初始化数据

slave端可以只装数据库,不初始化数据库

Step2:初始化master数据库

1.利用pgadmin工具,将tewoo_pj中的数据进行备份,tewoo_pj_back.backup

2.将备份好的tewoo_pj_back.backup文件,恢复到master库中。
Step3:创建流复制用户

master端执行: CREATE USER repuser replication LOGIN CONNECTION LIMIT 3ENCRYPTED PASSWORD 'repuser'; 

Step4:配置Master端的访问文件pg_hba.conf    

cd /etc/postgresql/9.3/main

vim pg_hba.conf

增加一行:
host replication repuser 192.16.41.121/16 md5

Step5:配置MASTER端配置文件 postgresql.conf

cd /etc/postgresql/9.3/main

vim postgresql.conf

 

max_wal_senders = 1
wal_level = hot_standby

archive_mode = on 
archive_command = 'cd ./'

hot_standby = on
wal_keep_segments = 64

  注:max_wal_senders是Slave库的节点数,有多少个slave库就设多少,
      wal_level是write ahead log参数值,设置流复制务必将此值更新成hot_standby
     wal_keep_segments默认值是16,是PG_XLOG下的日志文件数相关参数
    archive也可以选择关闭,归档是定时恢复用的,流复制不是必须的

Step6:主库备份(Master端)
6.1:开启文件备份,前提是wal_level参数值必须是archive或者hot_standby,前面已做
select pg_start_backup('Replition work');

6.2:拷贝master端/var/lib/postgresql/9.3/main/文件夹,并复制到Slave服务器上,排除pg_xlog内容,排除pg_xlog内容

打包

cd   /var/lib/postgresql/9.3/
tar czvf  main.tar.gz main--exclude=main/pg_xlog 
备机端如果已经安装了postgres数据库,数据文件夹名称一样的话,可以先停掉备机数据库,改名数据文件夹名称
mv main /var/lib/postgresql/9.3/main.old

远程拷贝至slave端并在备机端解压
1.scp main.tar.gz root@192.16.41.126:/var /lib/postgresql/9.3

报错:ssh:connect to host 192.16.41.121 port 22 :Connection refused lostconnection

具体的解决方法见:http://blog.csdn.net/lanonola/article/details/51384956
2.tar  xzvf  main.tar.gz

 6.3:上述步骤完成后,结束master端的备份

select pg_stop_backup(),current_timestamp;

Step7:修改Slave端配置信息

7.1:postgresql.conf文件
 hot_standby = on

7.2:recovery.conf文件(注意该文件的存放位置),放在数据相关文件夹下,和postgresql.conf的位置不同

将usr/share/postgresql/9.3/recovery.conf.sample文件拷贝到

/var/lib/postgresql/9.3/main文件夹下,重命名为recovery.conf

新增以下内容:

 standby_mode = 'on'

 primary_conninfo ='host=192.16.41.125  port=5432 user=repuser password=repuserkeepalives_idle=60'

Step8:启动Slave
正常启动备库,有异常可以看log

Step9:测试

On Master:
CREATE TABLE  t

(

  id integer NOTNULL,

  name charactervarying(20),

  CONSTRAINTt_pkey PRIMARY KEY (id)

)

INSERT INTO t(id, name)VALUES (1, 'xxxxxxxxx');

INSERT INTO t(id, name)VALUES (2, 'xxxxxxxxx');
On Slave:

select * from t;

update t set name = 'YYYYY' where id=1;

delete from t where id = 2;

ERROR:  cannot execute UPDATE in a read-onlytransaction

ERROR:  cannot execute DELETE in a read-onlytransaction


新增的数据已经传输过去,且slave端的会话为只读,不能进行update和delete操作。

 

遇到的问题:

备份完成后,slave库的服务无法启动:

原因:权限问题

解决方法:在建与postgresql有关的文件或者文件夹的时候,不要用root,要切换到postgres用户,否则会报权限不足。


0 0
原创粉丝点击