热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库的主从复制与副本集群配置

一、主从复制1、主服务器和从服务器必须开启安全认证:?auth2、主服务器和从服务器的admin数据库中必须有全局用户。3、主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。主服务器设置:[root@test1~]#/opt/mongodb/bin/mo

1、主服务器和从服务器必须开启安全认证:?auth
2、主服务器和从服务器的admin数据库中必须有全局用户。
3、主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。

主服务器设置:
[root@test1 ~]# /opt/mongodb/bin/mongo
MongoDB shell version: 2.4.6
connecting to: test

> use admin
switched to db admin
> db.addUser(‘rootm’,'rootm’)
{
“user” : “rootm”,
“readOnly” : false,
“pwd” : “aa6526e3b7cbcecc18b2bd822f7c3547″,
“_id” : ObjectId(“50659e14d2fe6be605337c18″)
}
> db.addUser(‘repl’,'repl’)
{
“user” : “repl”,
“readOnly” : false,
“pwd” : “c9f242649c23670ff94c4ca00ea06fe7″,
“_id” : ObjectId(“5065a85eccf77b17681365b7″)
}

> use cloud
switched to db cloud
> db.addUser(‘repl’,'repl’)
{
“_id” : ObjectId(“5065a7cbb70f43c4d157e8ec”),
“user” : “repl”,
“readOnly” : false,
“pwd” : “c9f242649c23670ff94c4ca00ea06fe7″
}

> use local
switched to db local
> db.addUser(‘repl’,'repl’)
{
“user” : “repl”,
“readOnly” : false,
“pwd” : “c9f242649c23670ff94c4ca00ea06fe7″,
“_id” : ObjectId(“50659e2cd2fe6be605337c19″)
}

> exit

bye

[root@test1 ~]# /etc/init.d/mongod stop
[root@test1 ~]# vim /opt/mongodb/etc/mongod.conf
master = true
auth = true
[root@test1 ~]# /etc/init.d/mongod start
[root@test1 ~]# vim /etc/init.d/mongod
增加用户名与密码属性
$CLIEXEC admin -u rootm -p rootm ?eval “db.shutdownServer()”
在日志中可以看到auth与master参数都已经被启用。

从服务器设置:
[root@test2~]# /opt/mongodb/bin/mongo
MongoDB shell version: 2.4.6
connecting to: test

> use admin
switched to db admin
> db.addUser(‘roots’,'roots’)
{
“user” : “roots”,
“readOnly” : false,
“pwd” : “430b42be2092c65349e29043412a9155″,
“_id” : ObjectId(“50659fc1eb520e528f23454d”)
}
> db.addUser(‘repl’,'repl’)
{
“user” : “repl”,
“readOnly” : false,
“pwd” : “c9f242649c23670ff94c4ca00ea06fe7″,
“_id” : ObjectId(“5065a9772485dc71fdfe1af5″)
}

> use cloud
switched to db cloud
> db.addUser(‘repl’,'repl’)
{
“user” : “repl”,
“readOnly” : false,
“pwd” : “c9f242649c23670ff94c4ca00ea06fe7″,
“_id” : ObjectId(“5065a9a22485dc71fdfe1af6″)
}

> use local
switched to db local

> db.addUser(‘repl’,'repl’)
{
“user” : “repl”,
“readOnly” : false,
“pwd” : “c9f242649c23670ff94c4ca00ea06fe7″,
“_id” : ObjectId(“50659fd1eb520e528f23454e”)
}
> exit
bye

[root@test2~]# /etc/init.d/mongod stop
[root@test2~]# vim /opt/mongodb/etc/mongod.conf
slave = true
auth = true
source = 192.168.1.221:27017

[root@test2~]#/etc/init.d/mongod start
增加用户名与密码属性
$CLIEXEC admin -u roots -p roots ?eval “db.shutdownServer()”
[root@test2 ~]# tail -f /opt/mongodb/log/mongodb.log
在日志中可以看到auth与master参数都已经被启用,并且数据也开始进行了复制。

现在可以登入slave验证数据是否过来了:
[root@test2~]# /opt/mongodb/bin/mongo
MongoDB shell version: 2.4.6
connecting to: test
> use cloud;
switched to db cloud
> db.auth(‘repl’,'repl’)
1
> db.vm_instance
db.vm_instance
> db.vm_instance.find()
“uuid” : “1e5de227-547e-4ed0-957a-8884559d01cd”, “created” : “2012-06-29 00:40:53″ }
{ “_id” : ObjectId(“50658bd04ff74b0e8f2f6488″), “id” : 5, “instance_name” : “i-2-5-VM”, “private_ip_address” : “10.6.223.41″,

“uuid” : “123f8676-2fc1-413a-bdec-89e54835ad6a”, “created” : “2012-06-29 01:20:37″ }
{ “_id” : ObjectId(“50658bd04ff74b0e8f2f6489″), “id” : 6, “instance_name” : “i-2-6-VM”, “private_ip_address” : “10.6.223.139″,

“uuid” : “7d39898e-cc0d-46b2-a1d4-170201acf832″, “created” : “2012-06-29 03:55:32″ }
{ “_id” : ObjectId(“50658bd04ff74b0e8f2f648a”), “id” : 7, “instance_name” : “i-2-7-VM”, “private_ip_address” : “10.6.223.140″,

“uuid” : “ad0690bb-6738-42e3-a3ee-5a93b47fd3a4″, “created” : “2012-06-29 03:55:52″ }
{ “_id” : ObjectId(“50658bd04ff74b0e8f2f648b”), “id” : 8, “instance_name” : “i-2-8-VM”, “private_ip_address” : “10.6.223.142″,

“uuid” : “5beb13b5-8319-43a0-a65f-e7c7dde4334f”, “created” : “2012-06-29 03:56:07″ }
{ “_id” : ObjectId(“50658bd04ff74b0e8f2f648c”), “id” : 9, “instance_name” : “i-2-9-VM”, “private_ip_address” : “10.6.223.143″,
Type “it” for more
> exit
bye
数据库cloud中的数据已经成功的同步过来了,主从复制搭建成功。

二、部署副本集群
搭建副本集群,这是一个更高级方式,和主从复制不同的是:
1. 该集群没有特定的主数据库;
2. 如果某个主数据库宕机了,集群中就会推选出一个从数据库作为主数据库顶上,实现自动故障恢复功能,非常不错。

首先,我们准备三台服务器 test1、test2、test3
确保只有test1上有数据,而test2与test3上都没有数据,如果有则通过 use dbname和db.dropDatabase()将数据删除。
[root@test2 ~]# /home/mongodb/bin/mongo
MongoDB shell version: 2.4.6
connecting to: test
MoboTap:SECONDARY> show dbs
local
[root@test3 ~]# /home/mongodb/bin/mongo
MongoDB shell version: 2.4.6
connecting to: test
MoboTap:SECONDARY> show dbs
local
[root@test1 ~]# /home/mongodb/bin/mongo
MongoDB shell version: 2.4.6
connecting to: test
MoboTap:PRIMARY> show dbs
admin 0.203125GB
cloud 0.203125GB
local 1.203125GB

并取消之前在test1\test2的相关主从设置,
vim /etc/init.d/mongod
去掉帐号属性:$CLIEXEC admin ?eval “db.shutdownServer()”
主:
#master = true
#auth = true
从:
#slave = true
#auth = true
#source = 10.6.1.145:27017

然后在三台服务器上加入启动参数 ?replSet
需要给集群一个名称,比如MoboTap,?replSet 表示让服务器知道MoboTap下还有其他数据库。
replSet = MoboTap

然后重启三台服务器的MongoDB:
/etc/init.d/mongod stop && /etc/init.d/mongod start
在mongodb服务器上初始化整个副本集群
[root@test1 ~]# /opt/mongodb/bin/mongo admin
MongoDB shell version: 2.4.5
connecting to: admin
> db.runCommand({“replSetInitiate”:{ “_id”:”MoboTap”, “members”:[{"_id":1,"host":"192.168.1.221:27017"},{"_id":2,"host":"192.168.1.223:27017"},{"_id":3,"host":"192.168.1.225:27017"}]}})
{
“info” : “Config now saved locally. Should come online in about a minute.”,
“ok” : 1
}
然后我们检查目前整个副本集群的主从状态:
test1
MoboTap:PRIMARY>
test2
MoboTap:SECONDARY>
test3
MoboTap:SECONDARY>

我们可以看到,目前通过内部的自动“选举”,mongodb担任了PRIMARY的角色,而另外的node1与node2则担任了SECONDARY,并且成功的从mongodb中同步了数据。

我们可以通过rs.status()很方便的查看集群中的服务器状态。
MoboTap:PRIMARY> rs.status()
{
“set” : “MoboTap”,
“date” : ISODate(“2013-08-22T07:51:12Z”),
“myState” : 1,
“members” : [
{
"_id" : 1,
"name" : "192.168.1.221:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 16515,
"optime" : Timestamp(1377140782, 1),
"optimeDate" : ISODate("2013-08-22T03:06:22Z"),
"self" : true
},
{
"_id" : 2,
"name" : "192.168.1.223:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 962,
"optime" : Timestamp(1377140782, 1),
"optimeDate" : ISODate("2013-08-22T03:06:22Z"),
"lastHeartbeat" : ISODate("2013-08-22T07:51:12Z"),
"lastHeartbeatRecv" : ISODate("2013-08-22T07:51:12Z"),
"pingMs" : 0,
"syncingTo" : "192.168.1.221:27017"
},
{
"_id" : 3,
"name" : "192.168.1.225:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 16409,
"optime" : Timestamp(1377140782, 1),
"optimeDate" : ISODate("2013-08-22T03:06:22Z"),
"lastHeartbeat" : ISODate("2013-08-22T07:51:11Z"),
"lastHeartbeatRecv" : ISODate("2013-08-22T07:51:10Z"),
"pingMs" : 0,
"syncingTo" : "192.168.1.221:27017"
}
],
“ok” : 1
}

在MongoDB的副本集群中,还有一个角色叫做仲裁服务器,它的特点是只参与投票选举,而不会同步数据。

我们可以通过下面的步骤来新增一台仲裁服务器test4
MongoDB的配置与上面的test3完全相同,同样也要保证没有数据且启用了?replSet参数。
启动test4之后,我们在test1操作:
MoboTap:PRIMARY> rs.addArb(“192.168.1.228:27017″)
{ “ok” : 1 }
MoboTap:PRIMARY> rs.status()
{
“_id” : 4,
“name” : “192.168.1.228:27017″,
“health” : 1,
“state” : 7,
“stateStr” : “ARBITER”,
“uptime” : 17,
“lastHeartbeat” : ISODate(“2012-09-28T21:56:31Z”),
“pingMs” : 0
}

我们可以看到仲裁服务器已经被添加进来了,角色为ARBITER,就是仲裁的意思。
好的,目前整个副本集群就搭建好了,那么这个集群所具备的一个非常好的特性 “自动故障恢复”,我们就可以来好好见识一下了。

下面,我们将目前担任PRIMARY角色的服务器的进程直接Kill掉:
也就是将test1的mongod杀掉,
然后test2自动成了PRIMARY角色,
接着,我们重新恢复test1的服务,再看看主从关系有没有什么变化:
可以看到test1现在已经自动成为SECONDARY,而PRIMARY则仍然由test2担任。

下面,我们来实践一下节点的动态增加与删除。
我们新增一台test5,相关配置与test4一致,
启动好test5我们在PRIMARY上添加该节点:
MoboTap:PRIMARY> rs.add(“192.168.1.229:27017″);
{ “ok” : 1 }
MoboTap:PRIMARY> rs.status();
{
“_id” : 5,
“name” : “192.168.1.229:27017″,
“health” : 1,
“state” : 5,
“stateStr” : “STARTUP2″,
“uptime” : 13,
“optime” : Timestamp(0, 0),
“optimeDate” : ISODate(“1970-01-01T00:00:00Z”),
“lastHeartbeat” : ISODate(“2012-09-28T22:21:28Z”),
“pingMs” : 0,
“errmsg” : “initial sync need a member to be primary or secondary to do our initial sync”
}

目前数据还未同步完成,等待一段时间过后我们再看一下:
{
“_id” : 5,
“name” : “192.168.1.229:27017″,
“health” : 1,
“state” : 2,
“stateStr” : “SECONDARY”,
“uptime” : 228,
“optime” : Timestamp(1348870876000, 1),
“optimeDate” : ISODate(“2012-09-28T22:21:16Z”),
“self” : true
}

新的节点已经成功加入到了服务器当中。

接着,我们来测试动态的删除节点,同样拿刚刚新增的test5为例:
MoboTap:PRIMARY> rs.remove(“192.168.1.229:27017″);
{ “ok” : 1 }
MoboTap:PRIMARY> rs.status()
我们可以看到,节点test5已经被动态的从副本集群中删除了。
可以登入test5 确认:
MoboTap:REMOVED> rs.status()
{
“set” : “MoboTap”,
“date” : ISODate(“2012-09-29T10:14:03Z”),
“myState” : 10,
“members” : [
{
"_id" : 5,
"name" : "192.168.1.229:27017",
"health" : 1,
"state" : 10,
"stateStr" : "REMOVED",
"uptime" : 465,
"optime" : Timestamp(1348870876000, 1),
"optimeDate" : ISODate("2012-09-28T22:21:16Z"),
"self" : true
}
],
“ok” : 1
}
可以看到自己的状态变成了REMOVED。

整个mongodb的副本集群的自动故障恢复与节点的动态增加与删除我们都成功的实现了。
这种方式明显要比上面的主从复制方式更可用,并且支持多节点,能够进行动态增加与删除节点,实现水平的扩容,非常不错。


推荐阅读
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
author-avatar
个信2502894627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有