MYSQL POLARDB 学习系列之 拆解 POLARDB 7 (终结) 失败恢复与可靠性
学习POLARDB 已经有3-4个月的时间了,当然大部分还是在理论方面,实际上POLARDB 在实际的操作中,有一部分是我还没有深入,另一部分是POLARDB 的 SERIVCE guy 的服务方式有些太主观,当然有客观的原因,但是作为一个数据库,想拥有FANS ,各种在内部进行展示的系统性能或一些小心思的开关,还是会吸引到 死忠粉的,建议不要冷冰冰的说,这些都是内部XX, 或者说你看 monitor web page 来打发一些想“进步” 的同学,终究我们也是看 MYSQL 的文档,并在里面找 有意思东西的一群人。另外一些服务的同学,你们这样做,真心是在浪费 技术同学的努力创造POLARDB 的好形象。
本篇是POLARDB 的翻译,并学习理论的最后一篇
5 Reliability and failure recovery
在POLARDB SERVERLESS,自身的结构是允许节点可以独立的进行failover, 所以我们有针对每种失败后的恢复的方法,大部分恢复的方法都是针对POLARDB 本身设计的,所有的代理节点都属于无状态的,当代理节点失败了,他能够很容易的被替代,用户可以重新连接其他存活的节点,POLARDB SERVERLESS 会至少保持两个与存储节点的复制,这些都被分布式协议parallel raft 来保证数据的一致性,这里我们保证没有任何单点的服务。
下面我们将关注复杂处理数据库节点recovery 的机制,内存节点机制,和集群恢复等
5.1 DATABASE NODE RECOVERY
PolarDB SERVERLESS 采用了 ARIES-STYLE 恢复逻辑,RW 和 RO 节点都有不同的恢复过程和程序的支持。一个失败的RO节点能够被很容易的替换掉,通过一个新的节点,这个新的节点的信息使用share memory 中的页面。基于节点的失效是有计划的还是突然的,恢复的方式也是不同的。
非计划的节点失败:当写节点是吧,集群的管理CM发现并记录这个时间通过heartbeat 信号,并且初始化一个RO节点来提升成主节点,这里面经历了如下的过程
1 CM 通告所有的存储节点的内存拒绝来自于RW 节点的写请求
2 CM 选择一个RO节点,并且通知他将要被提升
3 这个将要被提升的节点收集最后的LSN 版本信息,通过polarfs的页面chunk,并且获得CHECKPOINT最后一次的最小的LSN号。
4 RW提升的节点读取REDO LOG 的记录,并且持久化信息在POLARFS 日志CHUNK,同时等待这段REDO LOG的 LSN 信息被应用完毕,然后等待这些页面被消化完全写入到页面中。
5 RW 提升的节点会扫描远程内存池,并且清理超过刚才在REDO 中重做后的页面信息,保证页面的一致性。
6 RW提升节点是否从原来失败节点中获得的PL锁
7 RW 提升节点扫描在RW 节点失败这段期间的所有的活跃的事务的页面的页头
8 RW 提升的节点已经准备好接受写的请求,在CM 节点完成提升的工作
9 RW 节点去应用UNDO LOG 要进行回滚的那些uncommited 事务
这里要提及的是在 3-4 中的REDO 的重做的过程不是和MYSQL一样的单机模式,而是并发的在不同的页面中进行进行的,步骤5 中的页面的清理是在远程的内存中,并且清理的页面是版本信息不一致的页面,这里重点是内存页面的信息一定不能低于磁盘中的信息。另一方面RW是可以写脏页到远程的内存中的,并且在REDO LOG 被刷新的POLARFS 之前,所有远程内存页面的信息是有可能高于POLARFS存储中的信息的。
因此这些页面也需要被清理掉,在 3 4 5 操作完毕后,REDO LOG 在POLARFS, 数据页面在POLARFS,以及远程内存中的页面,应该就一致了,数据库就达到了一致性的状态。此时如果没有SMO的工作,那么所有PL锁被释放是安全的(这一段不明白的,看上一篇SMO 解释),同时此时大部分活跃的数据还是在REMOTE MEMORY的内存池中的,这样就避免了CACHE 数据不一致的问题,虽然REDO 重做在单机是一个普通的工作,但是基于POALRDB 的硬件体系,REDO 的工作也将是一个复杂的工作,需要重新的设计和安排。
Planned node down
相关文章
- MySQL Error number: MY-012975; Symbol: ER_IB_MSG_1150; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-013481; Symbol: ER_AUDIT_LOG_HAS_NOT_BEEN_INSTALLED; SQLSTATE: HY000 报错 故障修复 远程处理
- 学习MySQL还是PHP?(先学php还是mysql)
- 深入学习MySQL查询类型(mysql查询类型)
- 优化MySQL视图的性能表现(mysql视图性能优化)
- MySQL数据存储的安全之旅(mysql数据存储地址)
- MySQL查看表分区的指南(mysql查看分区)
- 掌握MySQL:完整的学习路线(mysql学习路线)
- 轻时代MySQL: 助力新时代迈向未来(mysql年)
- MySQL连接:轻松实现数据库交互!(mysql连接软件)
- 如何查看MySQL数据库引擎类型(如何查看mysql引擎)
- MySQL中利用无符号INT的优势(mysql无符号int)
- 据库攻城狮MySQL:一个有梦想的小攻城狮(mysql一位小数)
- MySQL学习之旅:构建自己的计划(mysql学习计划)
- MySQL运维指南:从零基础到实用技巧,告诉你如何高效管理MySQL数据库。(mysql运维书籍)
- 【技术教程】使用MySQL轻松取得年份(mysql取年份)
- MySQL学习笔记:分位数统计方法(mysql分位数)
- MySQL学习:如何使用删除字段语句?(mysql表删除字段语句)
- 学习 MySQL:中文 PDF 一键下载。(mysql中文pdf)
- MySQL数据建模:最佳解决方案(mysql数据建模工具)
- MySQL获取日期:一步一步学习(mysql获取日期)
- 学习如何使用Django连接MySQL数据库(django连接mysql)
- 如何解决忘记MySQL用户名密码问题(忘记mysql用户名密码)
- MySQL中查看列结构的简便方法(mysql查看列)
- 轻松学习MySQL数据库搭建教程(mysql数据库搭建教程)
- 快速、简单的方法:使用 MySQL 查询一条记录(mysql查找一条记录)
- MySQL中使用AND命令的条件语句(mysql中且的条件命令)
- MySQL学习不常见写法详解(mysql中不包含的写法)
- MySQL中如何创建唯一索引(UQ)(mysql中uq)
- MySQL学习笔记如何使用chr函数(mysql中chr函数)
- MySQL中遇到2003错误,怎么办(mysql中出现2003)
- MySQL学习使用 mysqlclose 函数关闭数据库连接(mysql_close6)
- MySQL如何导出表学习一下(mysql下导出表)
- 学习MySQL,必看的上传教程视频(mysql上传教程视频)
- 轻松解决数据存储探讨不用关系表的MySQL操作方法(mysql不用关系表)