2020-09-28

关于GBase XDM复制功能的详解(1)

 

南大通用公司数据库产品GBase XDM是自主开发的一款内存级的对象数据库,其复制功能可实现数据的实时/定时数据同步。保证在一个分布式的环境中, 主服务器的数据和从服务器的数据保持一致。

 

既然是复制,我们就要谈一下角色。在复制的环境中设计到以下角色:

  1. 主数据库:主数据库的数据能够进行读写的操作。主数据库可处理从数据库客户机发出的更新请求。
  2. 从数据库:包含主数据库所含信息副本数据库。从数据库可处理来自客户机的搜索请求。
  3. 中间数据库:中间服务器数据库接收来自主数据库的修改,并把变化传送到从数据库。

 

GBase XDM数据库有三种复制的方式,分别是推拉复制、主从复制、和镜像复制。

这次我们先介绍推拉复制。          

推拉复制是由数据使用方在本地维护信息数据片段的镜像拷贝。是通过服务进程来实现的。可以周期性地获取数据提供方的数据更新。它以维护和交换cookie的方式,保持对复制内容状态的跟踪。因为使用者和提供者维护各自数据内容的状态,使用者可以通过向提供者查询所需要的条目来进行增量的同步。

在拉模式同步模式中,提供者使用基于拉的同步机制,提供者不需要跟踪使用者,也不需维护历史信息。提供者用来处理周期性检测请求的信息包含在请求的同步cookie中。在推拉同步模式中,提供者使用基于推的同步机制,提供者保持跟踪使用者,使用者请求了持久的查询,提供者在复制内容改变时发送给使用者必需的更新。

 

举个例子:

 

1)从数据库发送请求,进行数据同步初始化,此时无须发送同步cookie;

2)主数据库接收从数据库请求,将初始数据及表示当前状态cookie返回给从数据库;

3)从数据库接收主数据库数据,更新本地数据,并保存cookie,cookie中的主要内容项有环境CSN,用该项来表示同步状态;

4)此时应用系统对主数据库进行了操作;

5)主数据库将数据保存,并更新相应的CSN,包括条目的CSN及环境CSN;

6)当从数据库同步周期到时,从将向主发送同步变更数据请求,该请求包含了上次同步后获得的环境CSN;

7)主数据库接收到从数据库的请求后,将所有条目CSN大于从数据库发过来的环境CSN的所有条目及新的环境CSN发送给从数据库;

8)从数据库接收主数据库数据,据新变化更新本地数据,同时更新本地cookie,以便下次使用。如此循环往复,实现主数据库和从数据库之间的数据同步。

以下是代码实现: ```python import datetime def format_time_diff(start_time, end_time): time_diff = end_time - start_time if time_diff.days > 365: return end_time.strftime("%Y年%m月") elif time_diff.days > 30: return end_time.strftime("%Y年%m月%d日") elif time_diff.days > 0: return f"{time_diff.days}天前" elif time_diff.seconds > 3600: return f"{int(time_diff.seconds/3600)}小时前" elif time_diff.seconds > 60: return f"{int(time_diff.seconds/60)}分钟前" elif time_diff.seconds > 0: return f"{time_diff.seconds}秒前" else: return "未来时间" start_time = datetime.datetime(2018, 3, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 1, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 8, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 20) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 50) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 30, 40) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") ``` 输出结果为: ``` 2018-03-01 09:00:00 -> 2020-02-29 09:30:30: 2018年03月 2020-01-01 09:00:00 -> 2020-02-29 09:30:30: 2020年01月01日 2020-02-01 09:00:00 -> 2020-02-29 09:30:30: 28天前 2020-02-29 08:00:00 -> 2020-02-29 09:30:30: 1小时前 2020-02-29 09:29:20 -> 2020-02-29 09:30:30: 1分钟前 2020-02-29 09:29:50 -> 2020-02-29 09:30:30: 40秒前 2020-02-29 09:30:40 -> 2020-02-29 09:30:30: 未来时间 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值