1

postgresql高可用测试系列之patroni etcd haproxy keepalived 离线部署(三) -利来国际app

张玉龙 2021-10-31
372


说明:本系列文章仅用于共享我的学习成果,未经过生产系统考验,对于知识点和一些组件的使用会不定时更新,仅供参考,如有错误的地方,欢迎留言共同学习。

本高可用系列测试不说理论知识,如有需要自行百度,因生产环境大多数是内网环境,无法连接互联网,为模拟生产环境安装,postgresql高可用测试均采用离线部署

所需软件包均以打包上传百度网盘,如有需要自行下载: 提取码:n9w2 文件名:postgresql_ha.tar.gz

第一章: 介绍测试环境
第二章: postgresql replication 部署
第三章: etcd 部署和管理
第四章: patroni 部署和管理
第五章: haproxy keepalived 部署和管理
第六章: 高可用模拟故障测试用例
第七章: prometheus grafana 监控部署
第八章: 高可用管理

etcd下载地址: 文件名: etcd-v3.5.1-linux-amd64.tar.gz
etcd官方文档:

  • etcd 是一款基于 raft 算法和协议开发的分布式 key-value 数据库,基于go语言编写,patroni 监控本地的 postgresql 状态,并将相关信息写入 etcd,每个 patroni 都能读写 etcd 上的 key ,从而获取外地 postgresql 数据库信息。
  • 建议在 etcd 集群中拥有奇数个成员,建议三个或五个节点,但是不建议超过7个节点,因为节点多了,写入性能会受到影响,数据必须在更多机器上复制,如果有条件,最好将节点分布到不同故障区域。
  • 一个标准的3节点 etcd 集群,最大容许1个节点故障,一个5节点 etcd 集群,最大容许2个节点故障。
  • 由于 etcd 将数据写入磁盘,因此其性能很大程度上取决于磁盘性能,因此建议使用 ssd。
  • etcd最稳定的生产环境是amd64架构的linux操作系统。

1. 所有节点解压etcd安装包并配置环境变量

# 解压目录,创建软链接 [[email protected] ~]# tar -zxvf /enmo/soft/etcd-v3.5.1-linux-amd64.tar.gz -c /enmo/app [[email protected] ~]# mv /enmo/app/etcd-v3.5.1-linux-amd64 /enmo/app/etcd-v3.5.1 [[email protected] ~]# ln -s /enmo/app/etcd-v3.5.1 /enmo/app/etcd # 配置环境变量 [[email protected] ~]# sed -i "s;:\$path:;:/enmo/app/etcd:\$path:;g" /etc/profile [[email protected] ~]# source /etc/profile

2. 所有节点创建 etcd 启动脚本

# 主节点创建 etcd 启动脚本 [[email protected] ~]# vi /enmo/app/etcd/start_etcd.sh /enmo/app/etcd/etcd --data-dir=data.etcd \ --name etcd_pgtest01 \ --listen-peer-urls http://192.168.58.10:2380 \ --listen-client-urls http://192.168.58.10:2379,http://127.0.0.1:2379 \ --initial-advertise-peer-urls http://192.168.58.10:2380 \ --advertise-client-urls http://192.168.58.10:2379 \ --initial-cluster-token etcd-cluster-pgtest \ --initial-cluster etcd_pgtest01=http://192.168.58.10:2380,etcd_pgtest02=http://192.168.58.11:2380,etcd_pgtest03=http://192.168.58.12:2380 \ --initial-cluster-state new \ --enable-v2 # 备节点1创建 etcd 启动脚本 [[email protected] ~]# vi /enmo/app/etcd/start_etcd.sh /enmo/app/etcd/etcd --data-dir=data.etcd \ --name etcd_pgtest02 \ --listen-peer-urls http://192.168.58.11:2380 \ --listen-client-urls http://192.168.58.11:2379,http://127.0.0.1:2379 \ --initial-advertise-peer-urls http://192.168.58.11:2380 \ --advertise-client-urls http://192.168.58.11:2379 \ --initial-cluster-token etcd-cluster-pgtest \ --initial-cluster etcd_pgtest01=http://192.168.58.10:2380,etcd_pgtest02=http://192.168.58.11:2380,etcd_pgtest03=http://192.168.58.12:2380 \ --initial-cluster-state new \ --enable-v2 # 备节点2创建 etcd 启动脚本 [[email protected] ~]# vi /enmo/app/etcd/start_etcd.sh /enmo/app/etcd/etcd --data-dir=data.etcd \ --name etcd_pgtest03 \ --listen-peer-urls http://192.168.58.12:2380 \ --listen-client-urls http://192.168.58.12:2379,http://127.0.0.1:2379 \ --initial-advertise-peer-urls http://192.168.58.12:2380 \ --advertise-client-urls http://192.168.58.12:2379 \ --initial-cluster-token etcd-cluster-pgtest \ --initial-cluster etcd_pgtest01=http://192.168.58.10:2380,etcd_pgtest02=http://192.168.58.11:2380,etcd_pgtest03=http://192.168.58.12:2380 \ --initial-cluster-state new \ --enable-v2
  • –initial-cluster 指定的 url 是 --initial-advertise-peer-urls。
  • 强烈推荐每个集群给予一个唯一的 initial-cluster-token。这样做之后,etcd 可以为集群生成唯一的集群 id 和成员 id,甚至他们有完全一样的配置。
  • etcd 在 listen-client-urls 上接收客户端访问,etcd 成员将 advertise-client-urls 指定的 url 通告给其他成员,代理和客户端。
  • 2379 用于客户端连接,而 2380 用于伙伴通讯。

