高可用mongodb集群的学习记录(二mongodb主从配置)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

mongodb主从配置

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

1、环境准备

实际应用中,需要两台机器一主一从。我这里因资源问题,使用一台机器解决。

192.168.221.161:27021当做master

192.168.221.161:27022当做slave

2、分别建立两个文件夹/data/db_master/data/db_slave

3、分别配置两个配置文件mongodb_master.confmongodb_salve.conf

1
2
3
4
5
6
7
8
9
10
11
12
[root@MidApp mongodb] # cat mongodb_master.conf 
dbpath= /data/db_master
logpath= /usr/local/mongodb/logs/mongodb_master .log
logappend= true
port=27021
fork= true
auth= false
nohttpinterface= false
bind_ip=192.168.221.161
journal= true
quiet= true
master= true


1
2
3
4
5
6
7
8
9
10
11
12
13
[root@MidApp mongodb] # cat mongodb_salve.conf 
dbpath= /data/db_slave
logpath= /usr/local/mongodb/logs/mongodb_slave .log
logappend= true
port=27022
fork= true
auth= false
nohttpinterface= false
bind_ip=192.168.221.161
journal= true
quiet= true
slave= true
source =192.168.221.161:27021


4. 启动master节点

1
2
3
4
[root@MidApp mongodb] # mongod -f mongodb_master.conf 
about to fork child process, waiting  until  server is ready  for  connections.
forked process: 55489
child process started successfully, parent exiting


Master上输出日志内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
2017-11-14T09:02:39.999-0800 I CONTROL  [initandlisten] options: { config:  "mongodb_master.conf" , master:  true , net: { bindIp:  "192.168.221.161" , http: { enabled:  true  }, port: 27021 }, processManagement: { fork:  true  }, security: { authorization:  "disabled"  }, storage: { dbPath:  "/data/db_master" , journal: { enabled:  true  } }, systemLog: { destination:  "file" , logAppend:  true , path:  "/usr/local/mongodb/logs/mongodb_master.log" , quiet:  true  } }
2017-11-14T09:02:40.014-0800 I INDEX    [initandlisten] allocating new ns  file  /data/db_master/local .ns, filling with zeroes...
2017-11-14T09:02:40.018-0800 I NETWORK  [websvr] admin web console waiting  for  connections on port 28021
2017-11-14T09:02:40.254-0800 I STORAGE  [FileAllocator] allocating new datafile  /data/db_master/local .0, filling with zeroes...
2017-11-14T09:02:40.254-0800 I STORAGE  [FileAllocator] creating directory  /data/db_master/_tmp
2017-11-14T09:02:40.263-0800 I STORAGE  [FileAllocator]  done  allocating datafile  /data/db_master/local .0, size: 64MB,  took 0.001 secs
2017-11-14T09:02:40.318-0800 I REPL     [initandlisten] ******
2017-11-14T09:02:40.318-0800 I REPL     [initandlisten] creating replication oplog of size: 990MB...
2017-11-14T09:02:40.319-0800 I STORAGE  [FileAllocator] allocating new datafile  /data/db_master/local .1, filling with zeroes...
2017-11-14T09:02:40.349-0800 I STORAGE  [FileAllocator]  done  allocating datafile  /data/db_master/local .1, size: 1024MB,  took 0.029 secs
2017-11-14T09:02:40.354-0800 I REPL     [initandlisten] ******
2017-11-14T09:02:40.358-0800 I NETWORK  [initandlisten] waiting  for  connections on port 27021


5. 启动从节点

1
2
3
4
[root@MidApp mongodb] # mongod -f mongodb_salve.conf 
about to fork child process, waiting  until  server is ready  for  connections.
forked process: 55577
child process started successfully, parent exiting


Slave上输出日志如下:

1
2
3
4
5
6
7
8
2017-11-14T09:05:10.757-0800 I CONTROL  [initandlisten] allocator: tcmalloc
2017-11-14T09:05:10.757-0800 I CONTROL  [initandlisten] options: { config:  "mongodb_salve.conf" , net: { bindIp:  "192.168.221.161" , http: { enabled:  true  }, port: 27022 }, processManagement: { fork:  true  }, security: { authorization:  "disabled"  }, slave:  true source "192.168.221.161:27021" , storage: { dbPath:  "/data/db_slave" , journal: { enabled:  true  } }, systemLog: { destination:  "file" , logAppend:  true , path:  "/usr/local/mongodb/logs/mongodb_slave.log" , quiet:  true  } }
2017-11-14T09:05:10.759-0800 I INDEX    [initandlisten] allocating new ns  file  /data/db_slave/local .ns, filling with zeroes...
2017-11-14T09:05:10.763-0800 I NETWORK  [websvr] admin web console waiting  for  connections on port 28022
2017-11-14T09:05:11.039-0800 I STORAGE  [FileAllocator] allocating new datafile  /data/db_slave/local .0, filling with zeroes...
2017-11-14T09:05:11.039-0800 I STORAGE  [FileAllocator] creating directory  /data/db_slave/_tmp
2017-11-14T09:05:11.045-0800 I STORAGE  [FileAllocator]  done  allocating datafile  /data/db_slave/local .0, size: 64MB,  took 0.001 secs
2017-11-14T09:05:11.066-0800 I NETWORK  [initandlisten] waiting  for  connections on port 27022


6. 验证一下主从复制

登录master插入数据:

1
2
3
4
5
6
7
8
9
10
11
[root@MidApp mongodb] # mongo 192.168.221.161:27021 
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27021 /test
> show dbs
local   1.078GB
> use  test
switched to db  test
> db.testdb.insert({ "test1" : "item1" })
WriteResult({  "nInserted"  : 1 })
> db.testdb. find ()
"_id"  : ObjectId( "5a0b23702c969986fca777ed" ),  "test1"  "item1"  }


