MongoDB复制集

1:安装

InstallMongoDB_7.sh安装

2:启动3个实例,且声明实例属于某复制集

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27017/mongodb.config

3:配置一次性配置

节点1

# /usr/local/mongodb/bin/mongo

rsconf = {

    _id:'myrepl',

    members:

    [

        {_id:0,

        host:'192.168.1.101:27017'

        },

        {_id:1,

        host:'192.168.1.102:27017'

        },

        {_id:2,

        host:'192.168.1.103:27017'

        }

    ]

}

4: 根据配置做初始化

rs.initiate(rsconf);

5:查看状态

rs.status();

db.printReplicationInfo();

db.printSlaveReplicationInfo();

6:删除节点

rs.remove('192.168.1.103:27017');

7:主节点插入数据

>use test

>db.user.insert({uid:1,name:'lily'});

8:连接secondary查询同步情况

# /usr/local/mongodb/bin/mongo

myrepl:SECONDARY> show dbs;

2018-02-05T15:03:03.536+0800 E QUERY    [thread1] Error: listDatabases failed:{

"ok" : 0,

"errmsg" : "not master and slaveOk=false",

"code" : 13435,

"codeName" : "NotMasterNoSlaveOk"

} :

8.1 出现上述错误,是因为slave默认不许读写

>rs.slaveOk();

>show collections;

>db.isMaster();

9.增加安全认证机制KeyFile

keyFile复制到其他机器上

配置文件加keyFile部分

10.主库配置用户

MongoDB shell version: 3.4.*  

>use admin

>db.createUser(

  {

    user: "root",

    pwd: "abc123",

    roles: [ { role: "root", db: "admin" } ]

  }

)

>use test

>db.createUser(

  {

    user: "myTester",

    pwd: "xyz123",

    roles: [ { role: "readWrite", db: "test" },

          { role: "read", db: "reporting" } ]

  }

)

>use mydb

>db.createUser(

  {

    user: "mydbuser",

    pwd: "xyz123",

    roles: [ { role: "readWrite", db: "mydb" },

          { role: "read", db: "test" } ]

  }

)

11.重启进入

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27017/mongodb.config --shutdown

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27017/mongodb.config

# /usr/local/mongodb/bin/mongo 192.168.1.101:27017/admin -u root -p abc123

从库上

>rs.slaveOk();

 

MongoDB按功能可分为主节点、从节点(隐藏节点、延时节点、“投票”节点)和选举节点

MongoDB复制集具有如下四个特点:

1.主是唯一的,但不是固定的。整个复制集中只有一个主节点,其余为从节点或选举节点,但是因为MongoDB具有自动容灾的功能,所以当唯一的主节点发生宕机时会从从节点的Priority参数不为0当中选举一个为主节点,所以说主是唯一的,但不是固定的。

2.由大多数据原则保证数据的一致性。即MongoDB复制集内投票成员(参数Vote不为0的其他成员具有选举权,在2.6版本后不能设置Vote大于1,即只能投票一次)数量为N,则大多数为 N/2 + 1,当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。通常建议将复制集成员数量设置为奇数。

3.从库无法写入。MongoDB复制集中只有主节点可以Writes,主节点和从节点可以Read

4.相对于传统的主从结构,复制集可以自动容灾。即当某个主节点宕机后会自动从从节点(Priority大于0的从节点)中选举出一个作为新的主节点,而某个从节点宕机后能继续正常工作。

通过命令rs.add("ip:port")来添加从节点

通过命令rs.addArb("ip:port")来添加投票节点

 

删除增加节点添加投票节点

1.增加从节点

rs.add("ip:port")

rs.add({"_id":4,"host":"ip:port","priority":1,"hidden":false})

2.增加投票节点

rs.addArb("ip:port")

rs.addArb({"_id":5,"host":"ip:port"})

rs.add({'_id':5,"host":"new_node:port","arbiterOnly":true})

3.删除节点

rs.remove("ip:port")

4.修改节点参数

(1)config = rs.conf()

(2)config.members[i].参数 =

(3)rs.reconfig(config, {"force":true})rs.reconfig(config),前面是强制重新配置

5.主节点降级

rs.stepDown(整数),意思是在整数秒内降级

6.查看配置文件

rs.conf()

 

将从节点转换为投票节点:

1:如果我们的应用程序是直接连接到从节点的,我们需要修改应用程序的连接方式让其不会再在该从节点是进行查询。

2:关闭从节点

3:主节点执行,然后进行移除:rs.remove("<hostname><:port>")

通过在 mongo 窗口中执行 rs.conf() 命令来确认复制集中已经不再包含该节点

4:将从节点的数据目录移至其他处以作保留。

如。mv /data/db /data/db-old

5:新建一个空的数据目录并在新的 mongod 启动过程中指定其为数据目录。我们可以使用之前的目录名。如:

mkdir /data/db

mongod --port 27021 --dbpath /data/db --replSet rs

6:主节点添加他为新的投票节点

rs.addArb("<hostname><:port>")

 

MongoDB复制集切换

1、模拟故障自动切换

通过kill命令可以停止复制集的当前节点,然后查看主节点会自动切换到其他节点上,可以看到当前端口为27017的实例为主节点。

2、手动进行主从切换

首先要先进入到主节点的实例中,只有主节点才有权限进行主从节点切换。

rs.freeze(30)   #暂停30s不参加选举

rs.stepDown(60,30)  #告诉主节点交出主节点位置,然后维持从节点状态不少于60s,同时等待30s以使主节点和从节点日志同步,再次查看状态,发现主节点已经切换到另外一个实例中。

rs.status()

 

##查看复制集各节点的启动参数和配置情况

db.serverCmdLineOpts()

 

posted @ 2019-08-12 14:43  AllenHU320  阅读(194)  评论(0编辑  收藏  举报