7月 07

mongodb双机主从同步初步学习

mongodb主从同步
【2011-07-06 张子萌】

mongodb的主从同步非常简单。主机启动声明自己是主机,从机启动时只需要声明自己是从机,
并填写主机的IP和端口启动即可。

数据同步实现了读写分离,在压力比较大的时候可以设置多太从机,分离读的压力。主从模式有
数据复制和Replica pairs模式模式服务器
断电或者损坏的情况下的从机会自动接管,并升级为主服务器。主机在修复后变为从机,当从机宕机
后系统会自动切换为之前的主机。在主从认证的同时也会有认证机制,用户可以创建用户信息。

a)在mongod中主从的参数如下
–master 主机模式
–slave 从机模式
–source arg 在从机上指定主机的信息
–only arg 在从机上可以指定一个数据库用于复制
–slavedelay arg 同步的延时时间,单位是秒
–autoresync 自动重新同步主服务器上的所有document。

测试环境
主从服务器存储的路径均是/data/db
主服务器IP地址为:192.168.1.51
从服务器IP地址为:192.168.1.52

b) 开始实验

需要注意两台服务器的时间要调为一致,最好设定定时同步时间。
1.分别启动主从服务器
启动主服务器使用默认端口27017
./mongod -dbpath /data/db –master
启动从服务器10002 端口
./mongod -dbpath /data/db –source 192.168.1.51:27017 –slave –port 27017 –autoresync –slavedelay 1
启动后如果从主服务器连接成功,就可以看到复制内容的信息。
当发现从服务器的数据不是最新时,就用到了autoresync和slavedelay两个参数。
启动同步系统会打出大量信息,可以使用“> /dev/null &”屏蔽日志信息。

2.测试主从同步
在主服务器新建数据库
./mongo
> use mytest
> db.mytest.save({“context”:”I am here!”})
> db.mytest.save({“context”:”hello world”})
> db.mytest.find()
可以查看到两条数据。

在从服务器上查看同步数据
./mongo
MongoDB shell version: 1.8.1
connecting to: test
> show dbs
admin
local
test
> use mytest
switched to db testdb
> db.mytest.find()
通过查询两条数据已经同步过来。

删掉“hello world”的记录。删除只能在主机上操作。
> db.mytest.remove({“context”:”hello world”})
再次到主从台机器检查,记录已经被删掉。同步数据操作完成。

3.测试从库宕机数据丢失
从库宕机数据丢失,需要将数据从备机机同步到主机上。

首先停止主机删掉数据。(直接到数据目录下rm -rf 即可)
将备机改为主机运行,之后修好主机将主机启动为备机运行即可。

在从机上操作,停止从机进程(mongod)。删除Slave数据目录中的local.*。以主机模式启
动。待之前的主机修好后以从机模式启动即可。

7月 01

mongodb 单机的备份与恢复

【2011-06-30 张子萌】
备份与恢复是数据保存的重要技术。本次只是学习记录单机的操作。
mongodb的备份和恢复提供了两种方式。备份为bson格式和和备份为json和csv格式。

a)导出bson格式
主要用于单机小数据量的备份、快照等。存储被bson格式,bson(Binary JSON ),
是轻量级的二进制数据格式。

