• PostgreSQL高可用方案-patroni+etcd+vipmanager(二)


    1 前言

    1.1概述

    Patroni + etcd + vipmanager cybertec推出的postgresql 高可用方案。其中, Etcd 用于存放集群状态信息。Patroni 负责为PostgreSQL 集群提供故障转移和高可用服务。vipmanager 根据etcdConsul中保存的状态管理虚拟IP用于提供和管理虚拟ip,用于对外提供访问地址。

    3 方案验证

    3.1 验证数据库主备功能

    1. 在主数据库上的操作

    1.1 创建表 man

    create table man

    (

            id int,

            name varchar(32),

            constraint pk_man primary key (id)

    );

    结果如下:

     

    1.2 插入数据到表man

         insert into man (id, name) values (1, 'Amy');

    结果如下:

     

    1.3 查询 man:

    select * from man;

     

    2. 后备数据库上的操作

    2.1 从表man 中查询数据

     

    可以看出,发现主数据库中的数据已经同步到后备数据库。

    2.2 尝试后备数据库插入数据

    insert into man (id, name) values (2, 'Bob');

    结果如下:

     

    可以看出,无法向后备数据库插入数据。

    3.2 通过虚拟 ip 访问数据库

    1. 通过虚拟ip 10.19.134.140 连接数据库

    [root@node134 bin]# cd /opt/postgresql-12/bin

    [root@node134 bin]# su postgres

    [postgres@node135 bin]$ ./psql -h 10.19.134.140 -U postgres -p 5432 -d testdb

    2. 执行如下查询

    select * from man;

     

    3. 查看流复制状态,可以确定虚拟ip映射到了主数据库所在的节点上。

    select * from pg_stat_replication;

     

    3.3 验证PostgreSQL的高可用

    1. 手动关闭主数据库。postgresql bin 目录中,以用户postgres 执行如下命令:

    [postgres@node134 bin]# ./pg_ctl stop -D ../data/

     

    2. 过10秒后,再查看主数据库上PostgreSQL的状态

    [postgres@node134 bin]$ ./pg_ctl status -D ../data/

    发现 PostgreSQL 已经启动:

     

    3. 在主数据库中查询流复制状态:

    select * from pg_stat_replication;

     

       如图所示,流复制正常。

    3.4 验证停止和启动patroni的影响

    3.4.1 在后备服务器上停止 patroni

    1. 在后备服务器上停止patroni

    [root@node135 bin]# systemctl stop patroni

    之后,查看postgresql 服务的状态:

    [root@node135 bin]# cd /opt/postgresql-12/bin

    [root@node135 bin]# su postgres

    [postgres@node135 bin]$ ./pg_ctl status -D ../data/

    pg_ctl: no server running

    可以看出,PostgreSQL 跟随patroni停止。

    2. 通过虚拟IP 10.19.134.140 访问数据库

    [postgres@node134 bin]$ ./psql -h 10.19.134.140 -U postgres -p 5432 -d testdb

    查看复制状态

    select * from pg_stat_replication;

     

    可以发现,流复制已经断开。

    3. 后备服务器上启动patroni

    [root@node135 bin]# systemctl start patroni

    之后查看PostgreSQL 的状态,发现它已经启动:

    [postgres@node135 bin]$ ./pg_ctl status -D ../data/

     

    4. 再次在主数据库上查看复制状态:

    select * from pg_stat_replication;

     

    可以发现,流复制恢复正常。

    3.4.2 在主服务器上停止 patroni

    1. 在主服务器上停止patroni

    [root@node134 bin]# systemctl stop patroni

    之后,查看postgresql 服务的状态:

    [root@node134 bin]# cd /opt/postgresql-12/bin

    [root@node134 bin]# su postgres

    [postgres@node134 bin]$ ./pg_ctl status -D ../data/

    pg_ctl: no server running

    可以看出,PostgreSQL 跟随patroni停止。

    2. 在这台服务器上重启patroni

    [root@node134 bin]# systemctl start patroni

    3. 在原后备服务器的数据库上查看复制状态

    select pg_is_in_recovery();

    现在不是后备数据库

     

    4. 通过虚拟IP 10.19.134.140 访问数据库

    [postgres@node134 bin]$ ./psql -h 10.19.134.140 -U postgres -p 5432 -d testdb

    5. 查看流复制状态

    select * from pg_stat_replication;

    可以看出,位于 10.19.134.135 上的原后备数据库提升为了新的主数据库,而位于10.19.134.135的原主数据库则降级为后备数据库。虚拟ip则漂移到了 10.19.134.135 ,新主数据库所在的节点上。

    3.5 手工切换PostgreSQL 主节点

    1. 在切换之前,查看Patroni 集群的状态信息。

    [postgres@node135 ~]$ patronictl -c /etc/patroni/patroni_postgresql.yml list

     

    可以看出,此时,node135 是数据库集群的主结点,而 node134是数据库集群的备节点。

    2. 我们将node 135 降级为备节点,将node134 提升为主结点。执行下面的命令:

    [postgres@node135 ~]$ patronictl -c /etc/patroni/patroni_postgresql.yml switchover postgresql12

     

    3. 再查看切换后的结果:

    [postgres@node135 root]$  patronictl -c /etc/patroni/patroni_postgresql.yml list

     

    如图所示,此时,node134 已经提升为数据库集群的主结点,而时间线TL 则增加了1

    3.6 重新初始化后备数据库

         1. 在备节点node135上,删除postgresqldata目录。

         [postgres@node135 ~]$ cd /opt/postgresql-12

         [postgres@node135 postgresql-12]$ rm -rf data

         

         现在,node135上的数据库无法正常访问。我们可以使用如下命令来重新初始化数据库:

    patronictl reinit [OPTIONS] CLUSTER_NAME [MEMBER_NAMES]...

    这里,CLUSTER_NAME 是patroni_postgresql.yml 中 scope的值,而 MEMBER_NAME,集群的成员名,是patroni_postgresql.yml name的值。

    2. 为了重新初始化 node135 节点,我们执行如下命令:

    [postgres@node135 postgresql-12]$ patronictl -c /etc/patroni/patroni_postgresql.yml reinit postgresql12 node135

     

    如上图所示,数据库重新初始化成功。

    参考

    [1] 你离开我真会死. PostgreSQL-11.3+etcd+patroni构建高可用数据库集群. 2019-11-29 

    [2] 学无止境. centos7部署postgresql集群高可用 patroni + etcd patroni. 2019-08-25

    [3] How to Set Up a Highly Available PostgreSQL Cluster Using Patroni and HAProxy on Ubuntu?November 16, 2020

    [4] Cybertec. patroni 

    [5] Cybertec. vip-manager

  • 相关阅读:
    Asp.net弹出浏览器客户端确认对话框代码 Carlwave
    VS 2005 与SQL Server 2005整合优势在哪里?(from csdn.net) Carlwave
    如何让搜索引擎收录我的站点 Carlwave
    超强扩展性的DNNDotNetNuke模块功能分类列表(from 中国DNN) Carlwave
    DotNetNuke命名空间概述 Carlwave
    Most Popular Questions and Answers on ASP.NET Whidbey(from asp.net forums,write by ASP.NET Team) Carlwave
    火箭官方宣告麦蒂缺阵五周 季后赛前景蒙上阴影 Carlwave
    asp.net有效使用缓存(转) Carlwave
    《Business Rules Engine Overview》《业务规则引擎概述》write by Mark Kamoski Carlwave
    中国详细省市县自治区名称列表(含access数据库和sql2000备份数据库) Carlwave
  • 原文地址:https://www.cnblogs.com/xianghuaqiang/p/14797745.html
Copyright © 2020-2023  润新知