3. 所有节点配置etcd启动脚本可执行权限

# chmod x /enmo/app/etcd/start_etcd.sh

4. 所有节点配置etcd服务并启动

# 配置服务 # vi /usr/lib/systemd/system/etcd.service [unit] description=etcd after=network.target remote-fs.target nss-lookup.target [service] type=forking execstart=/bin/bash -c "/enmo/app/etcd/start_etcd.sh >> /enmo/app/etcd/start_etcd.log 2>&1 &" execstop=/usr/bin/killall start_etcd [install] wantedby=multi-user.target # 启动服务 systemctl daemon-reload systemctl start etcd.service systemctl enable etcd.service

5. 检查etcd集群状态

# 检查集群节点的状态 [[email protected] ~]# etcdctl endpoint status --cluster -w table --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- | endpoint | id | version | db size | is leader | is learner | raft term | raft index | raft applied index | errors | --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- | http://192.168.58.11:2379 | 3f414532c235ce16 | 3.5.1 | 20 kb | false | false | 4 | 16 | 16 | | | http://192.168.58.12:2379 | 41cf8a739c2e9b50 | 3.5.1 | 20 kb | false | false | 4 | 16 | 16 | | | http://192.168.58.10:2379 | caef4208a95efee8 | 3.5.1 | 25 kb | true | false | 4 | 16 | 16 | | --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- # 列出集群中的所有成员 [[email protected] ~]# etcdctl member list -w table ------------------ --------- --------------- --------------------------- --------------------------- ------------ | id | status | name | peer addrs | client addrs | is learner | ------------------ --------- --------------- --------------------------- --------------------------- ------------ | 3f414532c235ce16 | started | etcd_pgtest02 | http://192.168.58.11:2380 | http://192.168.58.11:2379 | false | | 41cf8a739c2e9b50 | started | etcd_pgtest03 | http://192.168.58.12:2380 | http://192.168.58.12:2379 | false | | caef4208a95efee8 | started | etcd_pgtest01 | http://192.168.58.10:2380 | http://192.168.58.10:2379 | false | ------------------ --------- --------------- --------------------------- --------------------------- ------------ # 检查集群节点健康状况 [[email protected] ~]# etcdctl endpoint health --cluster -w table --------------------------- -------- ------------- ------- | endpoint | health | took | error | --------------------------- -------- ------------- ------- | http://192.168.58.10:2379 | true | 21.945446ms | | | http://192.168.58.12:2379 | true | 22.555558ms | | | http://192.168.58.11:2379 | true | 13.002743ms | | --------------------------- -------- ------------- -------

至此,etcd部署完成,后面是etcd的管理部分,可选择性阅读

6. etcd的管理,etcdctl 是一个和 etcd 服务器交互的命令行工具

6.1 查看 etcdctl 的帮助信息

[[email protected] ~]# etcdctl --help

6.2 将领导权转移到另一个 etcd 集群成员,在leader节点上执行

