centos7/redhat7 PostgreSql搭建主从同步+Keepalived高可用 数据库高可用

一、安装postgresql
此次安装版本为postgresql11.6,因已提前准备好安装所需的RPM包,所以使用RPM形式安装。
1、rpm包安装:
mkdir /tmp/pgsql && cd /tmp/pgsql
将"postgresql-11"中的RPM包传到/tmp/pgsql中
rpm -ivh *.rpm --nodeps --force
2、查看安装结果:rpm -qa | grep postg
3、配置:
# 初始化数据库 #
/usr/pgsql-11/bin/postgresql-11-setup initdb
# 启动pg #
systemctl start postgresql-11
# 设置开机启动#
systemctl enable postgresql-11
4、修改pg配置文件
vi /var/lib/pgsql/11/data/postgresql.conf
#取消data_directory注释,修改data_directory = 'ConfigDir'为data_directory = '/data/pgsql_data/'
data_directory = '/data/pgsql_data/'
#
修改最大连接数,一般1000就够用了
max_connections
#将监听地址修改为*
#默认listen_addresses配置是注释掉的,所以可以直接在配置文件开头加入该行
listen_addresses='*'
#修改配置文件
vi /var/lib/pgsql/11/data/pg_hba.conf
#在问价尾部加入
host    all             all             0.0.0.0/0               md5
创建pgsql数据存储路径:mkdir -p /data/pgsql_data/
cp -r /var/lib/pgsql/11/data/* /data/pgsql_data/
chown -R postgres:postgres /data/pgsql_data/
mv  /var/lib/pgsql/11/data  /tmp/data
vi /usr/lib/systemd/system/postgresql-11.service
# 将Environment=PGDATA=/var/lib/pgsql/11/data/修改为Environment=PGDATA=/data/pgsql_data/
Environment=PGDATA=/data/pgsql_data/
#重启PostgreSQL服务
chmod 700 /data/pgsql_data
systemctl daemon-reload
systemctl restart postgresql-11
5、修改postgres账号密码:
1、进入PostgreSQL命令行:su postgres
2、启动SQL Shell:psql
3、修改密码:ALTER USER postgres WITH PASSWORD 'Psql135246';
4、\q用于退出psql命令行
然后使用navicat连接pgsql或使用命令行连接,能连接表示安装成功。

二、postgresql11主从配置:
1、主库设置:
1.1、创建同步账号:
登陆Master库,创建具有用于传递数据的具有replication权限的用户【也可以直接用Super user当作replication用户,但不推荐】
CREATE ROLE repl login replication password 'Psql135246';
1.2、修改Master库的pg_hba.conf,把Master库和Standby库的IP地址添加进Master库网络策略白名单中,使Standby库可以连上 Master库,同时便于主备切换:
host    replication     repl            主节点ip/32         md5
host    replication     repl            从节点ip/32         md5
修改master库postgresql.conf文件:vi postgresql.conf
wal_level = replica                  # 开启wal日志归档
wal_log_hints = on                 # 用于主从切换
max_wal_senders = 10            # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_sender_timeout = 60s      # 设置流复制主机发送数据的超时时间
max_connections = 1000        # 这个设置要注意下,从库的max_connections必须要大于主库的
shared_buffers = 8GB             #推荐内存的1/4
synchronous_standby_names = ''
hot_standby = on 
work_mem = 128MB
maintenance_work_mem = 64MB
archive_mode = on
archive_command = 'cp %p /data/pgsql_data/arch_dir/%f; find /data/pgsql_data/arch_dir -type f -mtime +7 |xargs rm -f'
1.3、新建归档目录,赋予权限,重启主库:
mkdir -p /data/pgsql_data/arch_dir
chown -R postgres:postgres /data/pgsql_data
systemctl restart postgresql-11

2、从库配置:
2.1、停止postgres服务:systemctl stop postgresql-11
2.2、删除数据文件:rm -rf /data/pgsql_data/*
2.3、从主库拉取数据文件:/usr/pgsql-11/bin/pg_basebackup -h 主节点ip -U repl -F p  -P -R -D /data/pgsql_data
2.4、修改所属组:chown -R postgres:postgres /data/pgsql_data
2.5、修改postgresql.conf:vi postgresql.conf
max_connections = 1200
2.6、启动从库,并在主库中查看流复制的信息可以使用主库上的视图:systemctl start postgresql-11(从库中运行)
select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;(主库中运行)
  pid  |   state   | client_addr  | sync_priority | sync_state 
-------+-----------+--------------+---------------+------------
 58243 | streaming | 从节点ip |             0 | async
(如看到从库IP,则表明主从已同步)
2.7、再次测试主动同步:
在主库创建数据库test:进入数据库,运行create database test;
去从库查看是否出现test:SELECT datname FROM pg_database;
在主库删除test数据库:drop database test;
对比主从数据库大小:select pg_size_pretty(pg_database_size('DB_name'));

三、主备切换步骤(以下只适用于12.0以下的版本,停止主库pgsql,模拟主库故障):
1、在主库操作:systemctl stop postgresql-11
2、在备库操作:su postgres
2.1、检查状态:/usr/pgsql-11/bin/pg_controldata -D /data/pgsql_data
# 显示in archive recovery说明为备库
Database cluster state:               in archive recovery

2.2、 激活备库为可读写:/usr/pgsql-11/bin/pg_ctl promote -D /data/pgsql_data/

2.3、检查备库上的数据库角色:/usr/pgsql-11/bin/pg_controldata -D /data/pgsql_data
如果:Database cluster state: 显示in production说明已经提升为主库。

2.4、此时原主库也是in production状态,需要将其转换成备库(主库降为备库的操作见如上从库的配置步骤):
停止postgres服务:systemctl stop postgresql-11
删除数据文件:rm -rf /data/pgsql_data/*
从主库拉取数据文件:/usr/pgsql-11/bin/pg_basebackup -h 主节点ip -U repl -F p  -P -R -D /data/pgsql_data
修改所属组:chown -R postgres:postgres /data/pgsql_data
修改postgresql.conf:vi postgresql.conf
max_connections = 1200
启动pgsql服务:systemctl start postgresql-11
查看数据库角色是否变为备库:/usr/pgsql-11/bin/pg_ctl promote -D /data/pgsql_data/(是否显示为in archive recovery)


四、搭建keepalived:
设置开机自启:systemctl enable keepalived
主节点配置:
vi /etc/keepalived/keepalived.conf
#全局配置
global_defs {
#   vrrp_strict  # 这行注释掉
}

#执行脚本配置
vrrp_script check_pg_alived {
    script "/etc/keepalived/scripts/check_pg.sh"   #检测脚本位置
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP # 主备一致,都是BACKUP
    interface ens224 #网卡,ip a查看本机IP所在的网卡名称
    virtual_router_id 53 # 主备需要一致,且同网段唯一
    priority 101 # 优先级,主需要比备高;比如主是101,备可以是100
    advert_int 1
    authentication {
        auth_type PASS  # 主备需要一致
        auth_pass 1111 # 主备需要一致
    }
    track_script {
      check_pg_alived
    }
    virtual_ipaddress {  # vip设置,主备一致
       192.168.0.11
    }
}

从节点配置:
vi /etc/keepalived/keepalived.conf
#全局配置
global_defs {
#   vrrp_strict  # 这行注释掉
}

#执行脚本配置
vrrp_script check_pg_alived {
    script "/etc/keepalived/scripts/check_pg.sh"   #检测脚本位置
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP # 主备一致,都是BACKUP
    interface ens224 #网卡,ip a查看本机IP所在的网卡名称
    virtual_router_id 53 # 主备需要一致,且同网段唯一
    priority 91 # 优先级,主需要比备高,比如主是101,备可以是100
    advert_int 1
    authentication {
        auth_type PASS  # 主备需要一致
        auth_pass 1111 # 主备需要一致
    }
    track_script {
      check_pg_alived
    }
    virtual_ipaddress {  # vip设置,主备一致
       192.168.0.11
    }
}

创建存放脚本和log的目录:
mkdir  /etc/keepalived/scripts && mkdir  /etc/keepalived/log

主节点和从节点检测存活脚本配置:
vi /etc/keepalived/scripts/check_pg.sh
#!/bin/bash
#判断pg是否活着
A=`netstat -lnp | grep LISTEN | grep :5432 | wc -l`

#如果pg死了,将消息写入日记并且关闭keepalived
if [ $A -eq 0 ];then
    echo "`date "+%Y-%m-%d--%H:%M:%S"` postgresql stop so vip stop " >> /etc/keepalived/log/check_pg.log
    systemctl stop keepalived
fi

systemctl start keepalived
查看VIP是否已经在主机上

五、keepalived使用说明:
当主节点由于某原因down掉后,VIP会在五秒内自动切换至从节点,此时由从节点提供数据库服务。但此时从节点read-only,只能查询无法写入、删除。
此时有两个方案:
1、如果主节点能较快排查出原因并恢复主节点数据库,那么此时只要将主节点数据库服务跑起来,然后重启主节点的keepalived服务,VIP会在五秒内转移到主节点,将由主节点继续提供数据库服务。
2、如果主节点一时半会无法恢复,此时需要将从节点提升至为主,详细操作看'步骤三',此时从节点提升为主,可读写。原故障的主库恢复后,需要重启原主库的keepalived服务,并将修复后的原主库降级为从,详细步骤请看'二'中的从库配置步骤。(降级前建议先备份一份原主库的数据)
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值