在第二部分中,我们开始设计PostgreSQL控制器。 今天,我们从上次停下来的地方开始,然后开始详细介绍控制层(包括控制器和附带工具)如何跟踪PostgreSQL应用程序的状态。

PostgreSQL应用程序的真实状态包含许多组件:

· 每个PostgreSQL实例的当前状态(状态):健康吗? 是主服务器(主服务器)还是备用服务器(从服务器)? 还在配置吗?

· 每个PostgreSQL实例的期望状态(规范):应该是主要状态吗? 它应该从哪里流式传输WAL(预写日志)?

· 整个应用程序的当前状态:哪些实例属于该PostgreSQL应用程序? 备份写在哪里?

· 整个应用程序的期望状态:应该有多少个实例? 备份到哪里去?

该真实状态在中央存储区中编码,控制层使用该状态来决定其需要做什么。 控制层的每个元素都负责维护部分编码状态:

· 无论是个人还是其他应用程序,应用程序管理员都负责设置应用程序整体的所需状态。

· 控制器维护整个应用程序的当前状态以及各个PostgreSQL实例的期望状态。

· 每个PostgreSQL实例均由Sidecar控制,该Sidecar负责维护实例的当前状态。

PostgreSQL实例状态

在第一部分中,我们介绍了PostgreSQL实例必须实现的一些行为。 例如,当主数据库启动时,它将执行以下操作:

· 初始化数据库,可能是从预先存在的备份中初始化。

· 配置连续备份。

· 配置流复制,包括身份验证机制。

我们如何编码实例的当前状态取决于我们是否将上述三个动作捆绑为一个步骤。 如果仅一步,状态转换可能看起来像这样:

· 未设定

· 完成设置

使用这种编码,控制器无法确定实例所处的设置步骤。根据整体设计,这可能很好。 如果控制器需要更多有关实例设置过程的可见性,则状态转换可能看起来像这样:

· 未设定

· 数据库已初始化

· 备份配置

· 完成设置

在这两种设计中,控制器设置的期望状态为:

· 完成设置

实例Sidecar尽其所能将其当前状态移至所需状态。

实例故障

到目前为止,我声称PostgreSQL实例sidecar负责维护中央存储区中编码的当前状态。 这并非完全正确。

当PostgreSQL实例Pod发生故障(由于Node发生故障,被逐出或刚刚崩溃)时,中央存储中的当前状态应表示该实例发生了故障。 杂物箱是Pod的一部分,因此,如果Pod死了,则没有正在运行的杂物箱来更新中央商店。

解决方案是在实例失败时使用外部代理更新中央存储。 一种方法是执行Pod健康检查。 然后,PostgreSQL控制器可以检查其每个实例的Pod状态,以查看哪些实例发生故障。 在这种模型中,Kubernetes和实例Sidecar共同负责在中央商店中维护实例的当前状态。

PostgreSQL整个应用程序状态

上一节是关于实例级状态的。 在进入应用程序级状态之前,我想解决控制器与实例Sidecar之间的关键区别。

实例死亡时,它将保持死亡状态。 控制器死亡后,将使用新的控制器来代替。

之前,我们可以选择编码实例设置,既可以是从"未完成"到"完成"的单状态转换,也可以是从"未完成"到"步骤1"到"步骤2"到"完成"的多个转换。 之所以存在这种选择,是因为Sidecar不必依赖中央存储中实例的当前状态。 它可以简单地将当前状态保存在内存中。

另一方面,控制器确实依赖中央存储中应用程序的当前状态。 如果控制器死了,则其更换必须能够从中断处继续进行。 例如,考虑故障转移过程:

· 状态:健康(1个主要状态,2个备用状态)→操作:无

· 状态:不正常(0个主要状态,2个备用状态)→操作:将一个备用状态所需的状态设置为"主要"。

· 状态:运行状况良好(1个主数据库,1个备用数据库)→操作:创建一个新的备用数据库

· 状态:健康(1个主要状态,2个备用状态)→操作:无

注意,每个当前状态对应于特定动作(给定特定期望状态)。

如果控制器在步骤2中死亡,则替换控制器会做什么? 前一个控制器是否执行了该动作? 如果可以安全地重试该操作(即该操作是幂等的),则替换控制器可以简单地执行该操作,而不管原始控制器是否执行了该操作。 否则,可能的状态集必须区分这两种情况。

对于上面的步骤2,该操作只是在中央存储区中写入所需的状态。 由于替换控制器可以写入与其前任相同的期望状态,因此该操作可能是幂等的。 另一种方法是在步骤2和3之间添加一个中间状态:

2.状态:不正常(0个主要状态,2个备用状态)→操作:将一个备用状态所需的状态设置为"主要"。

2.5。 状态:不健康(0个主节点,2个备用数据库),正在等待升级备用数据库1#→操作:无

3.状态:运行状况良好(1个主数据库,1个备用数据库)→操作:创建一个新的备用数据库

请注意,此方法要求操作和状态更改以原子方式一起发生。 否则,控制器可能会在执行第2步的操作之后并在将状态更新为2.5之前失败。 替换负责人会认为第2步的操作尚未发生。

在此处的示例中,操作是设置实例的所需状态。 如果应用程序的当前状态包括每个实例的所需状态,则操作和状态更改确实会自动发生。 对于其他类型的操作,这将不成立。 最好确保这些动作是幂等的。

