MongoDB之副本集

MongoDB之副本集

一、简介

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

1.1副本集(replication)

MongoDB 副本集是一组mongod的进程,它们保存着相同的数据集。副本集提供了冗余和高可用,这是所有生产环境部署的基础。在不同的数据库服务中,存在着相同的数据,它提供了一定级别的容灾,避免了单点故障。在一些情况下副本可以提供读的能力,客户端发来的读请求可以分配到不同的服务上。一个副本集包含几个数据承载节点和随意的一个仲裁节点。数据承载节点中,只能有一个成员是主节点(primary),其他的节点都是从节点(secondary)。一个副本集中只用主节点有确认写的能力,主节点在oplog中记录下所有数据的变化,从节点复制主节点的oplog,并执行这些操作。这样,从节点的数据与主节点保持一致。如果主节点不可用,从节点中将会选举出新的主节点。

image1

1.2仲裁者(arbiter)

你可以向副本集中添加额外的mongod实例作为仲裁者(arbiter)。仲裁者不保存数据,它只在心跳响应中和选举请求中作为一个法定人数。由于仲裁节点不保存数据,所以相比数据节点,它占用更少的资源。如果你的数据集有偶数个节点,添加一个仲裁者节点可以保持选举中的多数票。

image2

1.3自动故障转移(Automatic Failover)

当主节点不能和其他成员节点通信,超过10秒时,一个合法的从节点将举行选举,选举它自己为新的主节点,第一个进行选举的从节点如果收到了大多数的选票,它将成为新的主节点。失效转移的过程大概会在1分钟内完成,例如,副本集中的成员发现主节点不可用将花费10-30秒时间,其余的从节点选举出新的主节点花费10-30秒时间。

image3

1.4 优先级为0的数据集成员

一个优先级为0的成员不能成为主节点,也不能触发选举。除了这个限制,它和其他的从节点功能一样,保持数据复制,接受读操作,在选举中投票。配置优先级为0的从节点,经常用于多数据中心的部署。例如,一个数据中心拥有一个主节点和一个从节点,第二个数据中心拥有一个优先级为0的从节点,这样,只有第一个数据中心的成员可以成为主节点。

image4

1.5 隐藏的数据集成员

隐藏成员复制主节点的数据,但是它对于客户端的节点是不可见的。隐藏成员必须是优先级为0的,它不能成为主节点。db.isMaster()方法不能显示隐藏成员,但是隐藏成员可以在选举中进行选举。在下面5成员的副本集中,4个从节点复制主节点的数据,但是一个从节点是隐藏的。

image5

二、部署副本集

2.1 部署副本集

3个成员的副本集提供了足够的冗余以避免更多的网络分裂和其他的系统失败。这个集合有足够的能力处理更多的分布读操作。副本集应该总是有奇数个成员,这可以使得选举过程更顺利。在生产环境部署时,你应该保持每一个mongod实例在一个单独的机器上,当使用虚拟机时,你应该保持每一个mongod实例在一个独立的主机服务上。

从MongoDB官网下载package,上传到3台机器上。我们这台机器的ip为192.168.2.233,192.168.2.234,192.168.2.235,上传的目录是/usr/local。

解压:

tar -zxvf mongodb-linux-x86_64-rhel70-3.6.2.tgz

MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

mkdir -p /data/db

我们再创建/data/conf目录,存储MongoDB的配置文件

mkdir /data/confvim mongod.conf

配置的内容如下:

replication:
   replSetName: "rs0"
net:
   bindIp: 192.168.2.233

replSetName设置副本集的名称,这里我们设置为“rs0”,bindIp设置为本机的ip,3台机器的mongod实例设置为自己的ip。

然后,我们在3台机器上,分别启动mongod实例

./bin/mongod --config /data/conf/mongod.conf

mongod启动的默认端口是27017。

使用mongo shell连接3个mongod实例中的一个

./bin/mongo --host 192.168.2.233

然后执行如下命令,设置副本集:

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "192.168.2.233:27017" },
      { _id: 1, host: "192.168.2.234:27017" },
      { _id: 2, host: "192.168.2.235:27017" }
   ]
})

这样,3个成员的副本集就设置完成了。

查看副本集的配置,运行如下命令:

rs.conf()

返回的结果如下:

{
   "_id" : "rs0",
   "version" : 1,
   "protocolVersion" : NumberLong(1),
   "members" : [
      {
         "_id" : 0,
         "host" : "192.168.2.233:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {
 
         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 1,
         "host" : "192.168.2.234:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {
 
         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 2,
         "host" : "192.168.2.235:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {
 
         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      }
 
   ],
   "settings" : {
      "chainingAllowed" : true,
      "heartbeatIntervalMillis" : 2000,
      "heartbeatTimeoutSecs" : 10,
      "electionTimeoutMillis" : 10000,
      "catchUpTimeoutMillis" : -1,
      "getLastErrorModes" : {
 
      },
      "getLastErrorDefaults" : {
         "w" : 1,
         "wtimeout" : 0
      },
      "replicaSetId" : ObjectId("585ab9df685f726db2c6a840")
   }
}

确定副本集的主节点,运行如下命令:

{
    "set" : "rs0",
    "date" : ISODate("2018-02-08T11:08:15.457Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1518088089, 1),
            "t" : NumberLong(2)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1518088089, 1),
            "t" : NumberLong(2)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1518088089, 1),
            "t" : NumberLong(2)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1518088089, 1),
            "t" : NumberLong(2)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.2.233:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 67,
            "optime" : {
                "ts" : Timestamp(1518088089, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-02-08T11:08:09Z"),
            "electionTime" : Timestamp(1518088058, 1),
            "electionDate" : ISODate("2018-02-08T11:07:38Z"),
            "configVersion" : 3,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.2.234:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 46,
            "optime" : {
                "ts" : Timestamp(1518088089, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1518088089, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-02-08T11:08:09Z"),
            "optimeDurableDate" : ISODate("2018-02-08T11:08:09Z"),
            "lastHeartbeat" : ISODate("2018-02-08T11:08:14.473Z"),
            "lastHeartbeatRecv" : ISODate("2018-02-08T11:08:14.829Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.2.233:27017",
            "configVersion" : 3
        },
        {
            "_id" : 2,
            "name" : "192.168.2.235:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 24,
            "optime" : {
                "ts" : Timestamp(1518088089, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1518088089, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-02-08T11:08:09Z"),
            "optimeDurableDate" : ISODate("2018-02-08T11:08:09Z"),
            "lastHeartbeat" : ISODate("2018-02-08T11:08:14.474Z"),
            "lastHeartbeatRecv" : ISODate("2018-02-08T11:08:15.020Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.2.234:27017",
            "configVersion" : 3
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1518088089, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1518088089, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

我们从返回的结果中,可以看到每个节点的状态。

2.2 添加仲裁者节点

警告:一个副本集的仲裁者节点不要超过一个。

首先,为仲裁者节点创建数据库目录

mkdir /data/arb

以副本集的方式启动仲裁者节点,并制定数据库目录:

mongod --port 27017 --dbpath /data/arb --replSet rs0 --bind_ip 192.168.2.236

向副本集中加入仲裁者,只有连接主节点才能加入仲裁者节点,前面的例子中,我们的主节点是192.168.2.233,然后执行如下命令:

rs.addArb("192.168.2.236:27017")

至此,创建副本集就介绍完了,希望对大家有帮助。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容