博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【MongoDB系列】:MongoDB 集群,主从模式(一)
阅读量:7224 次
发布时间:2019-06-29

本文共 9529 字,大约阅读时间需要 31 分钟。

hot3.png

NoSQL的优势

  • 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。

  • 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病。

  • 高性能,Nosql通过简单的key-value方式获取数据,非常快速。还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。

  • 灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。

  • 高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置。

在nosql数据库里,大部分的查询都是键值对(key、value)的方式。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的。支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。所以这个非常方便,我们可以用sql操作MongoDB,从关系型数据库迁移过来,开发人员学习成本会大大减少。如果再对底层的sql API做一层封装,开发基本可以感觉不到mongodb和关系型数据库的区别。同样MongoDB也是号称自己能够快速搭建一个高可用可扩展的的分布式集群,网上有很多搭建的文章,在我们搭建的时候还需要查找修改很多东西,所以把自己实战的步骤记录下来以备忘。我们看看如何一步一步搭建这个东东。

MongoDB单机模式

单机模式只适合开发测试使用,不能够再生成环境下使用,不然节点挂点,整个系统业务也就都挂了。

具体使用参考前面的博客。

Mongodb主从模式

主从模式,大家在使用mysql数据库时广泛用到,采用双机备份后主节点挂掉了后从节点可以接替主机继续服务。所以这种模式比单节点的高可用性要好很多。

因为条件限制,我在windows系统上创建2个mongodb节点来测试。

1、解压mongodb-win32-x86_64-2008plus-3.0.7.zip文件,重命名为mongodb_master和mongodb_slave,区分主节点和从节点。

2、分别在目录下载创建data文件夹,再data文件下创建db和log文件夹。

161852_qM99_112937.png

3、创建start_mongodb_master.bat和start_mongodb_slave.bat批处理文件,方便启动测试。

start_mongodb_master.bat内容,注意后面的这个 “ –master ”参数,标示主节点。

mongodb_master\bin\mongod --port 5001 --dbpath mongodb_master\data\db --logpath mongodb_master\data\log\MongoDB_Master.log -master

start_mongodb_slave.bat内容,关键配置,指定主节点ip地址和端口 –source 127.0.01:5001 和 标示从节点 –source 参数。

mongodb_slave\bin\mongod --port 5002 --dbpath mongodb_slave\data\db --logpath mongodb_slave\data\log\MongoDB_slave.log -slave -source 127.0.0.1:5001

4、启动主节点,输出日志:

