MongoDB 是一个nosql数据库,在大数据处理方面可能比关系型数据库更高效。
我来介绍一下MongoDB 的环境配置和复制集Replica Set的搭建。
选用环境:ubuntu 12.04
在mongodb官网上已经有了大部分安装的步骤,但是按照官网上的步骤apt-get安装只能安装最新版的MongoDB ,如果你需要安装老版本,可以参考这篇教程。而且同样适用于centos。我自己尝试了mongodb2.4,2.6,3.0的升级过程。
安装
首先你需要下载MongoDB 的二进制包
1 2 3 4 5 6 |
#分别对应2.4,2.6,3.0的包,任选其一即可,推荐使用最新的3.0.5稳定版 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.12.tgz wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.10.tgz wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1204-3.0.5.tgz |
对下载好的包进行解压
1 |
tar -zxvf mongodb-linux-x86_64-ubuntu1204-3.0.5.tgz |
解压以后我们可以进入解压后的文件夹了
可执行程序都在bin文件夹里
为了使用mongodb,我们需要先设定好数据库文件、日志文件的存储路径
比如我设定的是
1 2 |
数据库路径 /data/mongo1 数据库日志路径 /data/mongo1/logs/mongo.log |
只需要去相应位置建立文件夹和文件即可,log文件需要提前建好,它不会自己生成的
然后可以启动mongodb服务了
两种方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#默认启动,端口为27017 ./bin/mongod #增加参数启动,参数意义我后面再说 ./bin/mongod --port 30000 --logappend --logpath /data/mongo1/logs --fork --dbpath /data/mongo1 #用配置文件指定启动参数,这里的mongo.conf是我自己创建的文本文件 ./bin/mongod -f mongo.conf #mongo.conf示例 port=30000 #指定端口号 dbpath=/data/mongo1 #指定数据库目录 logpath=/data/mongo1/logs/mongo.log #指定日志路径 logappend=true #以追加方式写日志 fork=true #以守护进程的方式运行,创建服务器进程 更多参数,自行搜索啦 |
如果运行失败尝试使用sudo运行,虽然这样不推荐
用ps -ef|grep mongo 查看服务是否已经运行
连接数据库
1 2 3 4 5 6 7 8 9 |
./bin/mongo localhost:30000 #这里的IP和端口号都依情况自行调整 #这时成功的话可以进入mongodb的命令行界面 #简单的数据库命令 show dbs show collections show users db.test.find() db.test.insert({a:"insert test"}) |
升级
保持mongodb服务的运行,把新版本的二进制包解压到另一个文件夹,cd到里面
1 2 3 4 5 |
#依然是连接Mongodb服务 ./bin/mongo localhost:30000 #mongod是mongodb的服务端工具,mongo是mongodb的客户端,可以使用不同的客户端连接同一服务端 #比如你现在运行2.4的服务,可以分别使用2.4和2.6的客户端连接mongodb服务 |
在新版本的mongo命令行中进行如下命令
1 2 3 4 5 6 |
>db.upgradeCheckAllDBs() #检查是否可以升级,通过了会有提示 #停止旧版本服务 >use admin #必须切换到管理员用户 >db.shutdownServer() #停止服务 >exit #退出Mongo命令行,由于服务已经停止,你开着也没用 |
启动新版本的mongod服务
1 2 3 4 |
./bin/mongod -f mongo.conf #可以采用旧的配置文件,这样数据库路径是一样的,有时会出现问题,检查一下是否使用了错误的参数 #这里用的是新版本的mongod启动的服务,数据库采用的旧版,但之前检查过可以升级,所以数据也不会出错 |
Replica Set
至少启动三个服务,可以在一台机器上使用三个端口,也可以使用多台机器。
1 2 3 4 5 |
./bin/mongod --port 30000 --directoryperdb --logappend --logpath /data/mongo1/logs --fork --dbpath /data/mongo1 --replSet mydb ./bin/mongod --port 30001 --smallfiles --directoryperdb --logappend --logpath /data/mongo2/logs --fork --dbpath /data/mongo2 --replSet mydb ./bin/mongod --port 30002 --smallfiles --directoryperdb --logappend --logpath /data/mongo3/logs --fork --dbpath /data/mongo3 --replSet mydb |
然后对rs集进行初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
rs.initiate( {"_id" : "test-set", "members" : [ {"_id" : 1, "host" : "127.0.0.1:30000"}, {"_id" : 2, "host" : "127.0.0.1:30001"}, {"_id" : 3, "host" : "127.0.0.1:30002", "arbiterOnly" : true} ] }); #也可以 cfg={"_id" : "test-set", "members" : [ {"_id" : 1, "host" : "127.0.0.1:30000"}, {"_id" : 2, "host" : "127.0.0.1:30001"}, {"_id" : 3, "host" : "127.0.0.1:30002", "arbiterOnly" : true} ] rs.reconfig(cfg) 可以重新配置,cfg为刚刚赋值的json #或者使用 rs.initiate() rs.add(“127.0.0.1:30001”) rs.add(“127.0.0.1:30002”) |
一段时间后机器会自行选出primary,secondary,arbiter,当然你也可以自己指定的。
使用rs.status()查看复制集状态
primary可以读写,secondary默认不可读写
可以使用
1 2 3 4 5 6 7 8 9 10 11 |
对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。 如果通过shell访问mongo,要在secondary进行查询。会出现如下错误: imageSet:SECONDARY> db.fs.files.find() error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 有两种方法实现从机的查询: 第一种方法:db.getMongo().setSlaveOk(); 第二种方法:rs.slaveOk(); 但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式 vi ~/.mongorc.js 增加一行rs.slaveOk(); 这样的话以后每次通过mongo命令进入都可以查询了 |
Replica Set测试:
配置好环境我们还要进行测试,思路如下:
1.查看各机器状态
2. 1号Primary写数据,
3. 2号Secondary读数据
4.Kill primary1
ps -ef |grep mongo
kill -9 … …
5.查看secondary2状态(变成primary2)
6.测试secondary2读
7.重启primary1
8.查看primary1机器状态(变成sendary1)
9.测试2号读写
10.测试1号读
11.Kill 2号机
12.查看1号机状态
13.测试1号读写
14.重启2号机,测试读