实践.docx
- 文档编号:23996244
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:55
- 大小:628.32KB
实践.docx
《实践.docx》由会员分享,可在线阅读,更多相关《实践.docx(55页珍藏版)》请在冰豆网上搜索。
实践
搭建高可用mongodb集群
目录
一,配置mongodb:
2
二、副本集8
三、深入副本集内部机制20
四、分片28
一,配置mongodb:
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题。
不过就是因为这些问题Nosql诞生了。
NOSQL有这些优势:
大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。
高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病。
高性能,Nosql通过简单的key-value方式获取数据,非常快速。
还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。
灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
而在关系数据库里,增删字段是一件非常麻烦的事情。
如果是非常大数据量的表,增加字段简直就是一个噩梦。
高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。
比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置。
在nosql数据库里,大部分的查询都是键值对(key、value)的方式。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的。
支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
所以这个非常方便,我们可以用sql操作MongoDB,从关系型数据库迁移过来,开发人员学习成本会大大减少。
如果再对底层的sqlAPI做一层封装,开发基本可以感觉不到mongodb和关系型数据库的区别。
同样MongoDB也是号称自己能够快速搭建一个高可用可扩展的的分布式集群,网上有很多搭建的文章,在我们搭建的时候还需要查找修改很多东西,所以把自己实战的步骤记录下来以备忘。
我们看看如何一步一步搭建这个东东。
一、mongodb单实例。
这种配置只适合简易开发时使用,生产使用不行,因为单节点挂掉整个数据业务全挂,如下图。
虽然不能生产使用,但这个模式可以快速搭建启动,并且能够用mongodb的命令操作数据库。
下面列出在linux下安装单节点mongodb的步骤
1、建立mongodb测试文件夹
#存放整个mongodb文件
mkdir-p/data/mongodbtest/single
#存放mongodb数据文件
mkdir-p/data/mongodbtest/single/data
#进入mongodb文件夹
cd /data/mongodbtest/single
2、下载mongodb的安装程序包
wgethttp:
//fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.6.tgz
#解压下载的压缩包
tarxvzfmongodb-linux-x86_64-2.4.6.tgz
#进入mongodb程序执行文件夹
cdmongodb-linux-x86_64-2.4.6/bin/
3、启动单实例mongodb
mongod --dbpath/data/mongodbtest/single/data
输出日志如下,成功!
[initandlisten]dbversionv2.4.6
……..
[initandlisten]waitingforconnectionsonport27017
[websvr]adminwebconsolewaitingforconnectionsonport28017
mongodb默认自带提供了web访问接口,通过IP+端口的形式可以访问。
http:
//192.168.0.1:
28017/
二、主从模式。
使用mysql数据库时大家广泛用到,采用双机备份后主节点挂掉了后从节点可以接替主机继续服务。
所以这种模式比单节点的高可用性要好很多。
下面看一下怎么一步步搭建一个mongodb的主从复制节点:
∙1、准备两台机器192.168.0.1和192.168.0.2。
192.168.0.1当作主节点,192.168.0.2作为从节点。
∙2、分别下载mongodb安装程序包。
在192.168.0.1上建立文件夹/data/mongodbtest/master,192.168.0.2建立文件夹/data/mongodbtest/slave。
∙3、在192.168.0.1启动mongodb主节点程序。
注意后面的这个“–master”参数,标示主节点。
mongod–dbpath/data/mongodbtest/master–master
输出日志如下,成功!
[initandlisten]MongoDBstarting:
pid=18285port=27017dbpath=/data/mongodbtest/mastermaster=1
#日志显示主节点参数
[initandlisten]options:
{dbpath:
“/data/mongodbtest/master”,master:
true}
……..
[initandlisten]waitingforconnectionsonport27017
4、在192.168.0.2启动mongodb从节点程序。
关键配置,指定主节点ip地址和端口–source192.168.0.1:
27017和标示从节点–source参数。
mongod–dbpath/data/mongodbtest/slave–slave–source192.168.0.1:
27017
输出日志如下,成功!
[initandlisten]MongoDBstarting:
pid=17888port=27017dbpath=/data/mongodbtest/slaveslave=1
……..
#日志显示从节点参数
[initandlisten]options:
{dbpath:
“/data/mongodbtest/slave”,slave:
true,source:
“192.168.0.1:
27017″}
……..
[initandlisten]waitingforconnectionsonport27017
#日志显示从节点从主节点同步复制数据
[replslave]repl:
fromhost:
192.168.0.1:
27017
5、测试主从复制。
在主节点上连接到终端:
mongo127.0.0.1
#建立test数据库。
usetest;
往testdb表插入数据。
>db.testdb.insert({"test1":
"testval1"})
查询testdb数据看看是否成功。
>db.testdb.find();
{"_id":
ObjectId("5284e5cb1f4eb215b2ecc463"),"test1":
"testval1"}
可以看到主机的同步日志
[initandlisten]connectionacceptedfrom192.168.0.2:
37285#3(2connectionsnowopen)
[slaveTracking]updatelocal.slavesquery:
{_id:
ObjectId(’5284e6268ed115d6238bdb39′),config:
{host:
“192.168.0.2:
35271″,upgradeNeeded:
true},ns:
“local.oplog.$main”}update:
{$set:
{syncedTo:
Timestamp1384441570000|1}}nscanned:
1nupdated:
1fastmod:
1keyUpdates:
0locks(micros)w:
132015132ms
检查从主机的数据。
mongo127.0.0.1
查看当前数据库。
>showdbs;
local 0.203125GB
test 0.203125GB
usetest;
db.testdb.find();
{"_id":
ObjectId("5284e5cb1f4eb215b2ecc463"),"test1":
"testval1"}
查询后数据已经同步过来了。
再看看日志,发现从主机确实从主机同步了数据。
ThuNov1423:
05:
13[replslave]repl:
checkpointapplied15operations
ThuNov1423:
05:
13[replslave]repl:
syncedTo:
Nov1423:
08:
105284e75a:
1
查看服务状态
>db.printReplicationInfo();
thisisaslave,printingslavereplicationinfo.
source:
192.168.0.1:
27017
syncedTo:
SunNov17201316:
04:
02GMT+0800(CST)
=-54secsago(-0.01hrs)
到此主从结构的mongodb搭建好了。
故障转移测试,现在两台服务器如果主服务器挂掉了,从服务器可以正常运转吗?
∙a、先测试下从服务器可以当成主服务器吗,也就是往从服务器里写能够同步主服务器吗?
在192.168.0.2上连接mongodb。
mongo127.0.0.1:
27017
>db.testdb.insert({"test3":
"testval3"});
notmaster
可以看到mongodb的从节点是不能提供写操作的,只能提供读操作。
b、如果从服务器挂掉,主服务器还可以提供服务。
如果主服务器挂掉了从服务器能否自动变为可写。
测试一下!
先杀掉原来的mongodb主服务器。
kill-3`ps-ef|grepmongod|grep-vgrep|awk'{print$2}'`
测试从服务器能否可写。
在192.168.0.2上连接mongodb测试。
>db.testdb.insert({"test3":
"testval3"});
notmaster
看起来从服务器没有自动接替主服务器的功能,只有手工处理了!
停止从服务器,在原数据文件启动并添加主服务器标示。
mongod --dbpath/data/mongodbtest/slave--master
等到启动成功(时间有点长)。
在192.168.0.2上连接
mongo192.168.0.2:
27017
。
>db.testdb.find();
{"_id":
ObjectId("5288629e9b0318be4b20bd4c"),"test1":
"testval1"}
{"_id":
ObjectId("528862d69b0318be4b20bd4d"),"test2":
"testval2"}
成功!
多个从节点。
现在只是一个数据库服务器又提供写又提供读,机器承载会出现瓶颈。
大家还记得mysql里的读写分离吗?
把20%的写放到主节点,80%的读放到从节点分摊了减少了服务器的负载。
但是大部分应用都是读操作带来的压力,一个从节点压力负载不了,可以把一个从节点变成多个节点。
那mongodb的一主多从可以支持吗?
答案是肯定的。
为了方便测试,在192.168.0.2上再建立一个文件夹/data/mongodbtest/slave1作为另一个slave服务器。
启动slave2服务,
mongod --dbpath/data/mongodbtest/slave1--slave --port27017--source192.168.0.1:
27017。
成功启动后通过mongodb连接测试:
>db.testdb.find();
{"_id":
ObjectId("5288629e9b0318be4b20bd4c"),"test1":
"testval1"}
{"_id":
ObjectId("528862d69b0318be4b20bd4d"),"test2":
"testval2"}
搭建了这套主从复制系统是不是就很稳健了,其实不然。
。
。
看看这几个问题?
∙主节点挂了能否自动切换连接?
目前需要手工切换。
∙主节点的写压力过大如何解决?
∙从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?
∙就算对从节点路由实施路由访问策略能否做到自动扩展?
二、副本集
NoSQL的产生就是为了解决大数据量、高扩展性、高性能、灵活数据模型、高可用性。
但是光通过主从模式的架构远远达不到上面几点,由此MongoDB设计了副本集和分片的功能。
这篇文章主要介绍副本集:
mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式,点击查看 ,如图:
那什么是副本集呢?
打魔兽世界总说打副本,其实这两个概念差不多一个意思。
游戏里的副本是指玩家集中在高峰时间去一个场景打怪,会出现玩家暴多怪物少的情况,游戏开发商为了保证玩家的体验度,就为每一批玩家单独开放一个同样的空间同样的数量的怪物,这一个复制的场景就是一个副本,不管有多少个玩家各自在各自的副本里玩不会互相影响。
mongoDB的副本也是这个,主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性。
而副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了上面第一个问题“主节点挂掉了,整个集群内会自动切换”。
难怪mongoDB官方推荐使用这种模式。
我们来看看mongoDB副本集的架构图:
由图可以看到客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。
主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。
我们看一下主服务器挂掉后的架构:
副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。
看起来很牛X的样子,我们赶紧操作部署一下!
官方推荐的副本集机器数量为至少3个,那我们也按照这个数量配置测试。
1、准备两台机器 192.168.1.136、192.168.1.137、192.168.1.138。
192.168.1.136当作副本集主节点,192.168.1.137、192.168.1.138作为副本集副本节点。
2、分别在每台机器上建立mongodb副本集测试文件夹
1
2
3
4
5
6
7
8
#存放整个mongodb文件
mkdir-p /data/mongodbtest/replset
#存放mongodb数据文件
mkdir-p /data/mongodbtest/replset/data
#进入mongodb文件夹
cd /data/mongodbtest
3、下载mongodb的安装程序包
1
wgethttp:
//fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz
注意linux生产环境不能安装32位的mongodb,因为32位受限于操作系统最大2G的文件限制。
1
2
#解压下载的压缩包
tarxvzfmongodb-linux-x86_64-2.4.8.tgz
4、分别在每台机器上启动mongodb
1
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --dbpath /data/mongodbtest/replset/data --replSetrepset
可以看到控制台上显示副本集还没有配置初始化信息。
1
2
SunDec2920:
12:
02.953[rsStart]replSetcan'tgetlocal.system.replsetconfigfromselforanyseed(EMPTYCONFIG)
SunDec2920:
12:
02.953[rsStart]replSetinfoyoumayneedtorun replSetInitiate--rs.initiate()intheshell--ifthatisnotalreadydone
5、初始化副本集
在三台机器上任意一台机器登陆mongodb
1
2
3
4
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo
#使用admin数据库
useadmin
#定义副本集配置变量,这里的_id:
”repset”和上面命令参数“–replSet repset”要保持一样。
1
2
3
4
5
config={_id:
"repset",members:
[
...{_id:
0,host:
"192.168.1.136:
27017"},
...{_id:
1,host:
"192.168.1.137:
27017"},
...{_id:
2,host:
"192.168.1.138:
27017"}]
...}
#输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"_id":
"repset",
"members":
[
{
"_id":
0,
"host":
"192.168.1.136:
27017"
},
{
"_id":
1,
"host":
"192.168.1.137:
27017"
},
{
"_id":
2,
"host":
"192.168.1.138:
27017"
}
]
}
1
2
#初始化副本集配置
rs.initiate(config);
#输出成功
1
2
3
4
{
"info":
"Confignowsavedlocally. Shouldcomeonlineinaboutaminute.",
"ok":
1
}
#查看日志,副本集启动成功后,138为主节点PRIMARY,136、137为副本节点SECONDARY。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SunDec2920:
26:
13.842[conn3]replSetreplSetInitiateadmincommandreceivedfromclient
SunDec2920:
26:
13.842[conn3]replSetreplSetInitiateconfigobjectparsesok,3membersspecified
SunDec2920:
26:
13.847[conn3]replSetreplSetInitiateallmembersseemup
SunDec2920:
26:
13.848[conn3]******
SunDec2920:
26:
13.848[conn3]creatingreplicationoplogofsize:
990MB...
SunDec2920:
26:
13.849[FileAllocator]allocatingnewdatafile/data/mongodbtest/replset/data/local.1,fillingwithzeroes...
SunDec2920:
26:
13.862[FileAllocator]doneallocatingdatafile/data/mongodbtest/replset/data/local.1,size:
1024MB, took0.012secs
SunDec2920:
26:
13.863[conn3]******
SunDec2920:
26:
13.863[conn3]replSetinfosavinganewerconfigversiontolocal.system.replset
SunDec2920:
26:
13.864[conn3]replSetsaveConfigLocallydone
SunDec2920:
26:
13.864[conn3]replSetreplSetInitiateconfignowsavedlocally. Shouldcomeonlineinaboutaminute.
SunDec2920:
26:
23.047[rsStart]replSetIam192.168.1.138:
27017
SunDec2920:
26:
23.048[rsStart]replSetSTARTUP2
SunDec2920:
26:
23.049[rsHealthPoll]replSetmember192.168.1.137:
27017isup
SunDec2920:
26:
23.049[rsHealthPoll]replSetmember192.168.1.136:
27017isup
SunDec2920:
26:
24.051[rsSync]replSetSECONDARY
SunDec2920:
26:
25.053[rsHealthPoll]replsetinfo192.168.1.136:
27017thinksth
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实践