系统版本:Ubuntu12.04
数据库版本:postgresql-9.1.3
下载地址:http://ftp.postgresql.org/pub/source/v9.1.3/postgresql-9.1.3.tar.gz
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-dev
sudo apt-get install zlib1g-dev
sudo mkdir -p /data
tar zxvf postgresql-9.1.3.tar.gz
cd postgresql-9.1.3/
sudo ./configure --prefix=/data/pqsql
sudo make
sudo make install
sudo mkdir -p /data/pqsql/data0
sudo 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
cd /data/pqsql/data0/
vim pg_hba.conf
host replication repuser192.168.1.108/32 md5
#最后一行添加从机的ip 和用来复制的用户名密码
vim postgresql.conf
listen_addresses = '*'
max_wal_senders = 1
wal_level = hot_standby
archive_mode = on
archive_command = 'cd ./'
wal_keep_segments = 64
注:max_wal_senders是Slave库的节点数,有多少个slave库就设多少,
wal_level是write ahead log参数值,设置流复制务必将此值更新成hot_standby
wal_keep_segments默认值是16,是PG_XLOG下的日志文件大小archive也可以选择关闭,归档是定时恢复用的,流复制不是必须的
创建用来复制的用户:
cd /data/pqsql/bin/
postgres@Jmaes:/data/pqsql/bin$ ./psql
psql (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/ restart
Slave安装
sudo apt-get install lib64readline-gplv2-devlib64readline6-dev libreadline-dev readline-common libghc-readline-dev
sudo apt-get install zlib1g-dev
sudo mkdir -p /data
tar zxvf postgresql-9.1.3.tar.gz
cd postgresql-9.1.3/
sudo ./configure --prefix=/data/pqsql
sudo make
sudo make install
sudo mkdir -p /data/pqsql/data0
sudo 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/ stop
mv data0 data0.old
使用sudo的用户进行解压:
tar zxvf data0.tar.gz
使用postgres用户进行修改
cd /data/pgsql/data0
vim pg_hba.conf
host replication repuser192.168.1.10/32 md5
vim postgresql.conf
hot_standby = on
cp/data/pgsql/share/recovery.conf.sample /data/pgsql/data0/recovery.conf
standby_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:repuser
rm –rf pg_xlog
rm –rf postmaster.pid
mkdir pg_xlog
启动slave数据库
postgres@PostGres:/data/pgsql/bin$./pg_ctl -D ../data0 start
server starting
postgres@PostGres:/data/pgsql/bin$LOG: database system was interrupted;last known up at 2014-05-21 11:40:05 CST
LOG: creating missing WAL directory "pg_xlog/archive_status"
LOG: entering standby mode
LOG: streaming replication successfully connected to primary
LOG: redo starts at 0/3000020
LOG: consistent recovery state reached at 0/4000000
LOG: 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 stop
waiting for server to shut down.... done
server stopped
postgres@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.conf
recovery_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 = on
vim ../data0/postgresql.conf
hot_standby = on
vim ../data0/pg_hba.conf
host replication repuser192.168.1.10/32 md5
在现在的slave上创建:
vim .pgpass
192.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上执行插入动作:
转载于:https://blog.51cto.com/diudiu/1576195