初识mongodb一二三(二)

二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.conf,mongodb_salve.conf

[[email protected] 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
[[email protected] 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节点

[[email protected] 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上输出日志内容如下:

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. 启动从节点

[[email protected] 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上输出日志如下:

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插入数据:

[[email protected] 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节点,验证数据:

[[email protected] 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
> show dbs
local  0.078GB
test   0.078GB
> db.testdb.find()
{ "_id" : ObjectId("5a0b23702c969986fca777ed"), "test1" : "item1" }

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

> 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. 从服务器可以当做主服务器吗,也就是从服务器可写吗?

试一下:

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

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

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

把master进程杀掉:

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

测试slave节点:

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

发现,还是不可写!

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

继续思考一个问题:

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

时间: 2024-10-15 01:01:21

初识mongodb一二三(二)的相关文章

初识mongodb一二三(三)

三搭建mongodb副本集 MongoDB复制原理就是主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致. 那什么是副本集呢?主从模式一主一从就是一个副本.MongoDB复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性;复制还允许您从硬件故障和服务中断中恢复数据.副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了之前的问题"主节点

初识Mongodb之[CURD]-PHP版

行动 在了实践之前,希望大家看一下上面的学习资源,了解一下基本操作. 数据连接初始账号密码 账号:admin 密码:admin 首先我们建立一个文件:mongodb.php,设置需要连接账号密码,连接数据库 <?php /** * Mongodb Test * * Tools: * Zend Studio 8.x * Eclipse Plug :Toggle Varpper * * @author Wu Bai Qing<[email protected]> * @version $Id

MongoDB入门学习(二):MongoDB的基本概念和数据类型

上一篇讲了MongoDB的安装和管理,其中涉及到了一些概念,数据结构还有一些API的调用,不知道的没关系,其实很简单,这篇会简单介绍一下. 1.文档 文档是MongoDB的核心概念,多个键值对有序的放在一起就是一个文档,文档是MongoDB存储数据最基本的数据结构.对MongoDB都是以文档的形式来操作的,使用了一种类似JSON的二进制BSON数据格式,对API的调用都是传的文档参数.每种编程语言都有标示文档的数据结构,比如java的map,lua的table,python的dict等等,但是都

MongoDB笔记(二)

一.数据插入删除 (1)Insert函数:db.集合名.insert(obj,opts)obj要插入的文档,ops为可选参数可用来设置写安全级别. 1.insert函数只能作用于一个集合. 2.如果集合不存在,数据库服务会自动创建目标集合. 3.插入文档时如果没有指定_id字段,数据库服务会自动创建ObjectId对象作为_id的值. (2)Bulk函数:用来批量处理插入和删除分为顺序Bulk和并行Bulk两种. 1.初始化Bulk db.集合名.initializeUnorderedBulkO

Mongodb笔记(二) Index

版本:mongodb3.4; Index  : 如果mongodb不能使用索引进行排序,就会将数据放入内存中进行排序,而当内存使用超过32MB时,就会报错. 在创建索引时,应确保索引的选择力,避免多余的查询.避免没有选择力的索引. _id是默认的索引. 基本方法: db.collection.createIndex({A:1}); db.collection.dropIndex({A:1});       //两种方法删除. .dropIndex('indexName'); db.collect

[原创]MongoDB综合实例二

MongoDB-Sharding部署方案 一.    部署环境 五台主机: Amongoshard01:  10.212.74.43 Amongoshard02:  10.212.84.4 Amongoshard03:  10.212.98.23 Amongoshard04:  10.212.46.5 Amongoshard05:  10.212.70.21 安装: CentOS 6.5系统 mongodb-linux-x86_64-rhel62-3.0.2.tgz 二.    部署方案 方案目

mongoDB基本操作(二)-(CRUD)

MongoDB的shell操作数据,用到create.read.update.delete操作. 1.创建 insert函数用于创建一个文档到集合里面. 例,创建局部变量post,内容是代表文档的JavaScript对象,里面会有title.content和date几个键. > post = {"title":"My Blog Post", ... "content":"Here's my blog post", ...

MongoDB 学习(二)可视化界面

一.安装可视化界面 1.mongobooster 安装和配置 1.下载安装 下载地址:https://nosqlbooster.com/downloads 下载完成后直接点击安装: 安装完成弹出界面: 2.点击 create 创建链接: 3.点击 Test Connection 测试链接: 4.测试 OK 后 点击 Save & Connect 链接到本地数据库: 2.在 mongobooster 中写操作语句 1.查看集合 2.新增一条数据 3.修改一条数据 4.查看文档 二.在 Java 中

集腋成裘-14-MongoDB系列-01初识MongoDB

粗知拙见:将数据通过类似json的形式存储于文档中. window下MongoDB下载 安装只需要选择对应的文件夹即可,注意位置D:\software\MongoDB\ 1:配置环境变量并检验是否安装成功(mongod -help) 2:启动数据库服务 创建一个批处理文件,mongoDB.bat 其语法为 mongod --dbpath 路径 (mongod --dbpath D:\software\MongoDBDATA) 或者,直接运行以上命令(本机是配置了环境变量) 3:启动数据客户端 创