2015-12-07T15:29:45.002+0800 I CONTROL  Hotfix KB2731284 or later update is not installed, will zero-out data files2015-12-07T15:29:45.170+0800 I JOURNAL  [initandlisten] journal dir=mongodb_master\data\db\journal2015-12-07T15:29:45.173+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed2015-12-07T15:29:45.338+0800 I JOURNAL  [durability] Durability thread started2015-12-07T15:29:45.339+0800 I JOURNAL  [journal writer] Journal writer thread started2015-12-07T15:29:45.586+0800 I CONTROL  [initandlisten] MongoDB starting : pid=9872 port=5001 dbpath=mongodb_master\data\db master=1 64-bit host=hanfeng-PC2015-12-07T15:29:45.586+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R22015-12-07T15:29:45.586+0800 I CONTROL  [initandlisten] db version v3.0.72015-12-07T15:29:45.586+0800 I CONTROL  [initandlisten] git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd2015-12-07T15:29:45.586+0800 I CONTROL  [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_492015-12-07T15:29:45.586+0800 I CONTROL  [initandlisten] allocator: tcmalloc2015-12-07T15:29:45.587+0800 I CONTROL  [initandlisten] options: { master: true, net: { port: 5001 }, storage: { dbPath: "mongodb_master\data\db" }, systemLog: { destination: "file", path: "mongodb_master\data\log\MongoDB_Master.log" } }2015-12-07T15:29:45.589+0800 I INDEX    [initandlisten] allocating new ns file mongodb_master\data\db\local.ns, filling with zeroes...2015-12-07T15:29:46.370+0800 I STORAGE  [FileAllocator] allocating new datafile mongodb_master\data\db\local.0, filling with zeroes...2015-12-07T15:29:46.370+0800 I STORAGE  [FileAllocator] creating directory mongodb_master\data\db\_tmp2015-12-07T15:29:46.560+0800 I STORAGE  [FileAllocator] done allocating datafile mongodb_master\data\db\local.0, size: 64MB,  took 0.188 secs2015-12-07T15:29:46.568+0800 I REPL     [initandlisten] ******2015-12-07T15:29:46.568+0800 I REPL     [initandlisten] creating replication oplog of size: 3034MB...2015-12-07T15:29:46.568+0800 I STORAGE  [FileAllocator] allocating new datafile mongodb_master\data\db\local.1, filling with zeroes...2015-12-07T15:30:32.435+0800 I STORAGE  [FileAllocator] done allocating datafile mongodb_master\data\db\local.1, size: 2047MB,  took 45.864 secs2015-12-07T15:30:32.540+0800 I STORAGE  [initandlisten] MmapV1ExtentManager took 45 seconds to open: mongodb_master\data\db\local.12015-12-07T15:30:32.587+0800 I STORAGE  [FileAllocator] allocating new datafile mongodb_master\data\db\local.2, filling with zeroes...2015-12-07T15:30:58.253+0800 I STORAGE  [DataFileSync] flushing mmaps took 13082ms  for 4 files2015-12-07T15:31:29.257+0800 I STORAGE  [FileAllocator] done allocating datafile mongodb_master\data\db\local.2, size: 2047MB,  took 56.668 secs2015-12-07T15:31:29.412+0800 I STORAGE  [initandlisten] MmapV1ExtentManager took 56 seconds to open: mongodb_master\data\db\local.22015-12-07T15:31:43.175+0800 I REPL     [initandlisten] ******2015-12-07T15:31:43.236+0800 I NETWORK  [initandlisten] waiting for connections on port 5001

从上面的日志文件,我们可以发现MongoDB主节点启动成功

[initandlisten] MongoDB starting : pid=9872 port=5001 dbpath=mongodb_master\data\db master=1 64-bit host=hanfeng-PC

主节点参数,包括master:true,表示该节点是主节点,port:5001,表示端口是5001,dbPath表示数据库保存位置,systemLog表示输出的日志文件位置。

[initandlisten] options: { master: true, net: { port: 5001 }, storage: { dbPath: "mongodb_master\data\db" }, systemLog: { destination: "file", path: "mongodb_master\data\log\MongoDB_Master.log" } }

5、接着我们要启动从节点。双击start_mongodb_slave.bat进行启动。

6、输出日志:

2015-12-07T15:46:09.817+0800 I CONTROL  Hotfix KB2731284 or later update is not installed, will zero-out data files2015-12-07T15:46:09.827+0800 I JOURNAL  [initandlisten] journal dir=mongodb_slave\data\db\journal2015-12-07T15:46:09.827+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed2015-12-07T15:46:09.860+0800 I JOURNAL  [durability] Durability thread started2015-12-07T15:46:09.860+0800 I JOURNAL  [journal writer] Journal writer thread started2015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] MongoDB starting : pid=11128 port=5002 dbpath=mongodb_slave\data\db slave=1 64-bit host=hanfeng-PC2015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R22015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] db version v3.0.72015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd2015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_492015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] allocator: tcmalloc2015-12-07T15:46:10.104+0800 I CONTROL  [initandlisten] options: { net: { port: 5002 }, slave: true, source: "127.0.0.1:5001", storage: { dbPath: "mongodb_slave\data\db" }, systemLog: { destination: "file", path: "mongodb_slave\data\log\MongoDB_slave.log" } }2015-12-07T15:46:10.111+0800 I NETWORK  [initandlisten] waiting for connections on port 50022015-12-07T15:46:11.110+0800 I REPL     [replslave] repl: syncing from host:127.0.0.1:50012015-12-07T15:46:16.124+0800 I REPL     [replslave] repl: sleep 1 sec before next pass2015-12-07T15:46:17.124+0800 I REPL     [replslave] repl: syncing from host:127.0.0.1:50012015-12-07T15:46:22.296+0800 I REPL     [replslave] repl: syncing from host:127.0.0.1:50012015-12-07T15:46:32.296+0800 I REPL     [replslave] repl: syncing from host:127.0.0.1:5001

显示节点参数:端口号:5002,slave:true表示从节点,souce指定主节点

[initandlisten] options: { net: { port: 5002 }, slave: true, source: "127.0.0.1:5001", storage: { dbPath: "mongodb_slave\data\db" }, systemLog: { destination: "file", path: "mongodb_slave\data\log\MongoDB_slave.log" } }

