暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

Halo DB 14 小白零基础系列(15)--HaloDB中使用Patroni实现高可用

原创 Salvatore-zz 2024-04-30
721

前言

 上一篇我们讲了分区表的基础使用方法,本篇来聊聊HaloDB中如何实现高可用。在我们的HaloDB中,目前高可用依靠Patroni来实现,本篇就来介绍在我们的HaloDB中如何部署Patroni集群。
写这篇的主要原因是:

09306ed2649fdcfb3350a9ff91313bc.png

   如果有对我们的产品感兴趣的朋友可以通过主页的联系方式与我取得联系,获取license来安装体验,目前已经开通HaloDB吐槽群,欢迎来喷,进群请私聊我获取。

一、Patroni简介

  Patroni是一个由Zalando研发的开源产品,它能够通过分布式存储系统(Distributed configuration system, DCS)来检测存储数据库集群各个节点的状态和配置,并且能够对数据库集群进行自动管理和故障切换。

1、patroni原理介绍

   patroni 是一款运用 etcd 集群来检测、存储数据库节点的主备状态与配置,并且通过 patroni 来实现自动切换的软件。运用 haproxy+keepalived 保持在主备切换或者节点故障后,访问地址、端口对上层不变。使用一套模板化的配置文件来自动搭建初始化数据库流复制集群以及配置数据库。patroni 高可用集群主要由 HaloDB、patroni、etcd组成。
下面简单说下各组件分别的作用:

  • patroni :通过参数文件来配置自动初始化数据库搭建流复制(配置参数文件、创建用户、可以配置预加脚本),指定 etcd 节点等。负责通过一个api 接口连接到 dcs(分布式存储系统:etcd 集群),向其插入键值记录patroni 参数、数据库参数、主备信息以及连接信息。平常通过 etcd 对其它节点做心跳检测。与数据库的主备切换或者做恢复时通过向 etcd 拿取键值中储存的主备信息来判断各节点的状态进行切换。
  • etcd :etcd是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问,通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作,etcd集群是为高可用,持久性数据存储和检索而准备。,最少需要三个节点且为奇数来进行 leader 选举(脑裂发生时会 etcd集群会僵死等待恢复,不会发生都认为自己是主的情况)。在各个节点上同步健康状态信息以及数据库节点的主备状态与连接、配置信息。平常会对其余节点做心跳检测。
    image.png
      如图所示,同一时刻最多只能有一个patroni节点成为leader,即最多只能有一个patroni节点能够持有leader锁,因此能够避免脑裂的发生。当前patroni支持修复的故障场景如下:

注意:
1、主数据库意外停止,但可以通过重启恢复,立即自动启动主数据库;
2、主数据库意外故障,且无法启动,首先当前主机释放leader锁降备,然后自动选择一个最健康的备机即同步情况与主机最接近的备机,提升为主机;
3、备库意外挂机,重启后可立即恢复正常并与主机连接,则立即进行重启恢复;
4、备库意外故障,可正常启动但是启动后落后于主机状态 ,则对其进行重建操作以恢复其状态。

image.png
上图记述了集整体的工作流程以及各组件的主要功能以及作用:
etcd集群 :(记录集群状态)
Patroni :(管理集群状态)
haproxy :(负载均衡)
keepalived vip:(统一访问入口)

二、patroni集群的安装部署

集群规划如下:
0d333abed2013265d6c36b5d96abf54.png

如何安装Patroni,就好比把大象装进冰箱主要步骤分如下几个步骤

(1)搭建流复制集群
(2)ETCD 配置
(3)Patroni 配置

本次安装省略操作系统的安装以及HaloDB的安装部署

(1)搭建HaloDB物理复制

a、主库创建复制用户

halo0root=# CREATE USER replica PASSWORD '123456' REPLICATION;

b、配置$PGDATA/pg_hba.conf

[halo@Halodb01 halo]$ vi /data/halo/pg_hba.conf
添加
host replication replica 0/0 md5

c、创建备库

备库1

[halo@HaloDB02 ~]$$ pg_basebackup -F p -X stream -v -P -h halodb01 -p 1921 -U replica -D $PGDATA
-R -C --slot halodb02
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/5000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "halodb02"
30552/30552 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/5000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp

备库2:

[halo@HaloDB03 ~]$ pg_basebackup -F p -X stream -v -P -h halodb01 -p 1921 -U replica -D $PGDATA
-R -C --slot halodb03
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/5000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "halodb03"
30552/30552 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/5000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed

注意:两个备库的/data/halo目录,复制前一定要为空,否则会报错。

d、启动备库:

两个备库分别

pg_ctl start

e、检查集群状态:

halo0root=# select * from pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port |
backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn |
write_lag | flush_lag | replay_lag | sync_priority | sync_state | reply_time
------+----------+---------+------------------+-----------------+-----------------+--
-----------+-------------------------------+--------------+-----------+-----------+--
---------+-----------+------------+-----------------+-----------------+--------------
---+---------------+------------+-------------------------------
6622 | 17415 | replica | halo-cluster | 192.168.1.103 | | 54566 |
2024-04-30 15:23:19.62071-04 | | streaming | 0/8002C48 | 0/8002C48 | 0/8002C48 |
0/8002C48 | 00:00:00.001074 | 00:00:00.001989 | 00:00:00.002155 | 0 | async |
2024-04-30 15:30:30.906596-04
6657 | 17415 | replica | halo-cluster | 192.168.1.104 | | 56196 |
2024-04-30 15:25:01.860198-04 | | streaming | 0/8002C48 | 0/8002C48 | 0/8002C48 |
0/8002C48 | 00:00:00.000979 | 00:00:00.001956 | 00:00:00.002176 | 0 | async |
2024-04-30 15:33:30.902573-04
(2 rows)

