听说MongoDB你很豪横?-------------MongoDB复制集以及管理优化

2020-09-15 09:54:25 浏览数 (1)

文章目录

  • 一、MongoDB 复制集
    • 1、简介:
    • 2、优势
    • 3、 特点
  • 二、部署复制集
    • 1、实验环境
    • 2、安装mongodb4.0
    • 3、编辑主配置文件,开启复制集模块
    • 4、启动实例
    • 5、创建复制集
    • 6、增加删除复制集
    • 7、MongoDB 复制集的切换
  • 三、MongoDB复制集管理优化:
    • 1、优化简介
    • 2、配置优化
      • (1)创建四个实例 步骤同上
      • (2)配置各节点角色
      • (3) 在数据库中进行简单的增删改查
      • (4)查看集群日志
      • (5)允许从节点进行数据读取
      • (6)查看从节点有哪些
    • 3、模拟主节点故障
    • 4、查看集群日志文件
    • 4、更改oplog大小
      • (1)查看oplog
      • (2)关闭服务将节点移除集群
      • (3)备份当前节点的所有oplog记录
      • (4)删除原来的oplog
      • (5)重新开启集群功能
      • (6)验证
    • 5、部署认证复制
      • 1、创建登录root用户密码
      • (2)生成4个实例的密钥文件:
      • (3)4个实例依次重启:
      • (4)进入主节点验证:

一、MongoDB 复制集

1、简介:

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

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

2、优势

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

3、 特点

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

二、部署复制集

1、实验环境

vmware15.5虚拟机 centos7.6 mongodb4.0版本

2、安装mongodb4.0

代码语言:javascript复制
[root@mongodb yum.repos.d]# vim /etc/yum.repos.d/mongodb-org-4.0.repo

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=0
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

yum list  
yum -y install mongodb-org

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     //赋予权限

3、编辑主配置文件,开启复制集模块

代码语言:javascript复制
# cp -p /etc/mongod.conf /etc/mongod2.conf
# vim /etc/mongod2.conf
     path: /data/mongodb/logs/mongodb2.log               //每个实例指定自己日志目录
     dbPath: /data/mongodb/mongodb2                        //每个实例指定自己的数据目录
     port: 27018           
bindIp: 0.0.0.0                                               //指定端口分别为27017、 27018、 27019 、 27020
        .......
     replication:                                           //开启所有实例的复制参数:定义一个 replSetName: zhen
                replSetName: zhen                 //这里的replset不要顶格  要加空格

4、启动实例

代码语言:javascript复制
vim /etc/profile   '改一下环境变量  不然-f不好使'
export PATH=/usr/local/mongodb/bin/:$PATH

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

5、创建复制集

mongo //进入实例

代码语言:javascript复制
   > show dbs
    > rs.status()  //查看复制集状态
    > cfg={"_id":"zhen","members":[{"_id":0,"host":"192.168.110.132:27017"},{"_id":1,"host":"192.168.110.132:27018"},{"_id":2,"host":"192.168.110.132:27019"}]}
     // 定义cfg初始化参数  id 是之前配置文件里定义的,成员(3个  id分别定义 0 1 2   IP端口号27017、27018、27019)
     >  rs.initiate(cfg)     //启动复制集
     >  rs.status()         //查看此时可以查看到复制状态了