日志显示从节点 从主节点同步复制数据

[replslave] repl: syncing from host:127.0.0.1:5001

7、主节点和从节点服务都启动完毕,接着我们可以开始测试同步情况。

在主节点上连接到终端

D:\app\MongoDB\ms\mongodb_master\bin>mongo 127.0.0.1:50012015-12-07T15:51:57.770+0800 I CONTROL  Hotfix KB2731284 or later update is notinstalled, will zero-out data filesMongoDB shell version: 3.0.7connecting to: 127.0.0.1:5001/test> db.user.insert({"name":"张三","age":20})WriteResult({ "nInserted" : 1 })> db.user.find(){ "_id" : ObjectId("56653acacec0c7081610318b"), "name" : "张三", "age" : 20 }>

上面我们连接到127.0.0.1:5001 ,并插入一条数据和查询结果。

8、登录从节点服务器查看数据

C:\Users\hanfeng>mongo 127.0.0.1:50022015-12-07T15:59:18.331+0800 I CONTROL  Hotfix KB2731284 or later update is notinstalled, will zero-out data filesMongoDB shell version: 3.0.7connecting to: 127.0.0.1:5002/test> db.user.find(){ "_id" : ObjectId("56653acacec0c7081610318b"), "name" : "张三", "age" : 20 }>

从结果发现,我们在主节点插入的数据已经同步到从节点了。

查看服务器状态:

> db.printReplicationInfo();this is a slave, printing slave replication info.source: 127.0.0.1:5001        syncedTo: Mon Dec 07 2015 16:01:17 GMT+0800 (中国标准时间)        12 secs (0 hrs) behind the freshest member (no primary available at themoment)>

显示当前节点是从节点,连接到的主节点,同步的时间。

多个从节点

现在只是一个数据库服务器又提供写又提供读,机器承载会出现瓶颈。大家还记得mysql里的读写分离吗?把20%的写放到主节点,80%的读放到从节点分摊了减少了服务器的负载。但是大部分应用都是读操作带来的压力,一个从节点压力负载不了,可以把一个从节点变成多个节点。那mongodb的一主多从可以支持吗?答案是肯定的。

复制上面的mongodb_slave文件夹,修改批处理端口号和路径即可添加一个新的测试从节点。大家自己测试。

故障转移测试

猜测一:

从服务器是否可用当成主服务器使用?即我们把数据直接写入从服务器,然后主服务器同步从服务器的数据。

验证:

连接到5002服务器,插入一条数据。

> db.user.insert({"name":"李四","age":30})WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })>

出现错误提示,说明我们猜测是不可行的,从服务器只能提供读取操作,不能进行写入操作。

猜测二:

主服务器挂掉了,从服务器是否可用变成主服务器,进行写入操作?

> db.user.insert({"name":"李四","age":30})WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })>

得到的结果依然和上面一样,是不行。看来要把从服务器变成主服务器只能进行人工处理。即在从服务器上添加主服务器标识“-master”

遗留问题

1、主节点挂了,从节点不能自动切换成主节点,需要人工进行处理。

2、主节点写入的压力如何解决?

3、从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?

4、就算对从节点路由实施路由访问策略能否做到自动扩展?

参考:http://www.lanceyan.com/tech/mongodb/mongodb_cluster_1.html

转载于:https://my.oschina.net/ihanfeng/blog/540285

你可能感兴趣的文章
yum源配置
查看>>
PHP开发规范分享
查看>>
性能测试分层模型
查看>>
细数10个令人惊讶的NodeJS开源项目
查看>>
angularjs中的问题
查看>>
理解NSSComparisionResult 类型
查看>>
第二周作业
查看>>
Python Object Oriented
查看>>
Linux基础命令
查看>>
初入编程的新世界
查看>>
C++编译器详解(一)
查看>>
使用牙线
查看>>
部署Node.js项目(CentOS)
查看>>
Linux常用命令及vim的使用、vim常用插件(推荐)
查看>>
laravel 使用中间件解决跨域问题
查看>>
快速排序算法
查看>>
可控制左右切换的幻灯片轮换
查看>>
git 常用操作
查看>>
ECharts 英雄联盟能力分析雷达图及支付宝信用评分雷达图
查看>>
Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
查看>>