您的位置:首页 > 其它

Debian8.4下搭建PG9.5的主备流复制

2016-04-28 17:44 507 查看
主机环境:
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/[/code]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
会看到关键字如下
主机 sender:wal sender process repluser
备机 receiver:wal 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,终于解决!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  主机 用户 master