zhen:PRIMARY> rs.isMaster()
{
	"hosts" : [
		"192.168.110.132:27017",
		"192.168.110.132:27018",
		"192.168.110.132:27019",
		"192.168.110.132:27020"
	],
	"setName" : "zhen",
	"setVersion" : 2,
	"ismaster" : true,
	"secondary" : false,
	"primary" : "192.168.110.132:27017",
	"me" : "192.168.110.132:27017",

6、增加删除复制集

利用刚刚起初创建的第四个节点实验

代码语言:javascript复制
rs.add("192.168.233.128:27020")      //增加节点
rs.remove("192.168.233.128:27020")   //删除节点

7、MongoDB 复制集的切换

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

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

手动切换

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

三、MongoDB复制集管理优化:

1、优化简介

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

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

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

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

  • 标准节点可能被选举为活跃(primary)节点,有选举权。
  • 被动节点有完整副本,不可能成为活跃节点,有选举权。
  • 仲裁节点不复制数据,不可能成为活跃节点,只有选举权。

标准节点和被动节点的区别:priority值高的是标准节点,低的是被动节点。 选举规则是票高者获胜,priority是优先权为01000的值,相当于额外增加01000的票数。选举结果:票高者获胜。若票数相同:数据新者获胜。

配置复制集的优先级:

2、配置优化

(1)创建四个实例 步骤同上

(2)配置各节点角色

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

代码语言:javascript复制
> cfg={"_id":"zhen","members":[{"_id":0,"host":"192.168.110.132:27017","priority":100},{"_id":1,"host":"192.168.110.132:27018","priority":100},{"_id":2,"host":"192.168.110.132:27019","priority":0},{"_id":3,"host":"192.168.110.132:27020","arbiterOnly":true}]}
> rs.initiate(cfg)    //初始化配置    
zhen:SECONDARY> rs.isMaster()    //查看复制集的状态
{
	"hosts" : [
		"192.168.110.132:27017",
		"192.168.110.132:27018"
	],
	"passives" : [
		"192.168.110.132:27019"
	],
	"arbiters" : [
		"192.168.110.132:27020"
	],

(3) 在数据库中进行简单的增删改查

代码语言:javascript复制
zhen:PRIMARY> use shang
switched to db shang
zhen:PRIMARY> db.t1.insert({"id":1,"name":"tom"})
WriteResult({ "nInserted" : 1 })
zhen:PRIMARY> db.t1.find()
{ "_id" : ObjectId("5f5c4bea88af06ce597fbc0a"), "id" : 1, "name" : "tom" }
zhen:PRIMARY> db.t1.insert({"id":2,"name":"jack"})
WriteResult({ "nInserted" : 1 })
zhen:PRIMARY> db.t1.update({"id":1},{$set:{"name":"dog"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
zhen:PRIMARY> db.t1.find()
{ "_id" : ObjectId("5f5c4bea88af06ce597fbc0a"), "id" : 1, "name" : "dog" }
{ "_id" : ObjectId("5f5c4c0588af06ce597fbc0b"), "id" : 2, "name" : "jack" }
zhen:PRIMARY> db.t1.remove({"id":1})
WriteResult({ "nRemoved" : 1 })
zhen:PRIMARY> db.t1.find()
{ "_id" : ObjectId("5f5c4c0588af06ce597fbc0b"), "id" : 2, "name" : "jack" }

(4)查看集群日志

代码语言:javascript复制
zhen:PRIMARY> use local
zhen:PRIMARY> show tables
oplog.rs                                         //集群日志存放位置
replset.election
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
zhen:PRIMARY> db.oplog.rs.find()         //查看集群日志
会观察到上面的增删改查

(5)允许从节点进行数据读取

代码语言:javascript复制
mongo --port 27018
> rs.slaveOk()        //允许默认从节点读取数据
> show dbs

(6)查看从节点有哪些

代码语言:javascript复制
zhen:SECONDARY> rs.printSlaveReplicationInfo()    //查看同步的从节点有哪些
source: 192.168.110.132:27017
	syncedTo: Sat Sep 12 2020 12:46:28 GMT 0800 (CST)
	0 secs (0 hrs) behind the primary 
source: 192.168.110.132:27019
	syncedTo: Sat Sep 12 2020 12:46:28 GMT 0800 (CST)
	0 secs (0 hrs) behind the primary 

3、模拟主节点故障

代码语言:javascript复制
mongod -f /etc/mongod.conf --shutdown   //主节点服务关掉
mongo --port 27018   //进入到27018节点查看
> rs.isMaster()   //查看节点的身份状态  主节点已经换到27018

zhen:PRIMARY> rs.isMaster()
{
	"hosts" : [
		"192.168.110.132:27017",
		"192.168.110.132:27018"
	],
	"passives" : [
		"192.168.110.132:27019"
	],
	"arbiters" : [
		"192.168.110.132:27020"
	],
	"setName" : "zhen",
	"setVersion" : 1,
	"ismaster" : true,
	"secondary" : false,
	"primary" : "192.168.110.132:27018",              //此时主节点已经变成27018了
	"me" : "192.168.110.132:27018",
代码语言:javascript复制
rs.stepDown() //让出主节点位置  可以手动进行让出节点
 Sat Sep 12 2020 13:08:23 GMT 0800 (CST

这里需要注意的是,重新将27017节点开启后也不会去抢占27018的primary,除非27018出现问题了 当两台标准服务器同时挂掉也不会被动节点也不会成为primary 此时集群将失去功能 重新将两台标准节点开启后,集群将恢复原来的状态,两台标准节点抢占primary

4、查看集群日志文件

代码语言:javascript复制
zhen:SECONDARY> rs.help()  //查看命令
查看Master的oplog元数据信息:

> rs.printReplicationInfo()                 //查看日志文件大小  后期不够用的话可以改
zhen:SECONDARY> rs.printReplicationInfo()
configured oplog size:   990MB
log length start to end: 2224secs (0.62hrs)
oplog first event time:  Sat Sep 12 2020 12:08:14 GMT 0800 (CST)
oplog last event time:   Sat Sep 12 2020 12:45:18 GMT 0800 (CST)
now:                     Sat Sep 12 2020 12:45:25 GMT 0800 (CST)

4、更改oplog大小

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

(1)查看oplog

代码语言:javascript复制
> use local
>  db.oplog.rs.find()          //查看.oplog
> db.oplog.rs.stats()          //查看.oplog内容
> rs.printReplicationInfo()    //查询oplog的大小默认990M及保存的操作记录持续的时长

(2)关闭服务将节点移除集群

mongo --port 27018

use admin db.shutdownServer() //关闭服务

注销replication:相关启动参数,并修改port端口号27028:

代码语言:javascript复制
vim /etc/mongod2.conf
#replication:
# replSetName: zhen   '关闭集群功能'
 port: 27028

(3)备份当前节点的所有oplog记录

代码语言:javascript复制
[root@localhost etc]# mongod -f /etc/mongod.conf 

[root@localhost etc]# mongodump --port 27028 --db local --collection 'oplog.rs'
2020-09-12T13:01:10.453 0800	writing local.oplog.rs to 
2020-09-12T13:01:10.458 0800	done dumping local.oplog.rs (267 documents)

(4)删除原来的oplog

代码语言:javascript复制
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()

(5)重新开启集群功能

开启replication:相关启动参数,并修改port端口号27017: vim /etc/mongod2.conf //将原来的恢复

(6)验证

重新进入节点查看日志信息 发现已经改成2048G

代码语言:javascript复制
zhen:SECONDARY> use local
switched to db local
zhen:SECONDARY> show tables
oplog.rs
replset.election
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
zhen:SECONDARY> db.printReplicationInfo()
configured oplog size:   2048MB
log length start to end: 30secs (0.01hrs)
oplog first event time:  Sat Sep 12 2020 13:07:48 GMT 0800 (CST)
oplog last event time:   Sat Sep 12 2020 13:08:18 GMT 0800 (CST)
now:  

这里的更改日志存储大小只对单实例有效,要想全部更改还得一个个来

5、部署认证复制

1、创建登录root用户密码

代码语言:javascript复制
zhen:PRIMARY> use admin
zhen:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})

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

代码语言:javascript复制
cd /usr/bin/
 echo "zhenrs key"> zhenrskey1
 echo "zhenrs key"> zhenrskey2
 echo "zhenrs key"> zhenrskey3
 echo "zhenrs key"> zhenrskey4
 chmod 600 zhenrskey{1..4}

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

(3)4个实例依次重启:

代码语言:javascript复制
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf

(4)进入主节点验证:

代码语言:javascript复制
> show dbs        //无法查看数据库
> rs.status()     //无法查看复制集

> use admin       //身份登录验证
> db.auth("root","123")
> rs.status()    //可以查看数据库
> show dbs       //可以查看复制集

0 人点赞