登录slave节点,验证数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@MidApp mongodb] # mongo 192.168.221.161:27022
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27022 /test
> show dbs
2017-11-14T09:07:45.745-0800 E QUERY    Error: listDatabases failed:{  "note"  "from execCommand" "ok"  : 0,  "errmsg"  "not master"  }
     at Error (<anonymous>)
     at Mongo.getDBs (src /mongo/shell/mongo .js:47:15)
     at shellHelper.show (src /mongo/shell/utils .js:630:33)
     at shellHelper (src /mongo/shell/utils .js:524:36)
     at (shellhelp2):1:1 at src /mongo/shell/mongo .js:47
> db.getMongo().setSlaveOk() #由于slave节点默认是不可读的,需要先执行这句命令才能查询数据
 
> show dbs
local   0.078GB
test    0.078GB
> use  test
> db.testdb. find ()
"_id"  : ObjectId( "5a0b23702c969986fca777ed" ),  "test1"  "item1"  }


从节点上可以通过命令db.printReplicationInfo()查看服务状态:

1
2
3
4
5
> db.printReplicationInfo()
this is a slave, printing slave replication info.
source : 192.168.221.161:27021
syncedTo: Tue Nov 14 2017 09:12:04 GMT-0800 (PST)
7 secs (0 hrs) behind the freshest member (no primary available at the moment)


至此,mongodb的主从架构已经完成了。为防止机器负载过大,也可以配置一主多从服务,master节点只负责写操作,slave节点只提供读操作。

不过,存在几个疑问:

a. 从服务器可以当做主服务器吗,也就是从服务器可写吗?

试一下:

1
2
> db.testdb.insert({ "test3" : "item3" })
WriteResult({  "writeError"  : {  "code"  : undefined,  "errmsg"  "not master"  } })


可以看到,slave节点是不可写的

b.如果master挂掉,从服务器会自动接管主服务,变为可写吗?

master进程杀掉:

1
kill  -9 ` ps  -ef| grep  mongod| grep  - v  grep | awk  '{print $2}' `


测试slave节点:

1
2
> db.testdb.insert({ "test3" : "item3" })
WriteResult({  "writeError"  : {  "code"  : undefined,  "errmsg"  "not master"  } })


发现,还是不可写!

这种情况只能手动干预了。。。

继续思考一个问题:

我们怎么实现主节点挂了之后能够自动切换?下一篇接着学习mongodb的集群搭建

 




本文转自 青苗飞扬 51CTO博客,原文链接:http://blog.51cto.com/qingmiao/1981606
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
存储 NoSQL 算法
MongoDB保姆级指南(中):从副本集群、分片集群起航,探索分布式存储的趋势!
本文一起来聊聊MongoDB集群,顺带以MongoDB集群为起点,共同探讨一下分布式存储的发展趋势~
178 15
|
3月前
|
存储 监控 NoSQL
震撼!揭秘高可用 MongoDB 分片集群搭建的神秘魔法,开启数据存储的无敌模式!
【8月更文挑战第9天】在数字化时代,数据至关重要。MongoDB作为流行非关系型数据库,通过搭建高可用分片集群确保系统稳定性和性能。分片技术将大数据集分布于多服务器以实现水平扩展。搭建集群需准备服务器资源,配置环境,启动配置服务器、路由服务器及分片服务器,并设置分片策略。例如,对特定数据库和集合启用分片。此架构适用于高流量应用如大型电商平台,确保数据高效处理和高可用性。搭建过程需持续监控和优化,合理规划分片策略以维持系统稳定运行。
38 3
|
3月前
|
存储 运维 NoSQL
轻松上手:逐步搭建你的高可用MongoDB集群(分片)
【8月更文挑战第13天】在数据激增的背景下,传统单机数据库难以胜任。MongoDB作为流行NoSQL数据库,采用分片技术实现水平扩展,有效处理海量数据。分片将数据分散存储,提高并发处理能力和容错性,是高可用架构基石。构建MongoDB集群需理解shard、config server和router三组件协同工作原理。通过具体实例演示集群搭建流程,包括各组件的启动及配置,确保数据高可用性和系统稳定性。合理规划与实践可构建高效稳定的MongoDB集群,满足业务需求并支持未来扩展。
78 0
|
4月前
|
自然语言处理 运维 NoSQL
MongoDB集群同步
实现 MongoDB Cluster-to-Cluster 即集群同步的工具是:mongosync 详情可参考如下官方文档: https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/quickstart/ 以上这个地址的文档一看就是机器翻译的,可能有不恰当的地方,但基本可参考使用。 以下是本次在某项目地配置集群同步的简要步骤,可参考使用。
84 6
|
3月前
|
NoSQL MongoDB Windows
MongoDB 读写分离——Windows MongoDB 副本集配置
MongoDB 读写分离——Windows MongoDB 副本集配置
57 0
|
4月前
|
消息中间件 NoSQL 中间件
MongoDB多数据中心的主从结构
【7月更文挑战第3天】
42 0
|
4月前
|
消息中间件 NoSQL 中间件
MongoDB主从结构、仲裁节点
【7月更文挑战第2天】
56 0
|
4月前
|
存储 NoSQL 关系型数据库
MongoDB的配置服务器和复制机制
【7月更文挑战第2天】MongoDB配置服务器存储分片和权限元数据,支持在主节点故障时保持读服务。关键组件,性能影响显著。复制集包含Primary和Secondary,通过oplog实现数据同步,类似MySQL binlog。oplog的幂等性可能导致大量set操作,且大小受限,可能导致从节点需全量同步。读写分离提升效率,主从切换确保高可用。
48 0
|
1月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
8天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。