系统版本:Ubuntu12.04

数据库版本:postgresql-9.1.3

下载地址:

Master 192.168.1.10

Slave 192.168.1.108

Master PostgreSQL安装:

sudo apt-get  install lib64readline-gplv2-devlib64readline6-dev libreadline-dev readline-common libghc-readline-devsudo apt-get install zlib1g-devsudo mkdir -p /datatar zxvf postgresql-9.1.3.tar.gzcd postgresql-9.1.3/sudo ./configure --prefix=/data/pqsqlsudo makesudo make installsudo mkdir -p /data/pqsql/data0sudo chown -R postgres:postgres /data/pqsql/data0/sudo su – postgres/data/pqsql/bin/initdb  -D /data/pqsql/data0//data/pqsql/bin/pg_ctl   -D /data/pqsql/data0/ startcd /data/pqsql/data0/vim pg_hba.confhost   replication     repuser192.168.1.108/32        md5

#最后一行添加从机的ip 和用来复制的用户名密码

vim postgresql.conflisten_addresses = '*'max_wal_senders = 1wal_level = hot_standbyarchive_mode = onarchive_command = 'cd ./'wal_keep_segments = 64

注:max_wal_sendersSlave库的节点数,有多少个slave库就设多少,

wal_levelwrite ahead log参数值,设置流复制务必将此值更新成hot_standby

wal_keep_segments默认值是16,PG_XLOG下的日志文件大小archive也可以选择关闭,归档是定时恢复用的,流复制不是必须的

创建用来复制的用户:

cd /data/pqsql/bin/postgres@Jmaes:/data/pqsql/bin$ ./psqlpsql (9.1.3)Type "help" for help. postgres=# CREATE USER repuser replicationLOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'repuser';postgres=#\q

重启master数据库

./pg_ctl -D ../data0/ restartSlave安装sudo apt-get  install lib64readline-gplv2-devlib64readline6-dev libreadline-dev readline-common libghc-readline-devsudo apt-get install zlib1g-devsudo mkdir -p /datatar zxvf postgresql-9.1.3.tar.gzcd postgresql-9.1.3/sudo ./configure --prefix=/data/pqsqlsudo makesudo make installsudo mkdir -p /data/pqsql/data0sudo chown -R postgres:postgres /data/pqsql/data0/sudo su – postgres/data/pqsql/bin/initdb  -D /data/pqsql/data0//data/pqsql/bin/pg_ctl   -D /data/pqsql/data0/ start

确保可以正常启动就OK

开始同步操作:

备份主库(master

登陆master主库执行:

postgres=# selectpg_start_backup('replication work');

打开另外一个终端,切换到root进行打包备份:

cd /data/pqsql/tar zcvf data0.tar.gz  --exclude=data0/pg_xlog   data0/scpdata0.tar.gz  james@192.168.1.108:/tmp

返回master库上执行,停止备份操作:

postgres=# selectpg_stop_backup(),current_timestamp;

从库上操作:

使用具有sudo权限的用户:

Sudp cp /tmp/data0.tar.gz  /data/pqsql/

然后使用postgres用户停止数据库服务

/data/pqsql/bin/pg_ctl   -D /data/pqsql/data0/ stopmv data0 data0.old

使用sudo的用户进行解压:

tar zxvf data0.tar.gz

使用postgres用户进行修改

cd /data/pgsql/data0vim pg_hba.confhost   replication     repuser192.168.1.10/32        md5vim postgresql.confhot_standby = oncp/data/pgsql/share/recovery.conf.sample /data/pgsql/data0/recovery.confstandby_mode = 'on'primary_conninfo = 'host=192.168.1.10port=5432 user=repuser password=repuser keepalives_idle=60'trigger_file ='/data/pgsql/data0/postgresql.trigger.1949'

配置.pgpass文件

192.168.1.10:5432:postgres:repuser:repuserrm –rf pg_xlogrm –rf postmaster.pidmkdir pg_xlog

启动slave数据库

postgres@PostGres:/data/pgsql/bin$./pg_ctl  -D ../data0    startserver startingpostgres@PostGres:/data/pgsql/bin$LOG:  database system was interrupted;last known up at 2014-05-21 11:40:05 CSTLOG: creating missing WAL directory "pg_xlog/archive_status"LOG: entering standby modeLOG: streaming replication successfully connected to primaryLOG: redo starts at 0/3000020LOG: consistent recovery state reached at 0/4000000LOG: database system is ready to accept read onlyconnections

测试是否正常:

Master上:

CREATE TABLE rep_test (test varchar(40));INSERT INTO rep_test VALUES ('data one');INSERT INTO rep_test VALUES ('some morewords');INSERT INTO rep_test VALUES ('lalala');INSERT INTO rep_test VALUES ('hellothere');INSERT INTO rep_test VALUES ('blahblah');

slave上查询:

postgres=# select * from rep_test;     test      ----------------- dataone somemore words lalala hello there blahblah(5 rows) postgres=#

数据库可以看到已经同步过来。

 

主备服务器的判断:

看到此信息的肯定是master服务器

看到此信息的肯定是slave服务器

 

模拟master down 机,slave切换为master

主机停止前的备机进程:

Master停机

postgres@PostGres:/data/pgsql/bin$./pg_ctl  -D ../data0 stopwaiting for server to shut down.... doneserver stoppedpostgres@PostGres:/data/pgsql/bin$

查看备机状态

备机切换成主机

之前备机上的recovery.conf中配置了 trigger_file = '/database/pgdata/trigger.kenyon' 要切换备机成主机,只要创建一个触发文件trigger.kenyon即可,这个名字可以随便写

touch /data/pgsql/data0/postgresql.trigger.1949

已经变成production了,对,备机切主机就这么简单。

还有一处明显的变化是现在的主机上的recovery.conf文件名字变成了recovery.done

备机切换为主机后,就可以正常连接使用了。此时就有时间去处理原master端问题了。

现在备机可以正常提供服务了,下来要把原有的master切换为slave

在现在的master上做一些操作:

REATE TABLE slave (test varchar(40));INSERT INTO slave  VALUES  ('welcome to beijing');

在现在的备机上准备恢复文件:

cp/data/pqsql/share/postgresql/recovery.conf.sample  /data/pqsql/data0/recovery.confrecovery_target_timeline = 'latest'primary_conninfo = 'host=192.168.1.108port=5432 user=repuser password=repuser'trigger_file = '/data/pgsql/data0/postgresql.trigger.1949'standby_mode = onvim ../data0/postgresql.confhot_standby = onvim ../data0/pg_hba.confhost   replication     repuser192.168.1.10/32 md5

在现在的slave上创建:

vim .pgpass192.168.1.11:5432:postgres:repuser:repuser

然后重启先有的slave服务器

如果遇到这种时间线不一致的问题:

在现有的master上执行如下操作:

scp 00000002.history postgres@192.168.1.10:/data/pqsql/data0/pg_xlog

然后启动现有的slave主机:

postgres@Jmaes:/data/pqsql/bin$./pg_ctl  -D ../data0 start

成功切换

INSERT INTO  slave   values ('now slave is ok');

现有的slave上执行插入动作: