Title

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搭建好了.

参考 MongoDB学习札记第六篇之主从复制

MongoDB 3.0 复制集升级操作以及坑


问题分析

进入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
}
文章目录
  1. 1. MongoDB 主动复制
    1. 1.1. 问题分析