BDB 5.2新特性简介——SQL 的高可用(High Availability)
Oracle Berkeley DB 11gR2 5.2版本(下文简称BDB 5.2)在SQL接口层引入一个关于 高可用(HA)的新功能,即可以通过PRAGMA配置和启动在多个节点上运行SQL数据库集群的实例,从而通过scale-out的办法将数据库读操作能力扩展到多机上。这一机制的内部原理是使用底层BDB数据库内核的主从复制(即replication)机制。本文将简要介绍SQL HA的使用和实例。
BDB数据库内核的主从复制(BDB HA)工作原理
BDB HA提供主从节点复制,以在分布式系统中提供高可用性和水平读扩展性。每个BDB HA组由单个master节点和多replica节点组成,并提供自动容错切换,其中master提供读写服务,replica节点上提供读服务。Replica为了和master保持数据一致,它会从master或者其他(和master同步的)replica上获得事务日志,并将数据库事务在本地数据库“重演”(replay)。因此,不论master还是replica,所有节点都保留一份当前HA组master上的数据文件和日志。下图1解释BDB的主从复制工作原理。
图 1 BDB HA工作原理
任何HA组有且只能有一个master。启动一个新的HA组前,先显式指派某个节点为master。此后,后续加入的节点都是replica节点。运行过程中,当master被关或者网络不可连接时,该HA组剩余节点将投票选举出新的master,此后,旧master再次加入该HA组时,只能以只读replica的方式进入。
在一个由n个节点构成的HA组中,通过选举产生master,最简单的方式是任何一个参与者投票给它认为拥有最多最新数据的节点,此时,获得半数以上(n/2+1)投票的节点将成为新的master。如果一个HA组无法选举出一个master,该HA组将只能提供读(即查询)服务,不能做数据写操作(如增、删、改)。
感兴趣的同学可以去了解一下分布式消息一致性和投票算法,如paxos,请参见参考文档。
SQL层的主从复制(SQL HA)的工作原理
BDB SQL接口在5.2版本之前仅支持单节点的扩展性,通过SQL语句管理和操作数据库。在BDB 5.2版本中,BDB SQL引入多机扩展的功能(即HA,又叫主从复制的高可用),提供分布式多机环境下的SQL数据库集群功能。因此SQL HA为数据库提供更强大的读操作能力和更高的数据库服务可用性(即高可用)。
BDB 底层HA机制中,每个节点都是拥有唯一主机名和端口组合的BDB环境(可以看成是一个关系型数据库实例),而一个BDB环境可以有多个数据库(可以看成是关系型数据库的二维表)。而在SQL HA中,每个节点是拥有唯一主机名和端口组合的BDB数据库,每个数据库拥有各自的BDB环境。与BDB 底层HA机制略有不同的是,SQL HA里的复制粒度是单个数据库表(BDB里面称之为数据库),这个粒度比前者更细。如下图2所示:
图 2 BDB SQL HA架构示意图
SQL HA的使用语法
你可以通过BDB SQL层的PRAGMA指令来配置高可用的相关参数并启动集群。以下是相关的语法:
(1) 启动和关闭HA:PRAGMA replication=ON|OFF
该语句必须在BDB SQL创建或重建数据库之前设置。在此之前,应先设置本地节点的地址和端口,以及本地节点是否是master,如果不是,则应设置一个远程节点的地址和端口。当HA初始化之后,可以关闭replication,但是它仅在下一次重开这个环境的时候起效。
(2) 设置本地节点是否master:PRAGMA replication_initial_master=ON|OFF
该语句只能在初次创建一个HA时使用,本地节点是这个新的HA的第一个节点,其master的角色不是无限期的,当master掉线时,master的角色有可能转移到其后进入HA的节点上。
(3) 设置本地节点的地址和端口:PRAGMA replication_local_site=”hostname:port”
(4) 设置远程节点的地址和端口:PRAGMA replication_remote_site=”hostname:port”
当加入一个已存在的HA时,本地节点需要知道一个在线的远程节点,以帮助其进入HA。
(5) 设置被删除节点的地址和端口:PRAGMA replication_remove_site=”host:port”
永久地删除HA中的一个节点。与暂时掉线或者被关闭的节点不同,HA的任何一个有效节点都不再记录该节点,即HA中的节点数量减一。
(6) 设置是否输出HA相关日志信息:PRAGMA replication_verbose_output=ON|OFF
(7) 设置HA相关日志信息的输出文件:PRAGMA replication_verbose_file=filename
应用示例
本文将示范如何在BDB SQL的命令行工具中配置和运行一个三个节点的HA。
(1) 配置首个节点,即master
// 创建数据库
dbsql univ.db
pragma replication_local_site="localhost:10001";
// 指定为该组的master
pragma replication_initial_master=ON;
// 启动replication
pragma replication=ON;
(2) 加入第二个节点
// 创建数据库,HA里每个节点的数据库名字应相同
dbsql univ.db
pragma replication_local_site="localhost:10002";
// 指定一个在线节点
pragma replication_remote_site="localhost:10001";
pragma replication=ON;
(3) 在第一个节点上插入数据
INSERT INTO university VALUES(2, "Harvard University", "harvard.edu", "us", "North America", 7 , 2, 12, 1);
(4) 在第二个节点查询数据
SELECT * FROM university;
(5) 加入第三个节点
dbsql univ.db
pragma replication_local_site="localhost:10003";
// 第一个或者第二个节点都可以成为第三个节点的远程节点
pragma replication_remote_site="localhost:10002";
pragma replication=ON;
(6) 在第三个节点删除第二个节点
PRAGMA replication_remove_site="localhost:10002";
CREATE TABLE university (
rank int,
name varchar(75),
domains varchar(75),
country varchar(30),
region varchar(30),
size int,
visibility int,
rich int,
scholar int
);
第二个节点被删除后,将不再获得第一个节点上的数据更新。
(7) 第三个节点设置不启动replication,并重新启动第三个节点
PRAGMA replication=OFF;
.quit
dbsql univ.db
关闭之后的所有HA数据更新都不会再应用到第三个节点上,该节点变成单机数据库,可进行读写操作。
参考文档
- SQL HA 相关的Pragma指令: http://download.oracle.com/docs/cd/E17076_02/html/bdb-sql/addedpragmas.html#replication_pragmas
- BDB主从复制机制介绍:http://www.oracle.com/technetwork/database/berkeleydb/overview/high-availability-099050.html
- SQL HA应用示例代码:http://download.oracle.com/docs/cd/E17076_02/html/bdb-sql/rep_usageexamples.html
- Paxos算法:http://en.wikipedia.org/wiki/Paxos_%28computer_science%29


你好,请教一个问题,我正在使用berkeley db写数据,数据大概有1亿条,10GB,写入方式是逐条put进去,整个建库过程速度非常慢(>10个小时),采用的是btree。bdb是5.2.28版本。请问可能是什么原因导致的呢?是不是btree方式的建库就要消耗这么多时间?
@liangde
1亿条数据用了超过10小时,听上去有点慢。你用的什么机器(CPU,内存,操作系统,磁盘)和什么样的BDB设置(cache, page, 事物等)。请按照要求提供进一步信息,然后发到我邮箱来: chao.huang[at]oracle[dot]com