zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    c#类,接口,结构,抽象类介绍 以及抽象和接口的比较
    存储过程基本语法
    有关uploadifive的使用经验
    堆栈的浅析
    JavaScript语言精粹4递归(汉诺塔游戏寻常解)及作用域
    JavaScript语言精粹3异常,扩充类型功能
    有关this,4种调用模式小例子
    JavaScript语言精粹2函数对象,函数字面量,调用
    JavaScript语言精粹1字符串,对象字面量
    JQUERY选择器第一天
  • 原文地址:https://www.cnblogs.com/xianghuaqiang/p/14797745.html
Copyright © 2011-2022 走看看