1. 集群的启停
启动
手工启动特定节点
当集群中某个节点失效后,用户可以在 sdb 命令行使用如下步骤启动节点。假设 SequoiaDB 的安装路径为/opt/sequoiadb
- 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost", 11810) ;
- 得到分区组
> dataRG = db.getRG ( "<datagroup1>" ) ;
- 得到数据节点
> dataNode = dataRG.getNode ( "<hostname1>", "<servicename1>" ) ;
- 启动节点
> dataNode.start() ;
手工启动数据组
当集群中某个数据组被停止后,用户可以在 sdb 命令行使用如下步骤启动数据组。该操作会启动数据组中全部数据节点。
- 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost", 11810) ;
- 得到分区组
> dataRG = db.getRG ( "<datagroup1>" ) ;
- 启动数据组
> dataRG.start();
2. 备份恢复
数据备份
当前版本中,数据备份支持离线备份,即数据备份期间需要中断插入、更新、删除等变更操作,只支持查询操作。当前备份支持两种方式:全量备份和增量备份
- 全量备份:备份整个数据库的配置、数据和日志;
- 增量备份:在上一个全量备份或增量备份的基础上备份新增的日志和配置;
离线备份参数说明
参数 | 说明 |
---|---|
Name | 备份名称,缺省则以当前时间格式命名,如“2013-11-13-15:00:00”。 |
Description | 备份用户描述信息。 |
Path | 本次备份的指定路径,缺省为配置参数“bkuppath”中指定的路径。 |
EnsureInc | 备份方式,true 表示增量备份,false 表示全量备份,缺省为 false。 |
OverWrite | 对于同名备份是否覆盖,true 表示覆盖,false 表示不覆盖,如果同名则报错;缺省为 true。 |
GroupName | 对指定组进行备份,缺省为对全系统备份,当需要对多个组进行备份可以指定为数组类型,如:["datagroup1","datagroup2"]。 |
备份整个数据库
1. 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost",11810);
2. 执行备份命令
> db.backupOffline({Name:"backupName",Description:"backup for all"})
备份指定组的数据库
1. 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost",11810);
2. 执行备份命令
> db.backupOffline({Name:"backupName",Description:"backup group1",GroupName:"datagroup1"})
备份指定节点的数据库
1. 连接到指定节点
$ /opt/sequoiadb/bin/sdb > var dbdata = new Sdb("hostname1","servicename1");
2. 执行备份命令
> dbdata.backupOffline({Name:"backupName",Description:"backup data node"}))
3. 故障恢复
4. 监控
查看备份信息
备份信息查看可以通过客户端和手工查看。
查看备份信息参数说明
参数 | 说明 |
---|---|
Name | 备份名称,缺省则查看目录下所有备份信息。 |
Path | 查看备份的指定路径,缺省为配置参数“bkuppath”中指定的路径。 |
GroupName | 查看指定组的备份信息,缺省为查看全系统备份信息,当需要查看多个组的备份信息可以指定为数组类型,如:["datagroup1","datagroup2"]。 |
查看全系统备份信息
1. 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost",11810);
2. 执行查看备份信息命令
> db.listBackup() { "Name": "test_bk", "NodeName": "vmsvr2-suse-x64-1:11800", "GroupName": "SYSCatalogGroup", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 18744, "StartTime": "2013-11-13-16:06:31", "HasError": false } { "Name": "test_bk", "NodeName": "vmsvr2-suse-x64-1:11820", "GroupName": "db1", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 920424, "StartTime": "2013-11-13-16:06:31", "HasError": false }
查看指定名称的备份信息
1. 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost",11810);
2. 执行查看备份信息命令
> db.listBackup({Name:"backup1"}) { "Name": "backup1", "NodeName": "vmsvr2-suse-x64-1:11820", "GroupName": "group1", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 108744, "StartTime": "2013-11-13-16:06:31", "HasError": false }
手工查看备份信息
手工查看备份信息直接通过终端登入指定机器,并进入到相应的备份目录中,执行“ls -l”
use@vmsvr2-suse-x64-1:/opt/sequoiadb/database/11820/bakfile> ls -l total 37328 -rw-r----- 1 sdbadmin sdbadmin 38157784 Nov 13 16:06 test_bk.1 -rw-r----- 1 sdbadmin sdbadmin 65536 Nov 13 16:06 test_bk.bak
数据恢复
使用备份的数据恢复某个分区组。执行数据恢复必须确保相应组已停止运行,数据恢复首先会清空原节点的所有数据和日志,然后从备份的数据中恢复配置、数据和日志。
数据恢复工具参数说明
参数 | 缩写 | 说明 |
---|---|---|
--bkpath | -p | 备份源数据所在路径。 |
--increaseid | -i | 需要恢复到第几次增量备份,缺省恢复到最后一次。 |
--bkname | -n | 需要恢复的备份名。 |
--action | -a | 恢复行为,“restore”表示恢复,“list”表示查看备份信息,缺省为“restore”。 |
--isSelf | 是否为恢复本节点数据,缺省为“true”;当取值为“false”时,根据如下参数将数据恢复至指定路径: | |
--dbpath | 必须配置,数据文件目录。 | |
--confpath | 必须配置,配置文件路径。 | |
--svcname | 必须配置,本地服务名或端口。 | |
--indexpath | 索引文件目录。 | |
--logpath | 日志文件目录。 | |
--diagpath | 诊断日志文件目录。 | |
--bkuppath | 备份文件目录。 | |
--replname | 复制通讯服务名或端口。 | |
--shardname | 分区通讯服务名或端口。 | |
--catalogname | 编目通讯服务名或端口。 | |
--httpname | REST 服务名或端口。 |
恢复数据
- 连接到协调节点
$ /opt/sequoiadb/bin/sdb > var db = new Sdb("localhost", 11810) ;
- 得到分区组
> dataRG = db.getRG ( "data" ) ;
- 停止分区组
> dataRG.stop()
- 通过终端登入相应分区组的数据节点,执行数据恢复。
sdbadmin@vmsvr2-suse-x64-1:/opt/sequoiadb> bin/sdbrestore -p database/11820/bakfile -n test_bk Begin to clean dps logs... Begin to clean dms storages... Begin to init dps logs... Begin to restore... Begin to restore data file: 11820/bakfile/test_bk.1 ... Begin to restore su: test.1.data ... Begin to restore su: test.1.idx ... Begin to restore dps logs... ***************************************************** Restore succeed! *****************************************************
- 到数据节点目录检查文件是否恢复。
sdbadmin @vmsvr2-suse-x64-1:/ opt/sequoiadb /database/11820> ls -l total 299156 drwxr-xr-x 2 sdbadmin sdbadmin 4096 Nov 13 16:06 bakfile drwxr-xr-x 2 sdbadmin sdbadmin 4096 Nov 13 15:48 diaglog drwxr-xr-x 2 sdbadmin sdbadmin 4096 Nov 13 17:39 replicalog -rw-r----- 1 sdbadmin sdbadmin 155254784 Nov 13 17:39 test.1.data -rw-r----- 1 sdbadmin sdbadmin 151060480 Nov 13 17:39 test.1.idx
- 删除该分区组中其它数据节点的所有数据(或者将该节点的所有 .data 和 .idx 文件拷贝至其它数据节点的数据目录和索引目录下,以及将该节点 replicalog 所有日志拷贝至其它数据节点的日志目录下,或者将备份文件拷贝至其它数据节点,并通过 restored 工具恢复);重新启动系统。
-
备份前确认数据库无插入,更新,删除等变更操作;
-
进入 sdb 客户端;
# /opt/sequoiadb/bin/sdb
-
连接其中 coord 节点
> var db = new Sdb('htest1', 11810)
-
检查数据库是否有备份;
检查数据库集群内所含有的数据:> db.list(4) { "Name": "foo.bar" } Return 1 row(s). Takes 0.2882s. > db.foo.bar.count() 2880000 Takes 0.2586s. > db.listBackup() Return 0 row(s). Takes 0.6483s.
-
执行数据库备份;
数据库集群备份是按组为单位进行备份的,故在备份的时候需要指定组进行备份。如下操作对编目组进行备份,备份完成后并且检查是否备份成功,此备份文件保存在主机 htest1: /opt/sequoiadb/database/cata/30000/bakfile/ 下面。> db.backupOffline({Name:"catalogBackup",GroupName:"SYSCatalogGroup"}) Takes 1.762381s. > db.listBackup() { "Name": "catalogBackup", "NodeName": "htest1:30000", "GroupName": "SYSCatalogGroup", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 9716, "StartTime": "2014-07-29-22:34:40", "HasError": false } Return 1 row(s). Takes 0.7994s.
数据组也采用与编目组同样的方式进行备份,其备份文件保存在主机 htest3 上,目录名为:/opt/sequoiadb/database/data/41000/bakfile/> db.backupOffline({Name:"datagroupG1Backup",GroupName:"g1"}) Takes 12.85741s. > db.listBackup({Name:"datagroupG1Backup",GroupName:"g1"}) { "Name": "datagroupG1Backup", "NodeName": "htest3:41000", "GroupName": "g1", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 460800544, "StartTime": "2014-07-29-22:41:40", "HasError": false }
Note: 如果想要一次将整个数据库备份完成,则可执行数据库备份操作且不提供任意参数。如此即可一次备份完成整个数据库集群,包含编目组与数据组。默认备份到相应组主节点的 bakfile 下 /opt/sequoiadb/database/../../dialog/bakfile> db.backupOffline()
-
查看备份;
> db.listBackup() { "Name": "catalogBackup", "NodeName": "htest1:30000", "GroupName": "SYSCatalogGroup", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 9716, "StartTime": "2014-07-29-22:34:40", "HasError": false } { "Name": "datagroupG1Backup", "NodeName": "htest3:41000", "GroupName": "g1", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 460800544, "StartTime": "2014-07-29-22:41:40", "HasError": false } Return2 row(s). Takes 0.16428s.
如果不指定路径备份,则数据库默认备份到相应组的主节点数据库目录下的 bakfile 文件夹中。若备份在其它路径下,则查看的时候需要带路径参数。
数据恢复
使用数据库的备份文件来恢复某个分区组。执行数据恢复必须确保相应组已停止运行,数据恢复首先会清空原节点的所有数据和日志,然后从备份的数据中恢复配置,数据和日志。数据恢复工具位于: /opt/sequoiadb/bin/sdbrestore,执行 ./sdbrestore --help 可以查看相应的参数。
恢复流程:
-
停止相关的组的数据库服务进程;
停止数据库服务最好通过 sdb 客户端来完成,这样不需要去集群节点所在的机器去停止数据库,如 g1。当停止的组中包含 catalog 编目组时,要最后再停止编目组。sdbadmin@htest1:~$ /opt/sequoiadb/bin/sdb > var db = new Sdb('localhost',11810) > datarg = db.getRG('g1') > datarg.stop()
-
将数据库备份文件拷贝到共享目录下;
由于 SequoiaDB 数据的恢复只能对一台机进行恢复,故将数据库备份文件拷贝到数据库集群机器所共享的目录下。如共享目录为 /mnt/xiaojun/BACKUP,则拷贝如下:sdbadmin@htest1:/opt/sequoiadb$ cp -r /opt/sequoiadb/database/cata/30000/bakfile/ /mnt/xiaojun/BACKUP/bakfile.30000.htest1 sdbadmin@htest3:/opt/sequoiadb$ cp -r /opt/sequoiadb/database/data/41000/bakfile/ /mnt/xiaojun/BACKUP/bakfile.41000.htest3
拷贝到共享目录下的好处是在恢复操作时只用一个共享目录即可,而不用每一台要恢复的机器都拷贝一份备份文件到那台机器中去。
-
数据恢复操作;
恢复工具(sdbrestore)位于 SequoiaDB 数据库中的 bin 目录下面(/opt/sequoiadb/bin)。通过 sdb shell 登入分区组的数据节点,执行数据恢复。执行恢复操作时,至少要对一个组中超过半数的节点进行恢复,最好是对组内所有的节点进行恢复操作。此数据库集群包含两个组:编目组“SYSCatalogGroup”和一个数据组“g1”,分别布署在三台主机上:htest1/htest2/htest3。恢复节点操作时需要进到节点所在的主机分别进行恢复。如恢复位于主机 htest1 上的编目节点则要在此主机内执行操作:sdbadmin@htest1:/opt/sequoiadb/bin$ ./sdbrestore -p /mnt/xiaojun/BACKUP/bakfile.30000.htest1/ -n catalogBackup --dbpath \ > /opt/sequoiadb/database/cata/30000/ --confpath /opt/sequoiadb/conf/local/30000/ --svcname 30000 2014-07-29-23.09.19.382036 Level:EVENT PID:9556 TID:9556 Function:pmdRestoreThreadMain Line:491 File:SequoiaDB/engine/pmd/sdbrestore.cpp Message: Start sdbrestore [Ver: 1.8, Release: 13673, Build: 2014-07-22-00.11.23(Debug)]... . . . ***************************************************** Restore succeed! *****************************************************
此时仅恢复了 htest1 的编目节点,采用同样的方式去将 htest2 和 htest3 的编目节点启动起来。
恢复数据组 g1 的数据节点,和恢复编目组节点的方法类似。三台机 htest1/htest2/htest3 中的数据节点均采用如下方法分别进行恢复:sdbadmin@htest1:/opt/sequoiadb/bin$ ./sdbrestore -p /mnt/xiaojun/BACKUP/bakfile.41000.htest3/ -n datagroupG1Backup --dbpath \ > /opt/sequoiadb/database/data/41000/ --confpath /opt/sequoiadb/conf/local/41000/ --svcname 41000 2014-07-29-23.18.08.966708 Level:EVENT PID:9590 TID:9590 Function:pmdRestoreThreadMain Line:491 File:SequoiaDB/engine/pmd/sdbrestore.cpp Message: Start sdbrestore [Ver: 1.8, Release: 13673, Build: 2014-07-22-00.11.23(Debug)]... . . . ***************************************************** Restore succeed! *****************************************************
-
检查数据库集群的恢复是否正确;
通过 sdb 客户端对恢复好的数据库进行简单的数据操作,如增删改查等。sdbadmin@htest1:~$ /opt/sequoiadb/bin/sdb > var db = new Sdb('htest1',11810) Takes 0.8073s. > db.list(4) { "Name": "foo.bar" } Return 1 row(s). Takes 0.47547s. > db.foo.bar.count() 2880000 Takes 0.164788s. > db.foo.bar.find().limit(1) { "_id": 4000000, "id": 4000000, "ID": "http://www.sequoiadb.com", "change": "ccc", "info": "email:contact@sequoiadb.com" } Return 1 row(s). Takes 0.28824s. > db.foo.bar.insert({testing:"testingBackup"}) Takes 0.296942s. > db.foo.bar.find({testing:"testingBackup"}) { "_id": { "$oid": "53d7c4f9c6e6fab31f000000" }, "testing": "testingBackup" } Return 1 row(s). Takes 4.311792s.
通过此操作可基本确定数据库恢复成功。