MongoDB 主动复制
参考 http://www.lanceyan.com/tech/mongodb/mongodb_cluster_1.html
参考 MongoDB学习札记第六篇之主从复制
参考 高可用的MongoDB集群
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了.
NOSQL有这些优势:
大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制.
高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病.
高性能,Nosql通过简单的key-value方式获取数据,非常快速.还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多.
灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式.而在关系数据库里,增删字段是一件非常麻烦的事情.如果是非常大数据量的表,增加字段简直就是一个噩梦.
高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构.比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置.
在nosql数据库里,大部分的查询都是键值对(key、value)的方式.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引.所以这个非常方便,我们可以用sql操作MongoDB,从关系型数据库迁移过来,开发人员学习成本会大大减少.如果再对底层的sql API做一层封装,开发基本可以感觉不到mongodb和关系型数据库的区别.同样MongoDB也是号称自己能够快速搭建一个高可用可扩展的的分布式集群,网上有很多搭建的文章,在我们搭建的时候还需要查找修改很多东西,所以把自己实战的步骤记录下来以备忘.我们看看如何一步一步搭建这个东东.
一、mongodb单实例.这种配置只适合简易开发时使用,生产使用不行,因为单节点挂掉整个数据业务全挂,如下图.
虽然不能生产使用,但这个模式可以快速搭建启动,并且能够用mongodb的命令操作数据库.下面列出在linux下安装单节点mongodb的步骤
二、主从模式.使用mysql数据库时大家广泛用到,采用双机备份后主节点挂掉了后从节点可以接替主机继续服务.所以这种模式比单节点的高可用性要好很多.
下面看一下怎么一步步搭建一个mongodb的主从复制节点:
1、准备两台机器 43.241.222.110 和 42.96.194.60. 43.241.222.110 当作主节点, 42.96.194.60作为从节点.
2、分别下载 mongodb 安装程序包.在 43.241.222.110 上建立文件夹 /home/data/mongodb,42.96.194.60 建立文件夹 /home/data/mongodb
两台MongoDB服务器的配置文件均为 /etc/mongod.cnf
storage:
dbPath: "/data/home/data/mongodb"
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 20
collectionConfig:
blockCompressor: snappy
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
processManagement:
fork: true
net:
#bindIp: 127.0.0.1,43.241.222.110,42.96.194.60 不能绑定外网访问ip,局域网的貌似可以,只能在iptable设定允许指定ip访问27017
#bindIp: 0.0.0.0
port: 27017
# Enable the HTTP interface (Defaults to port 28017).
http:
enabled: false
3、在43.241.222.110启动mongodb主节点程序.注意后面的这个 “-master”参数,标示主节点.启动主节点
sudo mongod -f /etc/mongod.cnf -master
4、在42.96.194.60启动 mongodb 从节点程序.关键配置,指定主节点ip地址和端口 -source 43.241.222.110:27017 和 标示从节点 -slave 参数.
sudo mongod -f /etc/mongod.cnf -slave -source 43.241.222.110:27017
输出日志如下,成功!
#日志显示从节点 从主节点同步复制数据
[replslave] repl: from host:43.241.222.110:27017
配置完Mongo主从复制后开始测试主从复制.
在主节点上连接到终端:
mongo 127.0.0.1
#建立test 数据库.
use test;
往testdb表插入数据.
> db.testdb.insert({"test1":"testval1"})
查询testdb数据看看是否成功.
> db.testdb.find();
{ "_id" : ObjectId("5284e5cb1f4eb215b2ecc463"), "test1" : "testval1" }
检查从主机的数据.
mongo 127.0.0.1
查看当前数据库.
> show dbs;
local 0.203125GB
test 0.203125GB
use test;
db.testdb.find();
{ "_id" : ObjectId("5284e5cb1f4eb215b2ecc463"), "test1" : "testval1" }
查询后数据已经同步过来了.再看看日志,发现从主机确实从主机同步了数据.
查看服务状态
> db.printReplicationInfo();
this is a slave, printing slave replication info.
source: 43.241.222.110:27017
syncedTo: Sun Nov 17 2013 16:04:02 GMT+0800 (CST) = -54 secs ago (-0.01hrs)
到此主从结构的mongodb搭建好了.
问题分析
进入MongoShell执行以下命令
>show dbs
提示以下错误
E QUERY Error: listDatabases failed:
{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
at Error (<anonymous>)
查看mongo状态
> rs.status()
{ "ok" : 0, "errmsg" : "not running with --replSet", "code" : 76 }
每次登陆mongoShell后都需要执行以下命令
> rs.slaveOK()
2015-09-24T17:03:16.528+0800 E QUERY TypeError: Object function () { return "try rs.help()"; } has no method 'slaveOK' at (shell):1:4
参考 MongoDB 3.0 复制集升级操作以及坑 http://dev.guanghe.tv/2015/05/mongdb3-upgrade-bug.html
//查看状态
> rs.status()
{ "ok" : 0, "errmsg" : "not running with --replSet", "code" : 76 }
查看运行时配置
> use admin
switched to db admin
> db.runCommand("getCmdLineOpts")
{
"argv" : [
"mongod",
"-f",
"/etc/mongod.cnf",
"-slave",
"-source",
"43.241.222.110:27017"
],
"parsed" : {
"config" : "/etc/mongod.cnf",
"net" : {
"http" : {
"enabled" : false
},
"port" : 27017
},
"processManagement" : {
"fork" : true
},
"slave" : true,
"source" : "43.241.222.110:27017",
"storage" : {
"dbPath" : "/data/home/data/mongodb",
"engine" : "wiredTiger",
"wiredTiger" : {
"collectionConfig" : {
"blockCompressor" : "snappy"
},
"engineConfig" : {
"cacheSizeGB" : 20
}
}
},
"systemLog" : {
"destination" : "file",
"logAppend" : true,
"path" : "/var/log/mongodb/mongod.log"
}
},
"ok" : 1
}