浅谈OceanBase的多线程并发日志回放
OceanBase选择了强一致性,主UpdateServer往备UpdateServer同步操作日志,如果同步成功,主UpdateServer操作本地后返回客户端更新成功,否则,主UpdateServer会把备UpdateServer从同步列表中剔除。另外,剔除备UpdateServer 之前需要通知RootServer,从而防止RootServer将不一致的备UpdateServer 选为主UpdateServer。
如下所示,主UpdateServer往备机推送操作日志,备UpdateServer的接收线程接收日志,并写人到一块全局日志缓冲区中。备UpdateServer只要接收到日志就可以回复主UpdateServer同步成功,主UpdateServer接着更新本地内存并将日志刷到磁盘文件中,最后回复客户端写入操作成功。这种方式实现了强一致性,如果主UpdateServer出现故障,备Updatcserver包含所有的修改操作,因而能够完全无量地切换为主Updateserver继续提供服务。另外,主备同步过程中要求主机刷磁盘文件,备机只需要写内存缓冲区,强同步带来的额外延时也几乎可以忽略。
OceanBase引入多版本并发控制机制后,UpdateServer备机支持多线程并发回放日志功能。如上图所示,有一个日志分发线程每次从日志源读取一批日志,拆分为单独的日志回放任务交给不同的日志回放线程处理。一批日志回放完成时,日志提交线程会将对应的事务提交到内存表并将日志内容持久化到日志文件。
class ObLogReplayWorker { public: //提交一批待回放的操作日志 // @param [out]task_id 最后一条操作日志的编号 //@param [in] buf 日志缓冲区 // @param [in]len 日志缓冲区的大小 //@paran [in]replay_type 日志回放类型,包话RT_LOCAL(回放本地日志)和RT_APPLY(回放通过网络接收到的日志) int aubmit_batch(int64_t4& task_id, const char* buf, int64_t len, const ReplayType replay_type); public: //需放一条操作日志 int handle_apply(ObLogTask* task); };
备UpdateServer 有专门的日志回放线程不断地调用ObUpsLog-Mgr中的replay_log函数获取并回放操作日志。UpdateServer 支持多线程并发写事务后,replay log函数实现成调用ObLogReplay Worker中的submit_batch,将一批待回放的操作日志加入到回放任务队列中。多个日志回放线程会取出回放任务并不断地调用Handle_apply回放操作日志,即首先将操作日志预提交到MemTable中,接着加入到提交任务队列。另外,还有一个单独的提交线程会从提交任务队列中一次取出一批任务,提交到MemTable并持久化到日志文件中。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
难以置信,MySQL也可以无损自由切换
MySQL通常在人们眼中就是一个低端、开源、大众化的数据库产品,它的稳定性和可用性一直被人们所置疑,被认为难登大雅之堂,只适用于互联网应用,难于应用到可用性高的场景中,比如金融、证券等行业。然而时代的变化太快,MySQL也不能再以过去的眼光来看,从MySQL金融版的诞生开始,它已经不再是那个扶不起的阿斗,它已经脱胎换骨,以一个崭新的形象出现在数据库的高端产品中。 这一切真的难以置信,在开源数据库产品中,MySQL从来都是一枝独秀,但在表面风光的同时,却是DBA和资深用户的满心苦涩。由于硬件、网络的可用性还难以达到理想的要求,无论出现任何故障,数据库系统都必须保证其可用性。对于MySQL来说,大家所熟知的主备集群是最常见的解决方案。由于MySQL的架构设计原因,主备集群的解决方案虽然不完美,但也是其最好
- 下一篇
postgresql架构基础
PostgreSQL使用一种客户端/服务器的模型。一次PostgreSQL会话由下列相关的进程(程序)组成: 一个服务器进程,它管理数据库文件、接受来自客户端应用与数据库的联接并且代表客户端在数据库上执行操作。 该数据库服务器程序叫做postgres。 那些需要执行数据库操作的用户的客户端(前端)应用。 客户端应用可能本身就是多种多样的:可以是一个面向文本的工具, 也可以是一个图形界面的应用,或者是一个通过访问数据库来显示网页的网页服务器,或者是一个特制的数据库管理工具。 一些客户端应用是和 PostgreSQL发布一起提供的,但绝大部分是用户开发的。 和典型的客户端/服务器应用(C/S应用)一样,这些客户端和服务器可以在不同的主机上。 这时它们通过 TCP/IP 网络联接通讯。 你应该记住的是,在客户机上可以访问的文件未必能够在数据库服务器机器上访问(或者只能用不同的文件名进行访问)。 PostgreSQL服务器可以处理来自客户端的多个并发请求。 因此,它为每个连接启动("forks")一个新的进程。 从这个时候开始,客户端和新服务器进程就不再经过最初的 postgres进程的干涉进...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7安装Docker,走上虚拟化容器引擎之路