【传智播客】MongoDB复制集

单台计算机新能不够,并发有限,我们可以利用多台计算机对外 提供服务的时候,我们能够在处理客户端的时候他的这样 的一个并发数量能够达到比较均衡的这样的需求

主节点写数据,从节点读数据,读写分离 从节点从主节点同步数据

复制集和主从最大的区别就是支持容灾和故障切换,自动选举出主节点,主节点只有一个 当存活的节点等于小于一半节点,不再选举主节点,所有节点降级为secondary节点,此时只支持读操作,不再支持写操作

搭建复制集

  • 1个primary(主节点)

  • 1个secondary(从节点)

  • 1个arbiter(投票节点)

1. 配置文件

dbpath=shards/config-1-d
logpath=shards/config-1-log/mongod.log
fork=true
bind_ip_all=true
logappend=true
auth=false
port=8887
oplogSize=1024
journal=true
replSet=imooc

2. 根据配置文件启动三个实例

bin/mongod -f shards/config-3.conf

 ps -ef|grep mongo
root       5356      1  1 08:19 ?        00:00:01 bin/mongod -f shards/config-1.conf
root       5388      1  0 08:20 ?        00:00:00 bin/mongod -f shards/config-2.conf
root       5416      1  0 08:20 ?        00:00:00 bin/mongod -f shards/config-3.conf
root       5444   5019  0 08:21 pts/0    00:00:00 grep --color=auto mongo
[root@node1 mongodb-linux-x86_64-rhel70-3.6.3]#

3. 客户端登录

bin/mongo localhost:8887/admin
> db
admin

4. 编写复制集初始化的配置文件

定义config对象

> config = {
... "_id":"imooc",
... members:[{"_id":0,"host":"127.0.0.1:8887"}, {"_id":1,"host":"127.0.0.1:8888"},{"_id":2,"host":"127.0.0.1:8889"}]
... }

将其中的一个节点更改为投票节点,投票节点不存储数据,只起到投票选举的作用

> config.members[2]
{ "_id" : 2, "host" : "127.0.0.1:8889" }
> config.members[2] = {"_id":2,"host":"127.0.0.1:8889","arbiterOnly":true}
{ "_id" : 2, "host" : "127.0.0.1:8889", "arbiterOnly" : true }
>
> config  #重新观看config对象
{
        "_id" : "imooc",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "127.0.0.1:8887"
                },
                {
                        "_id" : 1,
                        "host" : "127.0.0.1:8888"
                },
                {
                        "_id" : 2,
                        "host" : "127.0.0.1:8889",
                        "arbiterOnly" : true
                }
        ]
}
> rs.initiate(config)  # 通过对象初始化复制集
{
        "ok" : 1,   # 1,证明成功
        "operationTime" : Timestamp(1519652253, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1519652253, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
imooc:SECONDARY> # 这里也表明成功
imooc:PRIMARY> rs.status()   #查看复制机的状态,rs.help()可以查看rs的所有函数

5. 登录其他两个服务器,查看状态进行验证

#从节点

bin/mongo localhost:8888/test
MongoDB shell version v3.6.3
connecting to: mongodb://localhost:8888/test
MongoDB server version: 3.6.3
imooc:SECONDARY> 

# 投票节点

[root@node1 mongodb-linux-x86_64-rhel70-3.6.3]# bin/mongo localhost:8889/test
MongoDB shell version v3.6.3
connecting to: mongodb://localhost:8889/test
MongoDB server version: 3.6.3
imooc:ARBITER>

6. 在主节点插入数据,看从节点的是否有数据

主节点插入数据

mooc:PRIMARY> 
imooc:PRIMARY> db
admin
imooc:PRIMARY> use test
switched to db test
imooc:PRIMARY> db
test
imooc:PRIMARY> db.imooc.insert({"name":"imooc"})
WriteResult({ "nInserted" : 1 })
imooc:PRIMARY>

从节点查看数据,注意rs.slaveOK(1)

imooc:SECONDARY> rs.slaveOk(true)
imooc:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
imooc:SECONDARY> db
test
imooc:SECONDARY> show collections
imooc
imooc:SECONDARY> db.imooc.find()
{ "_id" : ObjectId("5a94106ae4c4ddec5e2d389a"), "name" : "imooc" }
imooc:SECONDARY>

查看投票节点,没有数据

imooc:ARBITER> rs.slaveOk(1) imooc:ARBITER> show dbs local 0.000GB imooc:ARBITER> `

功能区分

主节点: 提供读写服务的节点 从节点: 提供读服务的节点 | -- 隐藏节点:对程序不可见的节点 | -- 延时节点:延时复制节点 | -- 投票节点:具有投票权的节点,不上arbiter 投票节点:atbiter节点,无数据,仅作选举和充当复制集节点,也称为选举节点

Last updated

Was this helpful?