备份命令mongodump
参数
–help 帮助信息
-v [ –verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
-h [ –host ] arg 指定要备份的服务器ip
–port arg 指定要备份的服务器端口,需要与服务器ip一起使用,格式为ip:port
–ipv6 开启ipv6的支持,默认是关闭的
-u [ –username ] arg 用户名
-p [ –password ] arg 密码
–dbpath arg 指定连接数据库后访问数据的位置,但是不能是当前使用的目录
–directoryperdb 为每一个库建立一个目录。
-d [ –db ] arg 指定要备份的库名
-c [ –collection ] arg 指定要导出的collection
-o [ –out ] arg (=dump) 输出的目录,默认目录为执行命令的路径下创建dump目录
-q [ –query ] arg 可以json查询,有选择性的导出数据
–oplog 使用oplog
–repair 尝试修复损坏的数据库

恢复命令mongorestore
参数
–help 帮助信息
-v [ –verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
-h [ –host ] arg 指定要导入的服务器ip
–port arg 指定要导入的服务器端口,需要与服务器ip一起使用,格式为ip:port
–ipv6 开启ipv6的支持,默认是关闭的
-u [ –username ] arg 用户名
-p [ –password ] arg 密码
–dbpath arg 指定连接数据库后访问数据的位置,但是不能是当前使用的目录
–directoryperdb 为每一个库建立一个目录。
-d [ –db ] arg 指定要备份的库名
-c [ –collection ] arg 指定要导出的collection
–objcheck 插入前检测对象的合法性
–filter arg 插入前的过滤器
–drop 在导入前删除要导入的集合
–oplogReplay 恢复日志时间点

测试,首先查看要测试的数据库(mytest)文件大写
> show dbs
admin (empty)
mytest 1.953125GB
开始备份,将本地mytest库导出到tmp目录下
# mongodump -d mytest -o /tmp
导出结束耗时如下
real 0m5.412s
user 0m0.007s
sys 0m2.039s
导出后数据存为bson格式体积为577M。mytest库里存的是MP3所以导出数据库压缩的不多。

开始做恢复测试,首先删除mytest库,在导入
# mongorestore –directoryperdb -d mytest /tmp/mytest
导入结束耗时如下:
real 0m52.587s
user 0m0.514s
sys 0m1.732s

总结:导入时间大约是导出时间的10倍。

b)导出json格式
虽然导出速度快,
但是导出为json,csv可能对某些数据类型不兼容,并且不保证数据可以完整导入。
所以只简单记录一下,就不是实验了。
导出命令mongoexport
参数
-q [ –query ] arg query filter, as a JSON string
–csv export to csv instead of json
–jsonArray output to a json array rather than one object per
line

恢复命令mongoimport
参数
–ignoreBlanks 在csv,tsv文件中忽略空域
–type arg 指定导入文件的类型,默认为json,也可以是csv,tsv
–drop 导入前先删除原collection
–headerline 仅导入CSV,TSV文件的第一行作为头文件
–upsert 插入或更新已存在的对象
–upsertFields arg comma-separated fields for the query part of the
upsert. You should make sure this is indexed
–stopOnError 当导入出现错误时停止
–jsonArray 导入json array,目前每个array的限制是4M

6月 23

MongoDB的初步-安装、简单操作

网上的介绍很多所以就不废话了,先记录几个概念,直接记录关键操作。
mongodb 的官方网站http://www.mongodb.org/

MongoDB是由(database)、集合(collection)、文档对象(document)三个层次组成。与传统的
数据库对应关系如下
关系型数据库 MongoDB数据库
database database
table collection
row document
存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。

测试环境:CentOS 5.6 64位操作系统
将mongodb软件安装在/usr/local/mongodb
将mongodb数据放在/data/db
应该创建一个专有的操作账户。此次不麻烦了直接使用root。

A)部署
先下载mongodb到
# wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.1.tgz

进行解压缩
# tar xzvf mongodb-linux-x86_64-1.8.1.tgz

将文件移动到相应目录
# mv mongodb-linux-x86_64-1.8.1 /usr/local/mongodb

建立相应数据目录,也可以在启动时用–dbpath参数来指定数据库的路径
# mkdir -p /data/db

B)启、停数据库
进入mongodb的bin目录中
# cd /usr/local/mongodb/bin
可以看到以下命令
bsondump
mongo mongodb的客户端
mongod mongodb的服务端
mongodump mongodb的导出工具,导出为bson格式,也可用于备份、快照等。
mongoexport 把collection导出成json格式或csv格式的文件
mongofiles GridFS管理工具
mongoimport mongodb恢复工具速度快,但不保证数据完整导入
mongorestore mongodb恢复工具速度慢,但是根据mongodump导出的数据完整恢复
mongos mongodb的集群路程序
mongosniff mongodb操作捕获,类似于tcpdump,可以截获到要执行的命令
mongostat mongodb的运行信息。