[[email protected] ~]# etcdctl endpoint status --cluster -w table --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- | endpoint | id | version | db size | is leader | is learner | raft term | raft index | raft applied index | errors | --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- | http://192.168.58.11:2379 | 3f414532c235ce16 | 3.5.1 | 20 kb | false | false | 4 | 16 | 16 | | | http://192.168.58.12:2379 | 41cf8a739c2e9b50 | 3.5.1 | 20 kb | false | false | 4 | 16 | 16 | | | http://192.168.58.10:2379 | caef4208a95efee8 | 3.5.1 | 25 kb | true | false | 4 | 16 | 16 | | --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- # 现在 192.168.58.10 是 leader节点,将领导权转移到192.168.58.11,在leader节点(192.168.58.10)上执行以下命令 [[email protected] ~]# etcdctl move-leader 3f414532c235ce16 leadership transferred from caef4208a95efee8 to 3f414532c235ce16 [[email protected] ~]# etcdctl endpoint status --cluster -w table --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- | endpoint | id | version | db size | is leader | is learner | raft term | raft index | raft applied index | errors | --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- -------- | http://192.168.58.11:2379 | 3f414532c235ce16 | 3.5.1 | 20 kb | true | false | 5 | 20 | 20 | | | http://192.168.58.12:2379 | 41cf8a739c2e9b50 | 3.5.1 | 20 kb | false | false | 5 | 20 | 20 | | | http://192.168.58.10:2379 | caef4208a95efee8 | 3.5.1 | 25 kb | false | false | 5 | 20 | 20 | | --------------------------- ------------------ --------- --------- ----------- ------------ ----------- ------------ -------------------- --------

6.3 保存数据库快照(数据库备份),只在其中一个节点执行

[[email protected] ~]# etcdctl snapshot save etcd_bak.db {"level":"info","ts":1635648427.3933637,"caller":"snapshot/v3_snapshot.go:68","msg":"created temporary db file","path":"etcd_bak.db.part"} {"level":"info","ts":1635648427.3941739,"logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"} {"level":"info","ts":1635648427.3941944,"caller":"snapshot/v3_snapshot.go:76","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"} {"level":"info","ts":1635648427.3956425,"logger":"client","caller":"v3/maintenance.go:219","msg":"completed snapshot read; closing"} {"level":"info","ts":1635648427.396033,"caller":"snapshot/v3_snapshot.go:91","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"25 kb","took":"now"} {"level":"info","ts":1635648427.3960974,"caller":"snapshot/v3_snapshot.go:100","msg":"saved","path":"etcd_bak.db"} snapshot saved at etcd_bak.db # 查看快照信息 [[email protected] ~]# etcdctl snapshot status etcd_bak.db -w table ---------- ---------- ------------ ------------ | hash | revision | total keys | total size | ---------- ---------- ------------ ------------ | 230fea56 | 0 | 8 | 25 kb | ---------- ---------- ------------ ------------

6.4 修改现有成员信息

1. 修改 advertise client urls
修改 etcd 的启动脚本 /enmo/app/etcd/start_etcd.sh,将参数–advertise-client-urls更新为需要修改的信息后重启这个成员的etcd(systemctl restart etcd.service)。
重新后的成员将自行发布更新后的url。错误更新的 client url 将不会影响 etcd 集群的健康。

2. 修改 advertise peer urls
要修改现有成员的 advertise peer urls, 首先通过(etcdctl member update)命令更新它然后再重启这个成员。
执行命令(etcdctl member update)是因为更新 peer url 修改了集群范围配置并能影响 etcd 集群的健康。

首先,我们需要找到目标成员的id。使用 etcdctl 列出所有成员:

[[email protected] ~]# etcdctl member list -w table ------------------ --------- --------------- --------------------------- --------------------------- ------------ | id | status | name | peer addrs | client addrs | is learner | ------------------ --------- --------------- --------------------------- --------------------------- ------------ | 3f414532c235ce16 | started | etcd_pgtest02 | http://192.168.58.11:2380 | http://192.168.58.11:2379 | false | | 41cf8a739c2e9b50 | started | etcd_pgtest03 | http://192.168.58.12:2380 | http://192.168.58.12:2379 | false | | caef4208a95efee8 | started | etcd_pgtest01 | http://192.168.58.10:2380 | http://192.168.58.10:2379 | false | ------------------ --------- --------------- --------------------------- --------------------------- ------------

在这个例子中,让我们 更新 caef4208a95efee8 成员id并修改它的 peerurls 值为 http://10.0.1.10:2380

[[email protected] ~]# etcdctl member update caef4208a95efee8 http://10.0.1.10:2380 updated member with id a8266ecf031671f3 in cluster