还剩什么?

到目前为止,我们已经广泛地介绍了如何在Kubernetes上高度可用的PostgreSQL应用程序中协调PostgreSQL实例的生命周期。 如果您想在特定区域获得更多详细信息,请在评论中告诉我! 有很多要讨论的内容,所以请帮助我选择下一部分内容。

不过,确保PostgreSQL正在运行并不是我们关注的终点。 我们仍然必须注意可观察性,负载平衡,管理备份存档等。 敬请关注。

(本文翻译自Kynan Rilee的文章《PostgreSQL on Kubernetes the Right Way: Part Three》,参考:https://medium.com/kokster/postgresql-on-kubernetes-the-right-way-part-three-32fbd36942f)

postgresql 备份_在Kubernetes上使用PostgreSQL的正确姿势:第三部分相关推荐

  1. postgresql 备份_等保涉及的PostgreSQL数据库

    一.访问控制 1. 应及时删除或停用多余的.过期的账户,避免共享账户的存在 查看当前已有账户,询问管理员是否存在多余过期账户 2. 应授予管理用户所需的最小权限,实现管理用户的权限分离 这个管理用户的 ...

  2. 如何在Kubernetes上运行PostgreSQL

    通过在Kubernetes上运行PostgreSQL数据库,您可以创建统一管理的云原生生产部署,并可以灵活地部署满足您特定需求的个性化数据库即服务. 使用运算符可以让您向Kubernetes提供其他上 ...

  3. 在Windows上开发ROS的正确姿势

    在Windows上开发ROS的正确姿势 之前在Windows我安装ROS的Windows版本,由于国内没有Chocolatey的镜像,安装一遍ROS得花上一整天时间,还不一定能安装成功.另外一个缺点是 ...

  4. kubernetes安装_在 Kubernetes 上安装 Gitlab CI Runner

    在 Kubernetes 上安装 Gitlab CI Runner​www.qikqiak.com 上节课我们使用 Helm 快速的将 Gitlab 安装到了我们的 Kubernetes 集群中,这节 ...

  5. android javamail获取邮件太多太慢_结合 Spring 发送邮件的4种正确姿势,你知道几种?...

    Java程序猿阿谷:面试字节跳动三轮凉凉,内推4面终拿下抖音offer(Java后台研发)​zhuanlan.zhihu.com 一.前言 测试所使用的环境 测试使用的环境是企业主流的SSM 框架即 ...

  6. SpringBoot应用和PostgreSQL数据库部署到Kubernetes上的一个例子

    创建一个名为ads-app-service的服务: 上述Service的yaml文件里每个字段,在Kubernetes的API文档里有详细说明. https://kubernetes.io/docs/ ...

  7. postgresql主从备份_基于windows平台的postgresql主从数据库流备份配置

    基于windows平台的postgresql主从数据库流备份配置 因工作需要,需要搞pg数据库的主从备份,领导给了个方向使用流备份,于是开始朝着这个方向进发. 鸣谢大佬A_ccelerator的博客 ...

  8. 统计twitter帖子_在Kubernetes上部署InfluxDB和Grafana以收集Twitter统计信息

    统计twitter帖子 Kubernetes是市场上容器编排的事实上的领导者,它是一种令人难以置信的可配置且功能强大的编排工具. 与许多强大的工具一样,一开始它可能会让人感到困惑. 本演练将介绍创建多 ...

  9. ajaxfileupload 返回值_用ajaxFileUpLoad上传文件不能正确取得返回值的问题

    c++ eof()函数 C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大 ...

最新文章

  1. php发送http请求的两种常用方法
  2. 02面向对象设计原则
  3. golang zerolog包使用
  4. linux 交叉编译 libxml2,openssl,libssh2
  5. 六面 Google,失败经验分享…
  6. throw()使用小结
  7. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
  8. 速战速决?你不会是不行吧......
  9. 发布服务器 bugzilla, streber 数据库备份方案
  10. 数据竞赛入门-金融风控(贷款违约预测)四、建模与调参
  11. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout
  12. 打印机(Brother MFC-7860DN)一直提示更换墨盒
  13. 《IS-IS网络设计解决方案》一导读
  14. oa系统服务器到国外,oa系统放到云服务器云服务器
  15. 怎么做一个专业的软件安装包?
  16. python爬虫课程大纲_马哥2018python全栈+爬虫+高端自动化课程大纲
  17. 平方根函数sqrt和牛顿迭代法
  18. Parallels Desktop的windows虚拟机无法打开iso文件
  19. Python语音信号特征-感知线性预测系数PLP
  20. 有人负责,才有质量,写给在市集中迷失的一代读后感

热门文章

  1. 转:c/c++ 运行库
  2. [云炬python3玩转机器学习笔记] 3-7Numpy中的矩阵运算
  3. Coursera吴恩达《优化深度神经网络》课程笔记(1)-- 深度学习的实用层面
  4. 安装wrf模式的第一天
  5. java获取2017年第39周_java中怎么样取出39周的每周开始时间和每周结束时间?
  6. 别人写好的爬虫怎么运行_怎么写好楷书?
  7. 3DSlicer20:GUI Structure
  8. PIC单片机入门_PICC头文件介绍
  9. TreeView数据绑定的方法
  10. wireshark数据包分析实战