mongodb安装及简单使用
Mongodb实验报告
- 实验目的
本次实验是使用三台机器搭建mongodb集群,从而了解掌握文档数据库的基本情况和mongodb数据库的使用。
- 实验环境
宿主机:Windows 10
虚拟环境:三台 centos 7
mongodb版本:2.6.7
- mongodb基本介绍
从图中可以看到有四个组件:mongos、config server、shard、replica set。
Mongos:数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server:顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
Shard:这就是传说中的分片了,分担单个节点的压力。
Replica set每一个分片构建 replica set 副本集保证分片的可靠性
- 实验及使用
4.1安装步骤
4.1.1 角色分配
4.1.2 时间同步
首先安装ntpdate,ntpdate采用的是直接强制修改时间,完全不考虑对其他程序的影响,在真正的集群管理中应道少用,可以是用ntpd服务。因为我采用的是虚拟机,没什么影响,所以可以使用。
输入以下命令yum install ntpdate -y
顺便也同步一下硬件时间:hwclock --systohc
4.1.3 下载并解压安装包
4.1.4 创建目录
在一台机器上,创建mongos config shard1 shard2 shard3五个目录,因为mongos不存储数据,只需建立日志文件目录。
4.1.5 划分端口
划5个组件对应的端口号,由于一个机器需要同时部署mongos, config server, shard1, shard2, shard3,所以需要用端口号进行区分。这个端口号可以自己定义,本次实验中使用的是:mongos:20000,config server:21000, shard1:22001, shard2:22002, shard3:22003
4.1.6 编写配置文件
①配置服务器的配置文件
②配置每台mongos服务器
③配置每个分片的副本集
将整个mongodb的目录拷贝到其他的两个节点上,也可以通过scp进行发送。在另外两台辑器上解压之后,使用chmod命令赋予文件755的权限。
4.1.7 启动
①启动服务
首先启动三个节点的配置服务器,读取配置文件。执行完这三个命令之后再继续启动服务。
②启动副本集
三个节点都分别启动三个副本集,正常全部启动后,尝试在任意节点登录mongodb。
4.1.8 登录
在第一次登录的时候,没有分片副本集,需要自己进行设置,图中有***的位置的红框内显示id是mongos,是在mongodb的系统服务器上。
4.2 配置
4.2.1 定义副本集配置
因为我在之前已经定义过,所以这里ok的返回值为0,若是第一次定义副本集配置,此处ok的返回值应该为1。MongoDB主从复制该复制方式易于配置,并且可以支持任意数量的从节点服务器,与使用单节点模式相比有如下优点:在从服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性;可配置读写分离,主节点负责写操作,从节点负责读操作,将读写压力分开,提高系统的稳定性。
4.2.2 设置第二个和第三个副本集
首先是使用22002端口登录mongodb,仍是是使用admin数据库。配置文件:
config={_id:"shard1",members:[{_id:0,host:"192.168.149.141:22002"},{_id:1,host:"192.168.149.142:22002"},{_id:2,host:"192.168.149.143:22002",arbiterOnly:true}]},然后使用rs.initiate(config)进行初始化。第三个副本集的设置同上,只将22002端口换成22003端口。
4.2.3 配置分片
目前搭建的mongodb配置服务器,路由服务器,各个分片服务器,不过应用程序连接到mongs路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
- 使用mongos登录2000端口
- 使用admin数据库
- 串联路由服务器与分配副本集1、2、3
db.runCommand({addshard:"shard1/192.168.149.141:22001, 192.168.149.142:22001, 192.168.149.143:22001"});
db.runCommand({addshard:"shard1/192.168.149.141:22002, 192.168.149.142:22002, 192.168.149.143:22002"});
db.runCommand({addshard:"shard1/192.168.149.141:22003, 192.168.149.142:22003, 192.168.149.143:22003"});
- 查看分片配置副本集db. printShardingStatus();
4.2.4 设置自动分片
- 目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,连接在mongos上,准备让指定的数据库、指定的集合分片生效。
- 指定数据库里面的索引使用table1中的id字段的hash作为索引来分片,需要进入数据库中去建立
- 指定数据库testdb使分片生效,在admin库中执行以下命令
- 指定数据库里需要分片的集合和片键
db.runCommand({shardcollection:"testdb.table1",key:{id:"hashed"}})
设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片。
- 插入测试数据
从结果中看数据已经正确的分片。
4.3 简单使用
4.3.1 创建数据库
使用命令:use table1,可以进入table1数据库,但是此时并没有真正的被创建。从下图中我们可以看到并没有table1数据库。
4.3.2 创建集合
使用db.createCollection(“xxxx”)创建集合。
4.3.3 插入文档
使用命令:db.collection_name.insert()向集合中插入文档,注意当前所有的数据库。
当前所在的数据库为testdb,向其中名为col的集合插入一个文档,返回值显示插入成功。
4.3.4 删除文档
首先是使用db.collection_name.find()来查询集合中有哪些文档,可以添加判断条件。然后使用命令db.collection_name.remove()来删除文档。
4.3.5 删除集合
使用db.collection_name.drop()将整个集合删除。
4.3.6 删除数据库
使用命令db.dropDatabase()删除数据库。注意是必须是在该数据库的情况下才能删除该数据库。
4.3.7 聚合
在数据库中存在如下文档:
这是部分内容,并未显示全部内容,现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
聚合操作有点类似与sql语句中的聚集函数,能够完成一些简单的数学计算功能。
- 总结
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Mongodb在搭建的过程中,遇到的主要问题除了关于配置文件的内容以外,还有关于数据库中关于分片的配置,mongodb是采用的主从式分片,当主节点正常时,从节点不参与访问,当主节点故障的时候,随机选择一个从节点成为主节点。所以合理的进行分片配置,有利于保证数据库的可用性。Mongodb相比于redis来说要较为复杂,但是在使用过程中发现也是跟redis有不一样的感觉。
相比较于键值数据库redis,mongodb支持根据内容进行查找,这极大的减少了工作的复杂度,不会出现因为丢失键就丢失数据的情况。Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增删改查也只是像变量操作一样简单;MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活。
指标 |
Mongodb |
Redis |
性能 |
依赖内存,TPS较高 |
依赖内存,TPS非常高 |
可操作性 |
丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言 |
数据丰富,较少的IO |
可用性 |
支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制 |
依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制 |
一致性 |
不支持事物,靠客户端自身保证 |
支持事物,比较弱,仅能保证事物中的操作按顺序执行 |
数据分析 |
内置数据分析功能 |
不支持 |
应用场景 |
海量数据的访问效率提升 |
较小数据量的性能及运算 |
对于本次的实验,存在一个问题:把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的192.168.149.143相当空闲。让机器3192.168.149.143多分担点责任.架构这样调整,把机器的负载分的更加均衡一点,每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了。