20181219-PostgreSQL 流复制监控脚本
PostgreSQL 流复制监控脚本
https://github.com/AndyYHM/Writing/blob/PostgreSQL/20181219-PostgreSQL Stream MON.md
整理之前的脚本文档,搬家至博客园,梳理一下之前写的shell脚本
适用于PostgreSQL版本10、版本9替换函数名称即可,系统centos 7验证
_xlog_location<=> _wal_lsn
_location <=> _lsn
1. 脚本输出效果
1.1 主节点显示效果
STREAM_ROLE : Master
------------------------------
Replication Client Info:
------------------------------
PID : 25424
CLIENT_ADDR : 20.9.6.213
SYNC_STATE : async
STATE : streaming
WRITE_DIFF : 0bytes
FLUSH_DIFF : 0bytes
REPLAY_DIFF : 0bytes
Replication Client Info:
------------------------------
PID : 24586
CLIENT_ADDR : 20.9.6.212
SYNC_STATE : sync
STATE : streaming
WRITE_DIFF : 0bytes
FLUSH_DIFF : 0bytes
REPLAY_DIFF : 0bytes
1.2 从节点效果
STREAM_ROLE : Slave
------------------------------
Replication Info
------------------------------
CLUSTER_STATE : in_archive_recovery
SERVER_ADDR : 20.9.6.219
USER : replicator
APP_NAME : node12
TARGET_TIMELINE:
READ_ONLY : on
2. 功能说明
- 判定主机角色
- 如果为Master节点,则显示复制节点信息,及与主节点差值
- 如果为Replication节点,则显示为本节点相关信息
3. 使用说明
- 根据实际环境修改脚本pgdata=""
- postgres系统用户执行,保证有执行权限
- 本地执行脚本
sh pg10_stream.sh
4. pg10_stream.sh脚本内容
#!/bin/bash
################################
## Author: andy_yhm@yeah.net
## Version: 1.0
## Date: 20181219
################################
clear
host_var="/tmp"
pgdata="/pgdb/pgdata"
work_dir=$(cd `dirname $0`;pwd)
cd $work_dir
is_master=$(psql -h $host_var -c 'select pg_is_in_recovery();'| sed -n 3p)
if [ "$is_master" == " f" ];then
rep=$(psql -h $host_var -c 'select pid, client_addr, sync_state, state,pg_size_pretty( pg_wal_lsn_diff(pg_current_wal_lsn(),write_lsn)) as write_diff, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),flush_lsn)) as flush_diff, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn)) as replay_diff from pg_stat_replication;'| sed -n '3,$'p |tac | sed -n '3,$'p | sed s/" *"//g )
if [ ! "$rep" ];then
echo "Waring! No Replication Client Found"
else
printf "\n\t%-15s: %-15s\n" "STREAM_ROLE" "Master"
echo -e "\t------------------------------"
echo "$rep" | while read i
do
echo -e "\tReplication Client Info:\n\t------------------------------"
a=(null PID CLIENT_ADDR SYNC_STATE STATE WRITE_DIFF FLUSH_DIFF REPLAY_DIFF)
for j in `seq 7`
do
k=${a[j]}
echo -e "$i" | awk -v k=$k -v j=$j -F"|" '{printf "\t%-15s: %-15s\n",k,$j}'
done
echo ""
done
client_check_info=(`psql -h $host_var -c 'select client_addr from pg_stat_replication;' | sed -n '3,$'p |tac | sed -n '3,$'p | sed s/" *"//g`)
if [ ! -f pg_stream_client ]; then
echo "$client_check_info" > pg_stream_client
else
client_before=(`cat pg_stream_client`)
if [ ${#client_before[*]} -gt 0 ]; then
for i in `seq ${#client_before[*]}`
do
index=$(expr $i - 1)
if [ "${client_check_info[$index]}"x != "${client_before[$index]}"x ];then
printf "\tWarning! Replication Client Lost.\n"
else
echo "$client_check_info" > pg_stream_client
fi
done
else
printf "\tAttention! No Client Info found in pg_stream_client.\n"
fi
fi
fi
elif [ "$is_master" == " t" ];then
declare -A connect_info_dict
conninfo=$(cat $pgdata/recovery.conf| grep -i "^primary_conninfo" | awk -F"'" '{print $2}' |sed s/" *"/" "/g |sed s/"="/"\"]=\""/g | sed s/" "/"\" [\""/g | sed s/^/"[\""/g |sed s/$/"\""/g|sed s/" "/"\n"/g)
eval "connect_info_dict=($conninfo)"
cluster_state=$(pg_controldata | grep cluster | sed s/" *"/" "/g | cut -d ":" -f2| sed s/"^ "//g| sed s/" "/"_"/g)
server_addr=${connect_info_dict["host"]}
user=${connect_info_dict["user"]}
application_name=${connect_info_dict["application_name"]}
recovery_target_timeline=${connect_info_dict["recovery_target_timeline"]}
read_only=$(psql -h $host_var -c 'show transaction_read_only;' | sed -n '3p')
output(){
printf "\t%-15s: %-15s\n" $1 $2
}
printf "\n\t%-15s: %-15s\n" "STREAM_ROLE" "Slave"
echo -e "\t------------------------------"
echo -e "\tReplication Info\n\t------------------------------"
output "CLUSTER_STATE" $cluster_state
output "SERVER_ADDR" $server_addr
output "USER" $user
output "APP_NAME" $application_name
output "TARGET_TIMELINE" $recovery_target_timeline
output "READ_ONLY" $read_only
echo ""
else
echo "Warning! Can't Connect to Database. Please Check Database Status "
fi
exit 0
psql -c 'select application_name,client_addr ,sync_state from pg_stat_replication;' | sed -n '3,$'p |tac | sed -n '3,$'p | sed s/" *"//g
20181219-PostgreSQL 流复制监控脚本的更多相关文章
- PostgreSQL 流复制+高可用
QA PgPool-II 同步 Postgresql X1 服务器准备 192.168.59.121 PostgreSQL10 192.168.59.120 PGPool-II 3.7 X2 安装Po ...
- MySQL5.7 多源复制监控脚本
#!/bin/bash :<<BLOCK Version : v1.0 2018-12-21 MySQL多源复制检测脚本 监控配置放在 $CONFIG_FILE 中,内容如下 #mysql ...
- PostgreSQL流复制
原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...
- PostgreSQL流复制参数max_wal_senders详解
转自:http://my.oschina.net/Kenyon/blog/152234PostgreSQL 9.2.4 主机:192.25.10.76 从机:192.25.10.71 做postgre ...
- PostgreSQL流复制记录
参考了别人的部分,添加了自己在实践中的内容,仅做记录. 1.同步流复制中 主机操作 1.1postgresql.conf wal_level = hot_standby # 这个是设置主为wal的主机 ...
- [笔记] postgresql 流复制(streaming replication)
基本环境说明: os:FreeBSD 9.3 postgresql version: master:192.168.56.101 standby:192.168.56.102 安装过程略,基于pkg包 ...
- postgresql流复制配置
一.配置环境: 示例环境 主机名 IP 角色 系统版本 数据目录 pg版本 db1 192.168.128.128 主库 RedHat5.3 /app/postgreSQL/data 9.1.7 db ...
- 再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署
前言 在MySQL被收购之后,虽然有其替代品为: MariaDB,但是总感觉心里有点膈应.大家发现了另一款开源的数据库: PostgreSQL. 虽然centos自带版本9.2也可以用,但是最近的几次 ...
- postgresql数据库异步流复制hot standby环境搭建
生命不息,test不止. 最近组里面修改了几个postgresql的bug,要进行回归测试,除了前面提到的WAL的RT测试和Mirroring Controller的RT测试,还要测试下postgre ...
随机推荐
- css块级元素和行内元素详细解析
块级元素和行内元素是布局中常见的两种基本元素,但是未必有很多人深入的研究它们的细微差别. 常见块级元素:div p form ul ol li 等: 常见的行内元素:span stronh em; ...
- JAVA Web实时消息后台服务器推送技术---GoEasy
---恢复内容开始--- 越来越多的项目需要用到实时消息的推送与接收,我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 ...
- nginx在Centos7.5下源码安装和配置
安装nginx 安装nginx依赖包 yum install -y pcre-devel zlib-devel openssl-devel wget gcc tree vim 进入目录/root/se ...
- 2020考研-必须了解的干货"极限微分和你说的悄悄话"
极限微分和你说的悄悄话 2019-03-02 RunWsh 美食供应商有考研学子 想必接触过数学或物理的都对牛顿和莱布尼兹不陌生.如果你是考研大军中的一员,估计天天会与他们眉来眼去的吧! 牛顿莱布:别 ...
- 服务端渲染和nuxt简单介绍
概述 最近研究了一下服务端渲染,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: Vue SSR指南 nuxt.js官网 服务端渲染介绍 服务端渲染简单来说,就是分别对项目用we ...
- ansible基础-task控制
1. 前言 很多情况下,一个play是否执行会依赖于某个(些)变量的值,这个变量可以来自自定义变量.facts,甚至是另一个task的执行结果. ansible通过变量判定task是否执行,我们称之为 ...
- ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- EF Core利用Scaffold从根据数据库生成代码
在EF6 之前的时代,如果需要从数据库中生成代码,是可以直接在界面上操作的,而到了EF Core的时代,操作方式又有更简便的方式了,我们只需要记住以下这条指令. Scaffold-DbContext ...
- Netty源码—一、server启动(1)
Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo.RocketMQ.可以说Netty是对Java NIO的封装,比如ByteBu ...
- 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整体的HTTP请求的过程,这里化繁为简,保留了主干流程: 从浏览器输入域名开始,这里忽略 ...