Fork me on GitHub

Mongodb

简介

Mongodb是时下流行的Nosql数据库,存储方式是文档式存储,并不是key-value形式。

参考CSDN的博客,在本地使用三种方式实际搭建mongo集群:

1.replica set

2.sharding

3.master-slaver

万丈高楼平地起,无论业务多复杂,架构多庞大,归根到底还是数据库本身各种功能的应用,理解了数据库的设计原理,数据存储形式,掌握了基本的功能应用,集群构建,数据流动抽取备份,到了实际工作场景中无非数据量更大,应用形式多样化,架构更庞大而已。

replica set

副本集,简单来说就是集群当中包含了多份数据,保证主节点挂掉,备节点能继续提供服务,备节点与主节点的数据一致,如图

Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点,主备节点存储数据,仲裁节点不存储数据,客户端连接主备,不连接仲裁节点。

默认设置下,主节点提供所有增删改查服务,备节点不提供服务。可以设置read preference modes,让备节点提供查询服务来分担主节点的压力,客户端进行的数据查询请求会自动转到备节点。

仲裁节点本身不存储数据,主要作用是决定哪个备节点在主节点挂掉后提升为主节点。多个备节点仍然只需要一个仲裁节点,本文中即使一个备节点也需要仲裁节点,如果没有,主节点挂了备节点还是备节点。

集群设计

服务器 节点
192.168.3.7 主节点
192.168.3.8 备节点
192.168.3.9 仲裁节点
软件版本 下载地址
mongodb-linux-x86_64-3.4.10 下载地址

实验过程

解压到指定目录,创建数据文件夹

tar xvf mongodb-linux-x86_64-3.4.10.tgz -C /usr/local

cd /usr/local

mv mongodb-linux-x86_64-3.4.10/ mongodb

mkdir -p /usr/local/mongodb/data/master   
mkdir -p /usr/local/mongodb/data/slaver   
mkdir -p /usr/local/mongodb/data/arbiter    
三个目录分别对应主,备,仲裁节点

建立配置文件,起mongo

以下三个文件是三个节点的mongo启动参数文件,编辑好放在任何位置都可以,启动时按绝对路径指定即可

#master.conf  
dbpath=/usr/local/mongodb/data/master  
logpath=/usr/local/mongodb/log/master.log  
pidfilepath=/usr/local/mongodb/master.pid  
directoryperdb=true  
logappend=true  
replSet=testrs  
bind_ip=192.168.3.7  
port=27017
oplogSize=10000  
fork=true  
noprealloc=true

#slaver.conf
dbpath=/usr/local/mongodb/data/slaver  
logpath=/usr/local/mongodb/log/slaver.log  
pidfilepath=/usr/local/mongodb/slaver.pid  
directoryperdb=true  
logappend=true  
replSet=testrs  
bind_ip=192.168.3.8  
port=27017 
oplogSize=10000  
fork=true  
noprealloc=true 


#arbiter.conf  
dbpath=/usr/local/mongodb/data/arbiter  
logpath=/usr/local/mongodb/log/arbiter.log  
pidfilepath=/usr/local/mongodb/arbiter.pid  
directoryperdb=true  
logappend=true  
replSet=testrs  
bind_ip=1192.168.3.9  
port=27017
oplogSize=10000  
fork=true  
noprealloc=true  

参数解释

dbpath:数据存放目录

logpath:日志存放路径

pidfilepath:进程文件,方便停止mongodb

directoryperdb:为每一个数据库按照数据库名建立文件夹存放

logappend:以追加的方式记录日志

replSet:replica set的名字

bind_ip:mongodb所绑定的ip地址

port:mongodb进程所使用的端口号,默认为27017

oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%

fork:以后台方式运行进程

noprealloc:不预先分配存储

./mongod -f ../master.conf 

./mongod -f ../slaver.conf

./mongod -f ../arbiter.conf

原博客这里并没有提到需要手动创建log文件夹,经过若干次各个节点若干次启动失败各种原因排查,最终确定在我搭建的环境里需要手动创建log文件夹,但是原博文和推送我博文的朋友他们搭建过程貌似都不需要,不得解,待议。

配置主,备,仲裁节点

./mongo 192.168.3.7:27018   #ip和port是某个节点的地址  
>use admin  
>cfg={_id:"testrs",members:[ {_id:0,host:'192.168.3.7:27017',priority:2}, {_id:1,host:'192.168.3.8:27017',priority:1},   
{_id:2,host:'192.168.3.9:27017',arbiterOnly:true}] };  
>rs.initiate(cfg) #使配置生效  

现在基本上已经完成了集群的所有搭建工作。

测试方案:
一个是往主节点插入数据,从备节点查询到之前插入的数据.

二是停掉主节点,让备节点变成主节点提供服务。

三是恢复主节点,备节点也能恢复其备的角色,而不是继续充当主的角色。二和三都可以通过rs.status()命令实时查看集群的变化

sharding

和Replica Set类似,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。就三种集群搭建方式来说,这种是最复杂的。部署图如下:

非常简单,懒得配了,看文档都能想到所有的具体操作和屏幕输出还有最后的结果,如果工作用到现搭就行了,有兴趣的自己去简介的原博客地址去撸一遍。

master-slaver

这个是最简答的集群搭建,严格来说不能算是集群,只能说是主备。并且官方已经不推荐这种方式,简单的介绍下,搭建方式相对简单。

./mongod --master --dbpath /data/masterdb/  #主节点  

./mongod --slave --source <masterip:masterport> --dbpath /data/slavedb/ 备节点  

只要在主节点和备节点上分别执行这两条命令,Master-Slaver就算搭建完成了。我没有试过主节点挂掉后备节点是否能变成主节点,不过既然官方已经不推荐了,了解即可。

三种集群搭建方式首选Replica Set,只有真的是大数据,Sharding才能显现威力,毕竟备节点同步数据是需要时间的。Sharding可以将多片数据集中到路由节点上进行一些对比,然后将数据返回给客户端,Replica Set的ips在数据达到1400w条时基本能达到1000左右,而Sharding在300w时已经下降到500ips,mongodb吃内存的问题,解决办法只能通过ulimit来控制内存使用量,但是如果控制不好的话,mongodb会挂掉

mongo数据库工作原理

MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟缓存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。

出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,所以

1.重启服务
2.调整内核参数drop_caches  systemctl vm.drop_caches=3
3.使用MongoDB内置的closeAllDatabases命令

可以通过mongo命令行来监控MongoDB的内存使用情况
db.serverStatus().mem

这篇博客简单介绍下怎么使用,具体技术细节服务库架构应用场景等我深入研究回来补上。