以下是工作上实现postgres主备切换功能所用到的代码和步骤,中间走了不少弯路,在此记录下。所用到的操作系统为centos 7.5,安装了两台服务器,hostname为VM7的为Master,VM8则为Slave。

  1、安装pg10

  vm7(Mater),vm8(Slave)均需安装:

[root@springcloud-vm7 ~]# yum install –y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@springcloud-vm7 ~]# yum install postgresql10 -y
[root@springcloud-vm7 ~]# yum install postgresql10-server -y
[root@springcloud-vm7 ~]# systemctl enable postgresql-
[root@springcloud-vm7 ~]# /usr/pgsql-/bin/postgresql--setup initdb
[root@springcloud-vm7 ~]# systemctl start postgresql-
[root@springcloud-vm7 ~]# systemctl status postgresql-

 

  其他环境设置

  vm7(Mater),vm8(Slave)均需安装:

# hosts
[root@springcloud-vm7 ~]# vi /etc/hosts
...
10.0.0.14 springcloud-vm7 vm7
10.0.0.15 springcloud-vm8 vm8 # disable selinux
[root@springcloud-vm7 ~]# sed -i '7s/=.*$/=disabled/' /etc/selinux/config
[root@springcloud-vm7 ~]# setenforce # set timezone
[root@springcloud-vm7 ~]# timedatectl set-timezone Asia/Shanghai
# postgres⽤用户环境
[root@springcloud-vm7 ~]# su - postgres
-bash-4.2$ vi ~/.bash_profile
。。。
PATH=$PATH:/usr/pgsql-/bin;export PATH
-bash-4.2$ . ~/.bash_profile #注意:~/.bash_profile改后为:
PGDATA=/usr/local/pgsql/data
PATH=/usr/local/pgsql/bin:$PATH
export PGDATA PATH

  安装nginx充当给azure做探测的服务(probe):

[root@springcloud-vm7 ~]# yum install -y epel-release
[root@springcloud-vm7 ~]# yum install -y nginx
[root@springcloud-vm7 ~]# vi /etc/nginx/nginx.conf
...
listen default_server; #修改监听端口在5999上

  由于Azure上LB的floatingIP限制,它会将流量量导向probe成功的后端机器器,并且只能有⼀一台probe成功。

  参考官⽅方例例⼦子,它是⽤用iptable来阻⽌止probe:https://github.com/Azure/azure-quickstart-templates/tree/master/haproxy-redundant-floatingip-ubuntu

  azureLSB设置:

  注意:负载均衡的probe端⼝口设置成5999,floatingIP设置启⽤用

  2、配置master

[root@springcloud-vm7 ~]# su – postgres

# 创建复制⽤用户
-bash-4.2$ psql -c "create role repl replication login password 'postgres'" # 创建⼀一个slot
-bash-4.2$ psql -c "select pg_create_physical_replication_slot('slot_vm7')" pg_create_physical_replication_slot
-------------------------------------
(slot_vm7,)
( row) # 配置参数
-bash-4.2$ cd $PGDATA
-bash-4.2$ vi postgresql.conf
。。。
listen_addresses = '*'
archive_mode = on
archive_command = 'cp -n %p $PGDATA/arch/%f'
log_timezone = 'Asia/Shanghai'
timezone = 'Asia/Shanghai'
。。。
# 创建arch⽬目录
-bash-4.2$ mkdir $PGDATA/arch/ # 配置pg_hba.conf
-bash-4.2$ vi pg_hba.conf
。。。
host replication repl 10.0.0.0/ md5 # 重启
-bash-4.2$ pg_ctl restart 注意:如果是首次安装,需要在防火墙中开放5432端口
#查看各端口网络连接情况
[root@springcloud-vm7 ~]# netstat –na #安装iptables防火墙
[root@springcloud-vm7 ~]# yum install iptables-services #编辑iptables防火墙配置
[root@springcloud-vm7 ~]# vi /etc/sysconfig/iptables
。。。
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT

  3、配置slave

 [root@springcloud-vm8 ~]# su – postgres

# 直接⽤用repl⽤用户备份到$PGDATA⽬目录
-bash-4.2$ rm -rf /var/lib/pgsql//data
-bash-4.2$ /usr/pgsql-/bin/pg_basebackup -R -Pv -h vm7 -U repl -D $PGDATA
Password: #postgres pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: / on timeline
pg_basebackup: starting background WAL receiver
/ kB (%), / tablespace
pg_basebackup: write-ahead log end point: /20000F8
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed # 修改recovery.conf⽂文件
-bash-4.2$ vi $PGDATA/recovery.conf standby_mode = 'on'
primary_conninfo = 'user=repl password=postgres host=vm7 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'slot_vm7'
restore_command = 'cp $PGDATA/arch/%f %p'
archive_cleanup_command = 'pg_archivecleanup $PGDATA/arch %r'
recovery_target_timeline = 'latest' # 重启
-bash-4.2$ pg_ctl restart

  4、检查

