主机环境:

hostname
ip
app
elink-master
192.168.180.222
postgresql-9.5
elink-slave
192.168.180.223
postgresql-9.5

一、两台主机间的无密访问

由于debian中不允许root直接登录,修改sshd_config中premitrootlogin...注释掉,并修改验证RSQAuthentication\PubKeyAuthentication为yes不过默认debian不用,只要取消authorizedkeysfile即可

root@elink-master#:ssh-keygen -t dsa,(过程中出现三个需要输入的地方直接按回车键)

root@elink-master#:ssh-copy-id -i .ssh/id_dsa.pub root@192.168.180.223

ssh root@192.168.180.223测试是否OK,另外一边同理

postgres用户也做好!否则同步archive的时候会没法同步


二、安装pg9.5

安装key:wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc |  apt-key add -

apt-get update

apt-get install postgresql-9.5 rsync

设置pg_hba.conf\postgresql.conf\passwd postgres重置操作系统用户密码\重置postgres数据库密码

alter user postgres with password 'postgres';

增加超级用户repuser用于流复制

create user repuser superuser password 'repuser';


三、elink-master配置

1、停止服务:/etc/init.d/postgresql stop

2、修改postgresql.conf配置文件,目录在/etc/postgresql/9.5/main

listen_addresses= '*'
wal_level =hot_standby#流复制打开
archive_mode =on#把pg-xlog归档到对方的机器
archive_command= 'rsync -av %p postgres@192.168.180.223:/usr/local/pgsql/archive/%f‘#看情况修改,一般备份到备机,备机注意保留pg_controldata中Latest checkpoint's REDO WAL file:其他可以删除,但是建议还是保留最近10份即可,不然备机会被撑爆!
archive_timeout= 300
max_wal_senders= 2#允许多少个流复制协议连接过来。一个流复制协议会产生一个walsender进程(一个master可能会有多个standby节点进行流复制)
wal_keep_segments= 300#xlog目录中最多容纳多少个wal日志文件,超过了则删掉最初的几个。(一个日志文件16M)
hot_standby= on#standby节点是否允许执行SQL查询(当然推荐打开了)。
track_counts=on#autovacuum必须开启
autovacuum = on#自动vacuum(不锁表,不压缩空间)
#如果要vacuum all(索表压缩空间)请参考http://www.cnblogs.com/littlehb/archive/2013/04/28/3048892.html,具体原理参数详解: http://www.cnblogs.com/daduxiong/archive/2010/10/11/1847975.htmlhttp://blog.163.com/digoal@126/blog/static/163877040201343031118890/

3、在/var/lib/postgresql/9.5/main下创建recovery.done,注意用户chown postgres.postgres ...

restore_command = 'cp /var/lib/postgresql/archive/%f %p'
recovery_target_timeline='latest'
standby_mode = 'on'
primary_conninfo= 'host=192.168.180.223 port=5433 user=repuser password=repuser'

4、修改pg_hba.conf,目录在/etc/postgresql/9.5/main

 最后一行添加内容如下:

host    replication     repuser     192.168.180.0/24    trust
#主备机子内网互信
host    all            all     0.0.0.0/0    md5


四、elink-slave配置

1、确保停止服务:/etc/init.d/postgresql stop

2、修改postgresql.conf,pg_hba.conf配置文件(一模一样参考主机),目录在/etc/postgresql/9.5/main

3、在/var/lib/postgresql/9.5/main下创建recovery.conf,内容参考主机(谁为standby谁就得设置为*.conf,而primary则不用其实done的意思就是不用)

4、创建archive目录

# mkdir /var/lib/postgresql/archive
# chmod 777 /var/lib/postgresql/archive/


五、elink-master备份数据并归档(数据同步)

1、启动数据库并观察日志

/etc/init.d/postgresql start
tail -200 /var/log/postgresql/post....

2、切换postgres并登陆数据库

su - postgres
psql -d postgres
select pg_start_backup('base');

3、CRT工具克隆新会话,进行归档、同步数据

进入到/var/lib/postgresql/9.4/main/目录,执行:

rsync -av --exclude postmaster.pid  --exclude /etc/postgresql/9.5/main/postgresql.conf --exclude /etc/postgresql/9.5/main/pg_ident.conf --exclude /etc/postgresql/9.5/main/pg_hba.conf /var/lib/postgresql/9.5/main/*  192.168.180.223:/var/lib/postgresql/9.5/main

4、返回到备份会话,停止备份

select pg_stop_backup();

六、elink-slave启动并检查日志(该步骤要快,貌似检查点一过就不行报错了!)

#启动前记得检查下/usr/local/pgsql/data/recovery.done是否也同步到elink-slave了,如果有,删掉!
/etc/init.d/postgresql start
tail -200 /var/log/postgresql/post....

七、用GUI连接master和slave数据库

在master上创建个表或者修改数据,看slave是否相同变化


八、手动主备切换(当然可以采用类似pgpool watchdog的第三方failer_command方式执行)

1、默认启动一般先起主机master,后起备机slave

master状态:

$PGDATA目录中为recovery.done(其实就是pg自己启动忽视掉的一种后缀)

slave状态:

$PGDATA目录中为recovery.conf

2、关闭master的PG,激活slave的PG主服务(不先关主服务,直接激活会有问题,千万注意!)

master:

/etc/init.d/postgresql stop
mv $PGDATA/recovery.done $PGDATA/recovery.conf

slave:

pg_ctl promote -D $PGDATA#查看slave的日志或者pg_controldata会看到为主服务了

slave状态:$PGDATA/recovery.conf自动变为recovery.done

master:

/etc/init.d/postgresql start#查看master的日志或者pg_controldata会看到为备服务了
#同步时间线-暂时感觉用不上毕竟会自动同步
pg_rewind --target-pgdata $PGDATA --source-server='host=192.168.180.223 port=5433 user=postgres password=postgres dbname=postgres' -P
前提条件
full_page_writes=on
wal_log_hints=on

注:如果要再回复默认的主备状态,再做一遍即可!

九、其他

1、如何查看是primary还是standby

方法1:查看进程:ps -ef | grep wal

会看到关键字如下

主机 senderwal sender process repluser 

备机 receiverwal receiver process


方法2:系统自带的工具:pg_controldata | grep Database

主机:Database cluster state:               in production

备机:Database cluster state:               in archive recovery

2、查看当前数据库状态是否只读

show transaction_read_only;

3、原主机切换到standby起不来的说明

采用异步方式流复制,当原主机有大量的事务操作压力比较大时,比如update,delete等操作,在原备机提升为主机后,原主机很多时候并不能正常切为备机,这是因为对于原主机,原备机会有一定的延时,也就是说原主机是超前,切换后有一部分内容主备间是不一致的,这个时候原主机降为备机就会报错。这种情况很容易模拟,在不关闭原主机的时候,把备机提升为主机,然后原主机插入新数据,再切为备机即可

4、运行一段时间后主备切换没有问题,但错误一直跟着备机:semctl(23234234,3,SETVAL,0)failed:Invalid argument

修改两台机器的/etc/systemd/logind.conf的RemoveIPC=no,再重启service systemd-logind restart,该参数含义:退出时删除sem,这个问题在很多国外论坛上基本都是说信号灯被其他进程删掉了,应该就是这个问题,测试主备OK,终于解决!