特性
- 所有的
replica在一个数据中心, 配置管理器决定每个数据分区中哪个服务器是Primary, 哪个服务器是Backup, 使用ZooKeeper来实现配置管理器 - 使用主从复制的方式容错, 读写数据都在
Primary上 - 事务协调器
CM, 执行事务, 充当两阶段提交中事务协调器的角色
高性能
- 数据分片, 并行处理
- 数据存放
RAM中而不是持久化到磁盘 - 使用
Remote Direct Memory Access, RDMA, 直接对服务器的内存进行读写
RAM 断电的问题
尽量让其不断电, 所以为每个服务器配备一个备用的电池
至少可以撑到电池没电, 从而让管理员重新接上电源
服务器会在断电的时候向其他服务器发送信号, 会停止当前正在进行的任务并把 RAM 中的数据写入磁盘, 这样可以放置大范围的供电故障引起的数据丢失
这种方案只适用于断电的故障, 对于其他类型的让服务器关机的故障并不起作用
RDMA

传统网络: 应用 -> Socket(用于缓存) -> TCP -> NIC Driver -> NIC -> 另一台机器的 NIC -> NIC Driver -> buffer -> 应用
Kernal Bypass: 应用 -> NIC -> 另一台机器的 NIC -> 应用, 但是需要应用来实现 TCP 相关的功能
RDMA: 用特殊的网卡(支持 RDMA), 不再发送 RPC, 而是直接对内存进行读写
乐观并发控制
乐观锁机制下, 可以在没有锁的情况下读取数据
之后将对数据的修改缓存在本地, 事务结束的时候尝试提交
由事务管理系统来验证你的提交是否合法
如果你读写操作的顺序与执行顺序一致, 那么成功提交, 否则终止并重新执行
如何验证是否合法?
API
1 | txCreate() |
OID 包括 Region 和 Access 定位访问的位置
服务器内存布局
每个服务器分为多个 Region, 每个 Region 存储数据对象
还存储着 n 个日志队列和消息队列, n 是服务器数量, 其他服务器通过 RDMA 修改队列
数据对象的头部数据, 高位是锁标志位, 低位是对象的版本号

第一个阶段是 Execute phase, C 通过 RDMA 向 $P_{1-3}$ 读取数据
LOCK
客户端(扮演协调器的角色)把数据写入 Primary, Primary 尝试使用 CAS 来锁定版本, 如果失败就返回 NO, 成功就加锁返回 YES
VALIDATE
RDMA 读版本, 检查是否改变
COMMIT BACKUP
发送给 backup, 等待 NIC 确认
COMMIT PRIMARY
发送数据给 primary 更新数据并解锁, 等待 NIC 确认
TRUNCATE
通知各服务器删除对应日志