#主库上检查下:
-bash-4.2$ psql -xc "select * from pg_stat_replication"
-[ RECORD ]----+------------------------------
pid |
usesysid |
usename | repl
application_name | walreceiver
client_addr | 10.0.0.11
client_hostname |
client_port |
backend_start | -- ::25.005202+
backend_xmin |
state | streaming
sent_lsn | /F0004A0
write_lsn | /F0004A0
flush_lsn | /F0004A0
replay_lsn | /F0004A0
write_lag |
flush_lag |
replay_lag |
sync_priority |
sync_state | async
-bash-4.2$ pg_controldata
...
-bash-4.2$ psql -xc "select * from pg_replication_slots"
... #被库上检查:
-bash-4.2$ psql -xc "select * from pg_stat_wal_receiver"
...
-bash-4.2$ /usr/pgsql-/bin/pg_controldata
...
-bash-4.2$ psql -xc "select pg_is_in_recovery()"
-[ RECORD ]-----+--
pg_is_in_recovery | t

  5、安装keepalived

  vm7(Mater),vm8(Slave)均需安装:

[root@springcloud-vm7 data]# yum install keepalived -y
[root@springcloud-vm7 data]# systemctl enable keepalived
[root@springcloud-vm7 data]# systemctl start keepalived
[root@springcloud-vm7 data]# cd /etc/keepalived/
[root@springcloud-vm7 ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived
global_defs {
notification_email {
admin@example.com
}
notification_email_from pg@example.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id PG_HA #主备库需要一致
} vrrp_script chk_pg_alived {
script "/sbin/ss -ntlp4 | grep :5432 > /dev/null" # 探测端⼝口判断数据库存活,1分钟失败则认为失败
interval
weight
fall
} vrrp_instance VI_1 {
state MASTER # 主库上填MASTER, 备库上为BACKUP
interface eth0 # 填写当前网卡名称,可以用IP Ad命令查看
virtual_router_id
priority #备库的优先级设为90
advert_int
!nopreempt
preempt_delay
unicast_src_ip 10.0.0.14 # 云主机只能使⽤用单播⽅方式,这⾥里里填本机ip
unicast_peer {
10.0.0.15 #另⼀台ip
} authentication {
auth_type PASS
auth_pass
} virtual_ipaddress {
139.217.92.247 #虚拟ip
} track_script {
chk_pg_alived
} notify_master "/etc/keepalived/master.sh"
notify_backup "/etc/keepalived/backup.sh"
} # 切换成master时会执⾏行行的脚本,通过判断数据库状态决定是否promote
[root@springcloud-vm7 keepalived]# vi master.sh #!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin # allow probe from azure
systemctl restart nginx
dbstate=`su - postgres -c "psql -Atc 'select pg_is_in_recovery()'"`
if [ $dbstate != "t" ]; then
exit
fi # promote the slave to master
su - postgres -c "/usr/pgsql-10/bin/pg_ctl promote"
sleep echo "select pg_create_physical_replication_slot('slot_vm7')" | su – postgres -c "psql" #注意slot的名字主备库要相应修改⼀⼀对应(Slave中改为slot_vm8) #保存后修改脚本文件权限
[root@springcloud-vm7 keepalived]# chmod master.sh #切换成slave时会执⾏行行的脚本
[root@springcloud-vm7 keepalived]# vi backup.sh #!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
# block probe from azure
systemctl stop nginx
# check pg state
dbstate=`su - postgres -c "psql -Atc 'select pg_is_in_recovery()'"`
if [ $dbstate = "t" ]; then
exit
fi
# change master to slave
if [ ! -f /var/lib/pgsql//data/recovery.conf ] ; then
cat > /var/lib/pgsql//data/recovery.conf << EOF
standby_mode = 'on'
primary_conninfo = 'user=repl password=postgres host=vm8 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any' #注意slot的名字主备库要相应修改⼀⼀对应(Slave中改为vm7)
primary_slot_name = 'slot_vm8' #注意slot的名字主备库要相应修改⼀⼀对应(Slave中改为slot_vm7)
restore_command = 'cp $PGDATA/arch/%f %p'
archive_cleanup_command = 'pg_archivecleanup $PGDATA/arch %r'
recovery_target_timeline = 'latest'
EOF
fi
sleep
su - postgres -c "/usr/pgsql-10/bin/pg_ctl stop"
systemctl start postgresql- #注意slot的名字主备库要相应修改⼀⼀对应 #保存后修改脚本文件权限
[root@springcloud-vm7 keepalived]# chmod backup.sh

  6、测试

  6.1、  关闭Master服务器

  6.2、 在Slave服务器中监控keepalived:  journalctl -f -u keepalived

  6.3、  在Slave服务器中查询postgres日志:tail -fn20 /var/lib/pgsql/10/data/log/postgresql-Tue.log

  6.4、 在Slave服务器中监控IP是否发生了漂移: ip a

  6.5、  在Slave服务器中查看主备状态:  psql -xc "select pg_is_in_recovery()"

  6.6、在Slave服务器中创建新表:psql -c 'create table t2 (id integer)'

  6.7、  Master服务器启动后再看主备状态:psql -xc "select pg_is_in_recovery()"

在Azure云上实现postgres主备切换的更多相关文章

  1. 在Windows Azure上配置VM主备切换(1)——Linux篇

    对任何一个上线系统来说,高可用设计是不可或缺的一个环节,这样才可以确保应用可以持续.稳定的运行,而不是频繁的掉线.停机.高可用设计的核心思路很简单,就是消除一切单点故障,将单点链路或者节点升级为多点. ...

  2. Postgres主备切换

    主备查询 主备不会自动切换(即需要实现线上环境主数据库宕掉之后,从数据库能够自动切换为主数据库,需要借用第三方软件,例如heartbeat等) (1)如何查看是primary还是standby 方法1 ...

  3. .NET Core2使用Azure云上的Iot-Hub服务

    基于工业4.0大背景下的工业物联网是近几年内热门的话题,依靠信息化技术企业可以实现数字化转型,生产可以实现智能化制造,设备可以实现自动化运作.然而,海量的数据采集是整个建设过程的基础环节,如何处理与利 ...

  4. Spark系列(五)Master主备切换机制

    Spark Master主备切换主要有两种机制,之中是基于文件系统,一种是基于Zookeeper.基于文件系统的主备切换机制需要在Active Master挂掉后手动切换到Standby Master ...

  5. (摘)DataGuard物理standby管理 - 主备切换

    DataGuard物理standby管理 - 主备切换 Dataguard的切换分为两种,switchover和failover. switchover一般用于数据库或硬件升级,这时只需要较短时间中断 ...

  6. 测试redis+keepalived实现简单的主备切换【转载】

    转自: 测试redis+keepalived实现简单的主备切换 - Try My Best 尽力而为 - ITeye技术网站http://raising.iteye.com/blog/2311757 ...

  7. MySQL 复制 - 性能与扩展性的基石 4:主备切换

    一旦使用 MySQL 的复制功能,就很大可能会碰到主备切换的情况.也许是为了迭代升级服务器,或者是主库出现问题时,将一台备库转换成主库,或者只是希望重新分配容量.不过出于什么原因,都需要将新主库的信息 ...

  8. 使用broker进行Datagurd主备切换报ORA-12514异常

    在使用Datagurd broker进行Datagurd主备切换时报ORA-12514监听异常, 详细信息如下: DGMGRL> switchover to xiaohe; Performing ...

  9. Oracle DataGuard主备切换(switchover)

    Oracle DataGuard主备切换可以使用传统的手动命令切换,也可以使用dgmgr切换,本文记录手动切换. (一)将主库切换为物理备库 STEP1:查看主库状态 SQL> SELECT O ...

随机推荐

  1. [POJ2823] Sliding Window 「单调队列」

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求:   f(i) = max{ a(i-k+1),a(i-k+2),..., a(i) },i ...

  2. 目标检测评价指标mAP 精准率和召回率

    首先明确几个概念,精确率,召回率,准确率 精确率precision 召回率recall 准确率accuracy 以一个实际例子入手,假设我们有100个肿瘤病人. 95个良性肿瘤病人,5个恶性肿瘤病人. ...

  3. BrowserSync,自动刷新,解放F5,去掉更新提示

    BrowserSync虽然这个技术不算新,但是依然有用.略微介绍下 没有安装node,先安装node,这里不再做介绍 安装 npm install -g browser-sync  全局安装,方便在任 ...

  4. Kafka学习(四)-------- Kafka核心之Producer

    通过https://www.cnblogs.com/tree1123/p/11243668.html 已经对consumer有了一定的了解.producer比consumer要简单一些. 一.旧版本p ...

  5. 佳木斯集训Day3

    D3是我的巅峰 D3的出题人毒瘤!!!T3放了一道莫队,我们全体爆炸,到现在只有一个奆老A掉了T3 据说lkh被晓姐姐D了 T1是个26进制数,当时在考场上想了好久才想到(太次了)注意需要处理一下溢出 ...

  6. .net core web api部署到Linux系统CentOS 7

    一.创建一个.net core web api 的Demo 完成后的项目结构如图 修改下监听端口 发布代码 二.发布到CentOS 7上并运行 下一步需要一定的虚拟机知识了,我这里使用了windows ...

  7. 使用idea在linux上启动springboot项目

    springboot项目启动方式 1.改成war包放到tomcat上,网上方法很多不再介绍. 2.直接用jar包启动,比较方便,不需要修改项目文件,推荐使用jar包起 将项目和package打成jar ...

  8. let 、const 、var、function声明关键字的新理解

    今天在群里看到大佬们讨论let .const 的提升问题,有个大佬问  三种声明都在什么阶段提升?  什么阶段?这个真不清楚,以前是只知道let.const存在死区,没有变量提升,一下子就懵了 后经手 ...

  9. Spark 系列(十六)—— Spark Streaming 整合 Kafka

    一.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:spark-streaming-kafka-0-8 和 spark-streaming-kafka-0-10,其主要区别如下 ...

  10. ABAP-复制采购订单行项目到新的行

    FUNCTION zmm_fm_copy2new. *"------------------------------------------------------------------- ...