著作权说明文档牧云水务信息大数据存储与分析系统.docx
- 文档编号:3828128
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:22
- 大小:254.17KB
著作权说明文档牧云水务信息大数据存储与分析系统.docx
《著作权说明文档牧云水务信息大数据存储与分析系统.docx》由会员分享,可在线阅读,更多相关《著作权说明文档牧云水务信息大数据存储与分析系统.docx(22页珍藏版)》请在冰豆网上搜索。
著作权说明文档牧云水务信息大数据存储与分析系统
一、功能概述
威斯特曼云数据库MongoDB版(ApsaraDBforMongoDB)完全兼容MongoDB协议。
提供稳定可靠,和弹性伸缩的数据库服务。
可为用户提供容灾,备份,恢复,监控,报警等方面的全套数据库解决方案。
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个高性能,开源,无模式的文档型数据库,MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,是当前NoSql数据库中比较热门的一种。
它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。
他支持的数据结构非常松散,可以存储比较复杂的数据类型。
Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,并且它还支持对数据建立索引。
分布式文件系统(DistributedFileSystem)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
分布式文件系统的设计基于客户机/服务器模式。
一个典型的网络可能包括多个供多用户访问的服务器。
另外,对等特性允许一些系统扮演客户机和服务器的双重角色。
HBase(HadoopDatabase)是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价服务器上搭建起大规模结构化存储集群。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库,并且HBase是基于列模式,不同于一般的关系数据库的基于行的模式。
二、基础架构
云数据库MongoDB版自动搭建好3节点的副本集供用户使用,用户可以直接操作主服务器(Primary)和多个备份服务器(Seconadry)。
系统架构如下图:
三、框架优势
3.1高可用
云数据库MongoDB服务采用三节点副本集的高可用架构,三节点副本集高可用架构为业务可用性提供了极高的保障。
三个数据节点位于不同的物理服务器上,相互之间自动同步数据。
Primary和Secondary节点提供服务,当Primay节点出现故障时,系统会自动选取新的Primary节点。
若Secondary节点不可用,会由备用节点接管服务。
云数据库MongoDB还有自动备份功能,可一键式数据恢复,评测可解决90%以上的系统故障。
云数据库MongoDB每天会自动备份数据并上传至对象存储OSS,在提高数据容错能力的同时对磁盘空间占用起到有效降低的作用。
还能够通过实例数据的备份文件恢复到原实例。
这样一来能够有效防范因误操作等原因对业务数据造成不可逆的影响。
3.2高安全
云数据库MongoDB具有多层安全防护体系,能够抵御90%以上的网络攻击。
DDOS防护:
在网络入口实时监测,当发现超大流量攻击时,对源IP进行清洗,清洗无效情况下可以直接拉进黑洞。
IP白名单配置:
最多支持配置1000个允许连接RSD实例的服务器IP地址,从访问源进行直接的风险控制。
3.3易用性
云数据库MongoDB还具有完善的性能监控,可为用户分担60%以上的运维工作。
系统可提供CPU利用率、IOPS、连接数、磁盘空间等实例信息实时监控及报警,用户能够随时随地了解实例动态。
四、概念说明
4.1文档
文档是MongoDB中数据的基本单位,可以简单的视作关系数据库中的行。
多个键及其关联的值有序地放在一起就构成了文档。
文档中的值支持字符串、其他数据类型,例如,整型、布尔型等,也支持嵌套,即文档中还含有另一个文档。
但是要注意的是,文档中的键类型只能是字符串。
4.2集合
一组文档就可以表示为集合,这个集合的地位和关系数据库中的表类似。
集合是无模式的,集合中的文档可以是各式各样的,它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。
但是实际操作过程中,往往会使用多个集合。
使用多个集合的原因是,假如将所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,进而在对集合进行查询或者其他操作时,会大大降低操作效率。
所以在实际使用中,往往将文档分类存放在不同的集合中,例如,对于网站的日志记录,可以根据日志的类型分别进行存储,Info类型日志存放在Info集合中,Debug类型日志存放在Debug集合中,这样既方便了管理,也便于用户查询。
但是更加人性化的一点是,MongoDB并不是强制要求对文档进行划分,用户可以根据使用情况灵活选择存储方式。
可以使用“.”按照命名空间将一个集合划分为多个子集合。
例如,对于一个博客系统,可能包括blog.user和blog.article两个子集合,这般划分仅是为了组织结构更加清晰,其中的blog集合和blog.user、blog.article其实是没有任何关系的。
虽然子集合没有其他特殊的功能,但是使用子集合组织数据结构清晰,推荐这样使用。
4.3数据库
MongoDB中集合由多个文档组成,多个集合组成数据库。
一个MongoDB实例可以承载多个数据库。
它们之间可以看作是相互独立的,即对于每个数据库都有独立的权限控制。
存储时,不同的数据库是存放在不同的文件中。
MongoDB中存在以下3类系统数据库:
●Admin数据库:
一个权限数据库,如果创建用户的时候将该用户添加到Admin数据库中,那么该用户就自动继承了所有数据库的权限。
●Local数据库:
这个数据库永远不会被负责,可以用来存储本地单台服务器的任意集合。
●Config数据库:
当MongoDB使用分片模式时,Config数据库在内部使用,用于保存分片的信息。
4.4集群、副本集合
主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。
指定主节点的架构,这种架构一般都会申明一个节点为主节点,其他节点都是从节点。
但是这样架构我们在第一节说了整个集群如果主节点挂掉了就得手工操作,上架一个新的主节点或者从从节点恢复数据,不太灵活。
不指定主节点,集群中的任意节点都可以成为主节点。
MongoDB也就是采用这种架构,一但主节点挂了其他从节点自动接替变成主节点。
如下图:
副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。
部署方式如下:
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副本集测试文件夹
MySQL
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的安装程序包
注意linux生产环境不能安装32位的mongodb,因为32位受限于操作系统最大2G的文件限制。
MySQL
1
2
#解压下载的压缩包
tarxvzfmongodb-linux-x86_64-2.4.8.tgz
4、分别在每台机器上启动mongodb
MySQL
1
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --dbpath/data/mongodbtest/replset/data --replSetrepset
可以看到控制台上显示副本集还没有配置初始化信息。
MySQL
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
MySQL
1
2
3
4
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo
#使用admin数据库
useadmin
#定义副本集配置变量,这里的_id:
”repset”和上面命令参数“–replSet repset”要保持一样。
MySQL
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"}]
...}
#输出
MySQL
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"
}
]
}
MySQL
1
2
#初始化副本集配置
rs.initiate(config);
#输出成功
MySQL
1
2
3
4
{
"info":
"Confignowsavedlocally. Shouldcomeonlineinaboutaminute.",
"ok":
1
}
#查看日志,副本集启动成功后,138为主节点PRIMARY,136、137为副本节点SECONDARY。
MySQL
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:
27017thinksthatwearedown
SunDec2920:
26:
25.053[rsHealthPoll]replSetmember192.168.1.136:
27017isnowinstateSTARTUP2
SunDec2920:
26:
25.056[rsMgr]notelectingself,192.168.1.136:
27017wouldvetowith'Idon'tthink192.168.1.138:
27017iselectable'
SunDec2920:
26:
31.059[rsHealthPoll]replsetinfo192.168.1.137:
27017thinksthatwearedown
SunDec2920:
26:
31.059[rsHealthPoll]replSetmember192.168.1.137:
27017isnowinstateSTARTUP2
SunDec2920:
26:
31.062[rsMgr]notelectingself,192.168.1.137:
27017wouldvetowith'Idon't
MySQL
1
2
#查看集群节点的状态
rs.status();
#输出
MySQL
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
"set":
"repset",
"date":
ISODate("2013-12-29T12:
54:
25Z"),
"myState":
1,
"members":
[
{
"_id":
0,
"name":
"192.168.1.136:
27017",
"health":
1,
"state":
2,
"stateStr":
"SECONDARY",
"uptime":
1682,
"optime":
Timestamp(1388319973,1),
"optimeDate":
ISODate("2013-12-29T12:
26:
13Z"),
"lastHeartbeat":
ISODate("2013-12-29T12:
54:
25Z"),
"lastHeartbeatRecv":
ISODate("2013-12-29T12:
54:
24Z"),
"pingMs":
1,
"syncingTo":
"192.168.1.138:
27017"
},
{
"_id":
1,
"name":
"192.168.1.137:
27017",
"health":
1,
"state":
2,
"stateStr":
"SECONDARY",
"uptime":
1682,
"optime":
Timestamp(1388319973,1),
"optimeDate":
ISODate("2013-12-29T12:
26:
13Z"),
"lastHeartbeat":
ISODate("2013-12-29T12:
54:
25Z"),
"lastHeartbeatRecv":
ISODate("2013-12-29T12:
54:
24Z"),
"pingMs":
1,
"syncingTo":
"192.168.1.138:
27017"
},
{
"_id":
2,
"name":
"192.168.1.138:
27017",
"health":
1,
"state":
1,
"stateStr":
"PRIMARY",
"uptime":
2543,
"optime":
Timestamp(1388319973,1),
"optimeDate":
ISODate("2013-12-29T12:
26:
13Z"),
"self":
true
}
],
"ok":
1
}
整个副本集已经搭建成功了。
6、测试副本集数据复制功能
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#在主节点192.168.1.138上连接到终端:
mongo127.0.0.1
#建立test数据库。
usetest;
往testdb表插入数据。
>db.testdb.insert({"test1":
"testval1"})
#在副本节点192.168.1.136、192.168.1.137上连接到mongodb查看数据是否复制过来。
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo192.168.1.136:
27017
#使用test数据库。
repset:
SECONDARY>usetest;
repset:
SECONDARY>showtables;
#输出
MySQL
1
SunDec2921:
50:
48.590error:
{"$err":
"notmasterandslaveOk=false","code":
13435}atsrc/mongo/shell/query.js:
128
MySQL
1
2
3
4
5
6
7
8
9
#mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。
repset:
SECONDARY>db.getMongo().setSlaveOk();
#可以看到数据已经复制到了副本集。
repset:
SECONDARY>db.testdb.find();
1
2
#输出
{"_id":
ObjectId("52c028460c7505626a93944f"),"test1":
"testval1"}
7、测试副本集故障转移功能
先停掉主节点mongodb138,查看136、137的日志可以看到经过一系列的投票选择操作,137当选主节点,136从137同步数据过来。
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SunDec2922:
03:
05.351[rsBac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 著作权 说明 文档 水务 信息 数据 存储 分析 系统