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