应用场景
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
操作步骤
1. MongoDB介绍
对于一个大型网站来说,面对数据库高并发读写、海量数据的高效率访问以及高可扩展性和高可用性等需求,传统的关系型数据库已经力不从心,且提升规模所需的成本令人望而却步,而灵活、易扩展、高可用以及高性能的NoSQL数据库在处理大数据的需求上优势明显。
MongoDB是开源、高性能、易扩展的文档数据库,一个介于关系数据库和非关系数据库之间的NoSQL数据库产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的关系型数据库(丰富的功能)架起一座桥梁,集两者的优势于一身。MongoDB支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型。其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
1.1 适用场景
网站数据:适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制与高伸缩性;
缓存:适合作为基础设施的缓存层,在系统重启之后缓存层可以避免下层的数据源过载;
大尺寸,低价值的数据:关系型数据库存储这些数据时可能比较昂贵,很多人会选择以文件形式存储;
高伸缩性的场景:适合由数十或数百台服务器组成的数据库;
用于对象及JSON数据的存储:MongoDB的BSON数据格式非常适合文档化格式的存取。
1.2 不适用场景
高度事务性的系统:例如银行或会计系统,传统的关系型数据库更适用;
传统的商业智能应用:针对特定问题需要高度优化的查询方式,数据仓库可能是更合适的选择;
需要SQL的问题
2. 部署环境
要搭建高可用MongoDB架构,复制集(Replica Set)是必须的,它通过多套Mongo服务来保证其中一个服务挂掉后,可以自动切换到其他服务来实现故障转移,且这些服务之间是同步的。
但是高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。我们可以对设备进行纵向扩展如增加更多的CPU与存储资源,但是代价比较昂贵。这里可以通过MongoDB的分片集群(Sharding)在多台机器上分割数据,使得数据库系统能存储和处理更多的数据,以此来应对不断增加的负载和数据。
2.1 单机
单机环境参考复制集节点安装配置章节。
2.2 复制集
复制集是由一组拥有相同数据集的 mongod 实例组成的。其中一个节点为主节点(Primary),所有的写请求都在它上面完成。而其他节点都是从节点(Secondary),从节点接收从主节点传来的操作并应用,以此来保证与主节点的数据集一致。一个复制集只能有一个主节点,一旦主节点不可用了,复制集就会将一个从节点选举成为新的主节点。
最基础的复制集架构是由三个成员组成的,且成员个数应该是奇数,包括一个主节点(Primary),一个从节点(Secondary),还有一个投票节点(Arbiter)。投票节点的作用仅仅是在选举过程中参与投票,该节点中并不包含数据集,故所需资源很少,无需一个专用物理机。
2.3 分片集群
分片集群包括分发路由mongos、配置服务器config server以及分片shard,集群架构如下:
mongos,集群请求的入口,分发读写请求到分片服务器,前端应用透明访问。
config server,存储所有数据库元信息(路由、分片)的配置,mongos从配置服务器加载配置信息。生产环境中,为确保冗余与安全,一般使用3台配置服务器,且必须部署在不同的机器上。
shard,分片是存储了集群一部分数据的 mongod 或者 replica set,所有分片存储组成了集群的全部数据。在生产环境中,为保证高可用的分片架构,至少要保证2个分片,每个分片都应该是一个复制集。复制集为每个分片的数据提供了冗余和高可靠性。
3. 复制集搭建
3.1 节点安装配置
注:在主节点、从节点以及投票节点分别执行以下全部配置!
3.1.1 系统基础配置
关闭SELinux
# vi /etc/selinux/config
……
SELINUX=disabled
……
关闭防火墙
# service iptables stop
# chkconfig iptables off
重启机器
# reboot
3.1.2 配置时间同步
安装ntpdate
# yum install -y ntpdate
时间同步
# ntpdate pool.ntp.org
设置计划任务
# crontab -e
0 23 * * * ntpdate pool.ntp.org >> /var/log/ntpdate.log
3.1.3 安装软件包
安装OpenSSL
# yum install -y openssl-devel openssl
下载并解压缩安装包,也可以外部下载后拷贝到服务器root目录下
# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.0.6.tgz
# tar -zxvf mongodb-linux-x86_64-rhel62-3.0.6.tgz
将mongodb移至/usr/local/mongodb目录下
# mv mongodb-linux-x86_64-rhel62-3.0.6 /usr/local/mongodb
创建数据与日志目录
# mkdir /usr/local/mongodb/data
# mkdir /usr/local/mongodb/log
3.1.4 配置服务
设置开机自启动,local增加启动信息
# vim /etc/rc.d/rc.local
/usr/local/mongodb/bin/mongod --fork --auth --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/log/mongodb.log --replSet set0
启动服务
# /usr/local/mongodb/bin/mongod --fork --auth --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/log/mongodb.log --replSet set0
3.2 配置复制集
在主节点配置复制集:
进入mongodb进行配置
# ./bin/mongo
config={_id:'set0',members:[{_id:0,host:'192.168.202.80',priority:2},{_id:1,host:'192.168.202.95', priority:1},{_id:2,host:'192.168.202.96',arbiterOnly:true}]} #输入配置信息(priority最大的为master服务器,投票节点需配置arbiterOnly:true)
使配置生效
# rs.initiate(config)
3.3 安装验证
查看状态,health表示当前服务的状态,等于1就是正常状态:
# rs.status()