注意:看⻅ sync_state 状态为 async 就是异步同步状态,也可以主库创建表插入数据
测试,在备库查看,篇幅过长,不展开了

(2) ETCD 配置

a、调整ETCD配置文件

[halo@Halo01 ~]$ /u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd_config.sh
Starting to run etcd configuration setup
Please set HALO_BASE environment variables before proceed
Press y/Y to continue, any other key to cancel
y(手工输入)
Please input IP list where etcd cluster will be running
e.g. 192.168.1.1,192.168.1.2,192.168.1.3
192.168.1.102,192.168.1.103,192.168.1.104(手工输入)
192.168.1.102 will be used as node IP
Initializing done.
Following steps to be done manually.
Run following commands as root
ln -s /u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd.service /usr/lib/systemd/system/etcd.service

b、根据配置完成提示,切换 root 用户创建 ETCD 服务软链接

[root@Halodb01 ~]# ln -s /u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd.service
/usr/lib/systemd/system/etcd.service

以上 a)-b)步骤还要在集群另外两台备机(103,104)上执行

(3)Patroni 配置

a、开始配置 Patroni

[halo@Halodb01 ~]$ /u01/app/halo/product/shield/patroni/conf/patroni_config.sh
Starting to run patroni configuration setup
Please set HALO_BASE, HALO_HOME, PGDATA environment variables before proceed
Press y/Y to continue, any other key to cancel
y(手工输入)
Please input IP list where etcd cluster will be running
e.g. 192.168.1.1,192.168.1.2,192.168.1.3
192.168.1.102,192.168.1.103,192.168.1.104(手工输入)
Input current node name
Default: Halo131
Input VIP for the HA cluster
192.168.1.135(手工输入,不要与一主两备服务器 IP 相同)
192.168.1.135 will be used as VIP
Input network interface to bind the VIP
Default: ens33
ens33 will be used as network interface
Input VIP netmask
Default: 255.255.255.0
255.255.255.0 will be used as VIP netmask
Input VIP broadcast address
Default: 192.168.231.255
192.168.231.255 will be used as VIP broadcast address
Initialize python ...
Python initializing done.
Initializing done.
Following steps to be done manually.
1. Add the following line into the end of .bash_profile of user halo
export PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATH
export PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml
2. Run following commands as root
ln -s /u01/app/halo/product/shield/patroni/conf/patroni.service
/usr/lib/systemd/system/patroni.service
3. Add the following line to /etc/sudoers
halo ALL=(ALL) NOPASSWD: /usr/sbin/ip, /usr/bin/arping, /usr/sbin/iptables

b、配置完成后,执行提供的语句

在 halo 用户环境下:

[halo@Halodb01 ~]$ vi /home/halo/.bash_profile
-- 添加以下项
export PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATH
export PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml
-- 执行生效
[halo@Halodb01 ~]$ source /home/halo/.bash_profile

切换成 root 用户,再创建软链接

[root@Halodb01 ~]# ln -s /u01/app/halo/product/shield/patroni/conf/patroni.service
/usr/lib/systemd/system/patroni.service

使用 root 用户在/etc/sudoers 添加以下行

[root@Halo131 ~]# vi /etc/sudoers
-- 添加
halo ALL=(ALL) NOPASSWD: /usr/sbin/ip, /usr/bin/arping, /usr/sbin/iptables
--wq! 保存退出

重要的事情说三遍~

注意:以上 b阶段步骤要在三台机器上分别执行
注意:以上 b阶段步骤要在三台机器上分别执行
注意:以上 b阶段步骤要在三台机器上分别执行

c、在主库创建 patroni 用户

[halo@Halodb01 ~]$ psql
psql (14.5 (221014))
Type "help" for help.
halo0root=# create user patroni SUPERUSER password 'patroni';
CREATE ROLE

d、校验安装

启动 ETCD(三台机器都需要启动)

[root@Halodb01 ~]# systemctl start etcd
-- 注:如要开机启动,请使用下面语句
[root@Halodb01 ~]# systemctl enable etcd

启动 Patroni(三台机器都需要启动)

[root@Halodb01 ~]# systemctl start patroni
-- 注:如要开机启动,请使用下面语句
[root@Halodb01 ~]# systemctl enable patroni

e、检查集群
要切换到 halo 用户下

[halo@Halodb01 ~]$ patronictl list
+---------+----------------------+---------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+ Cluster: halo-cluster (7156043537247131920) -------+----+-----------+
| Halo131 | 192.168.1.102:1921 | Leader | running | 6 | |
| Halo132 | 192.168.1.103:1921 | Replica | running | 6 | 0 |
| Halo133 | 192.168.1.104:1921 | Replica | running | 6 | 0 |
+---------+----------------------+---------+---------+----+-----------+

至此HaloDB中使用Patroni实现高可用的方式已经介绍完毕。感兴趣的朋友可以自己动手实施~

最后

  虽然是慢工,但是不是什么细活~

最后修改时间:2024-07-05 22:56:29
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论