启动数据库命令
# ./mongod
数据库正常启动,默认情况下客户端访问端口为27017,web访问端口为28017.
也可以使用–port参数直接设定,如果直接指定端口为4444,web访问端口将为5444,具体
信息会打出到启动信息中。常用参数还有
–fork 创建子进程
–logpath 指定日志目录,日志级别从多到少参数为从-v 到 -vvvvv
–directoryperdb 系统为每个 DB 创建一个独立子目录
–config 启动时调用配置文件,可有手动编辑配置文件
配置文件具体参数可以查询http://www.mongodb.org/display/DOCS/File+Based+Configuration
以 Daemon 方式运行# ./mongod –fork –logpath /dev/null

验证数据库是否启动正常。使用web比较方便,使用http://IP:port方式看到mongodb的
状态信息,表示启动成功。也可以使用客户端登陆,保存和查询数据,简单测试一下。这有点像
python中的字典。
# ./mongo
> db.foo.save({‘hi’:’hello word’})
> db.foo.find()
可以查到刚才保存的结果,表示数据库运行正常。客户端默认是连接本地的27017端口,如果
连接远程系统可以用 ./mongo ip:port的形式来指定IP和端口号。
到/data/db目录下,可以看到test.0、test.1、test.ns。因为mongodb采用预分配表空间机制,每个
分配文件都用0填充,第一个文件test.0为64MB,第二个文件为128MB ,依此类推,所以在32位模式运行时支持
的最大文件为2GB。每个库和索引也有对应的命名空间,命名空间的元数据都集中存在test.ns文件中。在数据插
入时每条数据都有”_id”,如果没有提供系统将自动生成Objectld作为该文档的主键。Objectid有4字节的时间戳,
3字节的机器号,2字节的进程id和3字节的自动计数组成。还有一个问题需要注意,文件删除后数据所占用的空
间不会被释放,所以不要存放经常要删除替换的文件。

关闭数据库
> use admin
> db.shutdownServer()

C)简单管理、操作命令

操作均为使用mongo连接后的操作提示符为>
命令列表 http://www.mongodb.org/display/DOCS/dbshell+Reference

切换库使用use,这个和mysql一样。切换后可以做的常用操作。
> use admin
查看帮助
> db.help()
查看当前表collection支持哪些方法
> db.dbname.help()
查看数据库运行统计信息
> db.serverStatus()
查看数据库的状态信息
> db.stats()
列出所有数据库
> show dbs
显示当前数据库
> db
打印最后出现的错误
> db.getLastError()
清除错误记录
> db.resetError()
添加用户,账户、密码、是否只读
> db.addUser(user,pwd,true)
列出用户
> show users
删除用户
> db.removeUser(“userName”)
清除错误记录
> db.resetError()
删除库
> db.dropDatabase()
将某个ip上的库同步到当前库
> db.cloneDatabase(“x.x.x.x”)
将某个ip上的数据复制到当前库
> db.copyDatabase(“test”,”x.x.x.x”)
查看数据空间大小
> db.userInfo.dataSize()

操作部分可以参照sql与mongo的对比
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart
添加
> db.foo.save({‘hi’:’hello word’})
> db.foo.save({‘hi’:’nihao’})

查找
> db.foo.find({“hi”:”hello word”})

修改将”nihao”修改为”ni hao “
> db.foo.update({“hi”:”nihao”},{$set:{“hi”:”ni hao”}},false,true)

删除
> db.foo.remove({“hi”:”ni hao”})

3月 23

strace记录

ltrace用于跟踪库调用的情况,strace用于系统调用的情况,strace是ltrace的一个功能子集。
对于优化和处理问题有很大帮助。

命令格式
strace [ mid sid level ] …
mid 指定 STREAMS 模块的标识号。
sid 指定子标识号。
level 指定跟踪优先级别。

主要参数
-c — 统计对系统时间、呼叫、错误的次数
-f — 跟踪fork产生的子进程
-ff — 输出报告文件
-F — 尝试跟踪vforks
-i — 输出系统调用的入口指针.
-q — 禁止输出脱离的信息
-r — 打印每个系统调用的相对时间
-t — 在输出中的每一行前加上时间信息
-tt — 在输出中的每一行前加上时间信息,微秒级.
-T — 显示每一调用所耗的时间.
-v — 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-a column — column 设置返回值的输出位置.默认 为40.
-e expr 指定一个表达式,用来控制如何跟踪
-e trace=set 只跟踪指定的系统调用.例如:-e trace=open,close,rean,write表示只跟踪
这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的系统调用.
-e trace=ipc 跟踪所有与进程通讯有关的系统调用.
-e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出的数据.例如-e read=3,5
-e write=set 输出写入到指定文件中的数据.
-o file — 将strace的输出写入文件
-O overhead — set overhead for tracing syscalls to OVERHEAD usecs
-p pid — pid进程
-s strsize — 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-S sortby — 按照时间,呼叫、名字进行排序,默认使用时间(time, calls, name)
-u username — 运行所使用的用户id