最后修改 etcd 的启动脚本 /enmo/app/etcd/start_etcd.sh,将参数更新为需要修改的信息后重启这个成员的etcd(systemctl restart etcd.service)。

6.5 删除成员

假设我们要删除的成员id是 caef4208a95efee8.

[[email protected] ~]# etcdctl member remove caef4208a95efee8 removed member caef4208a95efee8 from cluster

可以安全的移除 leader,当然在新 leader 被选举时集群将不活动(inactive)。这个持续时间通常是选举超时时间加投票过程。

6.6 添加新成员

添加成员的过程有两个步骤:

  1. 通过 etcdctl member add 命令添加新成员到集群。
  2. 使用新的成员配置启动新成员,包括更新后的成员列表(以前的成员加新成员)

使用 etcdctl 指定 name 和 advertised peer urls 来添加新的成员到集群:

[[email protected] ~]# etcdctl member add etcd_pgtest04 http://192.168.58.13:2380 added member 9bf1b35fc7761a23 to cluster etcd_name="etcd_pgtest04" etcd_initial_cluster="etcd_pgtest01=http://192.168.58.10:2380,etcd_pgtest02=http://192.168.58.11:2380,etcd_pgtest03=http://192.168.58.12:2380,etcd_pgtest04=http://192.168.58.13:2380 " etcd_initial_cluster_state=existing

警告: 如果新成员启动的磁盘空间中存在旧的数据目录,需要在启动前删除旧的数据目录(–data-dir 默认${name}.etcd)

新成员创建启动脚本

[[email protected] ~]# vi /enmo/app/etcd/start_etcd.sh /enmo/app/etcd/etcd --data-dir=data.etcd \ --name etcd_pgtest04 \ --listen-peer-urls http://192.168.58.13:2380 \ --listen-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379 \ --initial-advertise-peer-urls http://192.168.58.13:2380 \ --advertise-client-urls http://10.0.1.13:2379 \ --initial-cluster-token etcd-cluster-pgtest \ --initial-cluster etcd_pgtest01=http://192.168.58.10:2380,etcd_pgtest02=http://192.168.58.11:2380,etcd_pgtest03=http://192.168.58.12:2380,etcd_pgtest04=http://192.168.58.13:2380 \ --initial-cluster-state existing \ --enable-v2

注意设置 initial-cluster-state 为 existing
创建服务文件,启动服务

[[email protected] ~]# systemctl start etcd.service

新成员将作为集群的一部分运行并立即开始赶上集群的其他成员。
添加新成员的最佳实践是一次配置单个成员并在添加更多新成员前验证它正确启动。这个逐步的方式非常重要,因为如果最新添加的成员没有正确配置(例如 peer url 不正确),集群会丢失法定人数。发生法定人数丢失是因为最新加入的成员被法定人数计数,即使这个成员对其他已经存在的成员是无法访问的。同样法定人数丢失可能发生在有连接问题或者操作问题时。

6.5 其他参考官方文档

etcd官方文档:

7. etcd-browser web可视化界面

下载地址:
要启动 etcd-browser,还需要下载安装 nodejs,下载地址:

# 解压etcd-browser的安装包 [[email protected] ~]# unzip /enmo/soft/etcd-browser-master.zip -d /enmo/app/etcd # 解压nodejs的安装包 [[email protected] ~]# tar -xvf /enmo/soft/node-v16.13.0-linux-x64.tar.xz -c /enmo/app/etcd [[email protected] ~]# mv /enmo/app/etcd/node-v16.13.0-linux-x64 /enmo/app/etcd/nodejs # 修改etcd-browser的配置文件 [[email protected] ~]# vi /enmo/app/etcd/etcd-browser-master/server.js var etcdhost = process.env.etcd_host || '192.168.58.12'; var etcdport = process.env.etcd_port || 2379; var serverport = process.env.server_port || 8000; # 启动etcd-browser [[email protected] ~]# cd /enmo/app/etcd/etcd-browser-master [[email protected] etcd-browser-master]# /enmo/app/etcd/nodejs/bin/node server.js proxy /api requests to etcd on 192.168.58.12:2379 etc-browser listening on port 8000

谷歌浏览器访问

最后修改时间:2021-11-04 03:00:16
「喜欢文章,快来给作者赞赏墨值吧」
【利来手机国际的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:[email protected]进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论