MongoDB ------ 复制集 + 复制集管理优化

一、MongoDB 复制集:

(1)Mongodb复制集简介:

1、Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。

2、客户端在主节点写入数据,在从节点读取数据,主节点和从节点进行数据交互保证数据一致性,如果其中一个节点出了故障,其他发节点马上将业务接过来无需停机操作。

(2)优势:

让数据更安全;
搞数据可用性;
灾难恢复;
无停机维护(如备份,重建索引,故障转移);
读缩放(额外的副本读取);
副本集对应用程序是透明的。

(3)特点:

N个几点的群集;
任何节点可作为主节点;
所有写入操作都在主节点上;
自动故障转移;
自动恢复。

二、部署复制集:

前提:安装好的MongoDB,添加配置4个实例(可查看之前的博客)

mkdir -p /data/mongodb/mongodb{2,3,4}     //创建数据目录
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{2,3,4}.log    //创建日志文件
cd /data/mongodb/logs/
chmod 777 *.log     //赋予权限

(1)编辑 4 个实例日志文件:

# cp -p /etc/mongod.conf /etc/mongod2.conf
# vim /etc/mongod2.conf
     path: /data/mongodb/logs/mongodb2.log               //每个实例指定自己日志目录
     dbPath: /data/mongodb/mongodb2                        //每个实例指定自己的数据目录
     port: 27018                                                          //指定端口分别为27017、 27018、 27019 、 27020
        .......
     replication:                                           //开启所有实例的复制参数:定义一个 replSetName: kgcrs
                replSetName: kgcrs

(2)启动所有实例:

mongod -f /etc/mongod.conf
mongo --port 27017

mongod -f /etc/mongod2.conf
mongo --port 27018

mongod -f /etc/mongod3.conf
mongo --port 27019

mongod -f /etc/mongod4.conf
mongo --port 27020
netstat -ntap | grep mongod

(3)初始化配置复制集(确定节点上没有数据):

mongo   //进入实例

    > show dbs
    > rs.status()  //查看复制集状态
    > cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.233.128:27017"},{"_id":1,"host":"192.168.233.128:27018"},{"_id":2,"host":"192.168.233.128:27019"}]}
     // 定义cfg初始化参数  id 是之前配置文件里定义的,成员(3个  id分别定义 0 1 2   IP端口号27017、27018、27019)
     >  rs.initiate(cfg)     //启动复制集
     >  rs.status()         //查看此时可以查看到复制状态了

1、增加、删除节点:

配置启动复制集后可以通过 rs.add() 和rs.remove() 来增加和删除节点:

rs.add("192.168.233.128:27020")      //增加节点
rs.remove("192.168.233.128:27020")   //删除节点

2、MongoDB 复制集的切换:

当节点出现故障会自动切换到其他节点,管理员也可以手动切换:

ps aux | grep  mongod
kill -9 61070    //关闭主节点    复制集会自动切换
        > rs.status()   //查看

3、手动切换:

kgcrs:PRIMARY> rs.freeze(30)        //PRIMARY暂停30s不参与选举
kgcrs:PRIMARY> rs.stepDown(60,30)   //交出主节点位置,维持从节点状态不少于60秒,等待30秒使主节点和从节点日志同步

三、MongoDB复制集管理优化:

优化包括:配置从节点可以读取数据、查看复制集状态、更改oplog大小、配置带认证的复制集。

(1)复制集的选举原理:

复制是基于操作日志oplog,相当于Mysql中的二进制日志,只记录发生改变的记录。复制是将主节点的oplog日志同步并应用到其他从节点的过程。

节点的类型分为标准(host)节点、被动(passive)节点和仲裁(arbiter)节点。

标准节点可能被选举为活跃(primary)节点,有选举权。
被动节点有完整副本,不可能成为活跃节点,有选举权。
仲裁节点不复制数据,不可能成为活跃节点,只有选举权。
标准节点和被动节点的区别:priority值高的是标准节点,低的是被动节点。
选举规则是票高者获胜,priority是优先权为01000的值,相当于额外增加01000的票数。选举结果:票高者获胜。若票数相同:数据新者获胜。

配置复制集的优先级:

先创建4个实例教程;
设置2个标准节点,一个被动节点,一个仲裁节点。

> cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.86.128:27017","priority":100},{"_id":1,"host":"192.168.86.128:27018","priority":100},{"_id":2,"host":"192.168.86.128:27019","priority":0},{"_id":3,"host":"192.168.86.128:27020","arbiterOnly":true}]}
> rs.initiate(cfg)    //初始化配置
> rs.isMaster()       //查看复制集的状态

(2)模拟主节点故障:

mongod -f /etc/mongod.conf --shutdown   //主节点服务关掉

mongo --port 27018
> rs.isMaster()   //查看节点的身份状态  主节点已经换到27018

在这里插入图片描述
模拟所有标准节点故障:

mongod -f /etc/mongod.conf --shutdown   
mongod -f /etc/mongod2.conf --shutdown    

mongo --port 27019
> rs.isMaster()   //查看节点身份状态 可以看到主节点没有了(当所有标准节点故障,被动节点也不能成为主节点)

在这里插入图片描述
允许从节点读取数据:

默认的MongoDB复制集的基本配置和管理,可以使用rs.slaveOK() 命令允许能够在从节点读取数据:

mongo --port 27018
> rs.slaveOk()        //允许默认从节点读取数据
> show dbs

查看复制状态信息:

1、查看Master的oplog元数据信息:

> rs.printReplicationInfo()

2、查看Slave的同步状态:

> rs.printSlaveReplicationInfo()

3、查看主从配置信息:

> rs.conf() //或db.system.replset.find()

4、更改oplog大小:

oplog简介:oplog:operations log的简写,存储在一个特殊的数据库中(local),oplog就存储在其中的oplog.$main集合里面,这个集合是一个固定集合,新操作会自动替换旧的操作,以保证oplog不会超过预设的大小,其中的每个文档都代表主节点上执行的一个操作,oplog会包含所有对数据有修改的的操作(查询操作不会记录),默认下,oplog大小会占用64位的实例5%的可用磁盘空间。
mongo复制的过程:主节点应用业务操作修改到数据库中,然后记录这些操作到oplog中,从节点复制这些oplog,然后应用这些修改。ps:这些操作是异步的。如果从节点的操作已经被主节点落下很远,oplog日志在从节点还没执行完,oplog可能已经轮滚一圈了,从节点跟不上同步,复制就会停下,从节点需要重新做完整的同步,为了避免此种情况,尽量保证主节点的oplog足够大,能够存放相当长时间的操作记录。

> use local
>  db.oplog.rs.find()          //查看.oplog
> db.oplog.rs.stats()          //查看.oplog内容
> rs.printReplicationInfo()    //查询oplog的大小及保存的操作记录持续的时长

这里以 27018 为例,其他操作一样:

关闭服务:

mongo --port 27018
 > use admin
 > db.shutdownServer()      //关闭服务

注销replication:相关启动参数,并修改port端口号27028:
vim /etc/mongod2.conf
在这里插入图片描述
备份当前节点的所有oplog记录:

mongodump --port 27028 --db local --collection 'oplog.rs'

mongo --port 27028
> use local
> db.oplog.rs.drop()       //删除原来的oplog
> db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )    //创建新的
> use admin
> db.shutdownServer()

开启replication:相关启动参数,并修改port端口号27018:
vim /etc/mongod2.conf
在这里插入图片描述
主节点配置:

rs.stepDown() //让出主节点位置

1、部署认证复制 ----- 在主节点创建root用户:

kgcrs:PRIMARY> use admin
kgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})

2、生成4个实例的密钥文件:

cd /usr/bin/
 echo "kgcrs key"> kgcrskey1
 echo "kgcrs key"> kgcrskey2
 echo "kgcrs key"> kgcrskey3
 echo "kgcrs key"> kgcrskey4
 chmod 600 kgcrskey{1..4}

 vim /etc/mongod.conf  (mongod2.conf /mongod3.conf/mongod4.conf 都要改)
security:
   keyFile: /usr/bin/kgcrskey1     //(分别为 kgcrskey2、kgcrskey3、kgcrskey4)
   clusterAuthMode: keyFile

3、4个实例依次重启:

mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf

4、进入主节点验证:

> show dbs        //无法查看数据库
> rs.status()     //无法查看复制集
> use admin       //身份登录验证
> db.auth("root","123")
> rs.status()    //可以查看数据库
> show dbs       //可以查看复制集
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值