输出格式

应用:
学习中还没有用过。

参考资料:
http://study.chyangwa.com/IT/AIX/aixcmds5/strace.htm#a136c1238
http://www.yuanma.org/data/2007/0201/article_2213.htm

3月 16

linux 系统数据恢复

[整理人:张子萌 2011-03-14]

linux管理员不小心rm了数据,会很郁闷,所以需要数据恢复。我记录个人的恢复实验结果。如果可以把硬盘拿下里挂载windows上可以试试Raise Data Recovery for Ext2/Ext3/Ext4、r-linux工具,其它工具也很多,但是收费的居多。用windows恢复后容易造成使用权限错误等问题,所以不能直接恢复到linux盘上使用。据说winpe里也可以用,但是我没有做实验,毕竟用winpe在服务器上也挺怪的。主要实验一下在linux上实际操作。TestDisk、PhotoRec、ext3grep。TestDisk主要用来恢复损坏的分区以及拯救无法引导的磁盘。PhotoRec 主要用于恢复损坏的数据文件和文档等。Ext3grep恢复大部分数据文件。

PhotoRec 下载地址

http://www.cgsecurity.org/wiki/PhotoRec

ext3grep下载地址

http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

软件主站

http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html

先看ext3grep效果,我的分区如下

linux 系统数据恢复 - simon-zzm - simon个人观点

在program下随便放了一个文档pdf。并且见了3个目录abc,在a目录下放了一个txt文件。

# rm -rf 2011.pdf a/

把a目录和2011.pdf删除,删除完毕卸载/program分区,准备测试恢复。

首先安装或升级一下e2fsprogs、e2fslibs库,在CentOS中安装e2fsprogs库。如果是Ubuntu需要安装两个库,命令sudo apt-get install e2fsprogs e2fslibs-dev。我的实验环境是Centos。(任何恢复都需要安装此库)

#yum install –y e2fsprogs

# wget http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

# tar zxvf ext3grep-0.10.2.tar.gz

# cd ext3grep-0.10.2

# ./configure

# make && make install

ext3grep主要参数:

–print 打印块、inode和所有信息

–ls 打印目录、过滤信息

–inode 从某个indoechazhao

–block 从某个块查找

–group 只找某个组

–after 找在某点时间后删除的数据

–before 找在某点时间前删除的数据

–restore-file 恢复文件到某个目录

–restore-all 恢复所有删除,删除的数据会在当前的RESTORED_FILES目录中

开始从第二个inode扫描删除的文件

# ext3grep /dev/sda4 –ls –inode 2

扫描完成如下图

linux 系统数据恢复 - simon-zzm - simon个人观点

在第四列为inode值,第五列中写有D的就是被删除的文件。

使用一下命令我看看a目录下有什么东西,a目录的inode值为75777

# # ext3grep /dev/sda4 –ls –deteled –inode 75777

linux 系统数据恢复 - simon-zzm - simon个人观点

# ext3grep /dev/sda4 –restore-file a/123.txt

linux 系统数据恢复 - simon-zzm - simon个人观点

看到Restoring 已经恢复成功,查看123.txt文件文件内容没有问题,但是pdf的没有成功,不知道为什么。又测试删除mysql数据库的数据,经过恢复的数据也可以使用。总体说效果挺好。

然后试试PhotoRec,官方说明能恢复格式如下:

– RIFF audio/video (.avi/.wav)

– BMP bitmap (.bmp)

– bzip2 compressed data (.bz2)

– Source code written in C (.c)

– Canon Raw picture (.crw)

– Canon catalog (.ctg)

– FAT subdirectory

– Microsoft Office Document (.doc)

– Nikon dsc (.dsc)

– HTML page (.html)

– JPEG picture (.jpg)

– MOV video (.mov)

– MP3 audio (MPEG ADTS, layer III, v1) (.mp3)

– Moving Picture Experts Group video (.mpg)

– Minolta Raw picture (.mrw)

– Olympus Raw Format picture (.orf)

– Portable Document Format (.pdf)

– Perl script (.pl)

– Portable Network Graphics (.png)

– Raw Fujifilm picture (.raf)

– Contax picture (.raw)

– Rollei picture (.rdc)

– Rich Text Format (.rtf)

– Shell script (.sh)

– Tar archive (.tar )

– Tag Image File Format (.tiff)

– Microsoft ASF (.wma)

– Sigma/Foveon X3 raw picture (.x3f)

– zip archive (.zip)

支持的磁盘格式如下:

– DOS/Windows FAT12, FAT16 and FAT32

– NTFS ( Windows NT/2K/XP )

– Linux Ext2 and Ext3

– BeFS ( BeOS )

– BSD disklabel ( FreeBSD/OpenBSD/NetBSD )

– CramFS (Compressed File System)

– HFS and HFS+, Hierarchical File System

– JFS, IBM’s Journaled File System

– Linux Raid

– Linux Swap (versions 1 and 2)

– LVM and LVM2, Linux Logical Volume Manager

– Netware NSS

– ReiserFS 3.5, 3.6 and 4

– Sun Solaris i386 disklabel

– UFS and UFS2 (Sun/BSD/…)

– XFS, SGI’s Journaled File System

试试看

# wget http://www.cgsecurity.org/testdisk-6.11.3.linux26.tar.bz2

# bunzip2 testdisk-6.11.3.linux26.tar.bz2

# tar xvf testdisk-6.11.3.linux26.tar

# cd /root/testdisk-6.11.3/linux

# ./testdisk_static

linux 系统数据恢复 - simon-zzm - simon个人观点

英文提示很简。测试了一下图片格式恢复没有问题,其它格式没有试,但是名称都变成索引名了,有点不方便。

还存在一个问题就是ext4格式。ext4在rehdat5中已经支持,但是需要安装e4fsprogs,在redhat6中已经是默认安装,所以将来使用ext4的几率也很大。Ext3grep工具在ext4下已经无能为力,所以需要其它工具的支持。上网上找找是否会有ext4grep,发现了http://tjworld.net/wiki/Linux/Ext4Undelete,没有搞清楚。

介绍较多的是extundelete。

extundelete的下载地址

http://extundelete.sourceforge.net/

linux 系统数据恢复 - simon-zzm - simon个人观点

首先安装e2fsprogs和e2fslibs,然后编译

# cd extundelete-0.2.0

# ./configure

# make

不安装了直接用

#cd src

# /extundelete /dev/sda9 –restore-all

应该是我系统内核版本太低,虽然支持ext4,但软件恢复却没有成功。内核2.6.28以上的应该没有问题。Fedora上有人测试过没有问题,redhat和centos就应该没有问题。

试试PhotoRec是否可以恢复ext4的盘。步骤抓图如下:

启动

linux 系统数据恢复 - simon-zzm - simon个人观点

选择磁盘

linux 系统数据恢复 - simon-zzm - simon个人观点

选择好分区类型

linux 系统数据恢复 - simon-zzm - simon个人观点

选择要恢复的盘

linux 系统数据恢复 - simon-zzm - simon个人观点

不知道为什么支持了,和介绍里说的不一样,选第一项

linux 系统数据恢复 - simon-zzm - simon个人观点

选第一项

linux 系统数据恢复 - simon-zzm - simon个人观点

选择恢复后的路径,直接点y,保存到当前目录的recup_dir.1目录中

linux 系统数据恢复 - simon-zzm - simon个人观点
进入recup_dir.1目录查看jpg文件恢复了,并且可以使用,但是名称有变化了。pdf的好像没有成功。
linux 系统数据恢复 - simon-zzm - simon个人观点

照目前看txt等文本类和图片类的恢复也没有问题,但是只能靠grep在去找那个是需要的文件了。

经验总结:

使用rm需要格外小心(会出人命的)。在不小心删除后,最好及时卸载分区,避免数据覆盖写入。如果必须挂载,可以使用只读模式。