前言
阅读本文的同学们需要一定基础知识,对集群结构,主从结构(master-slave)需要有一定的了解,否则会晕
首先需要了解认识NoSql, 即为Not Only Sql, 不同于传统的关系型数据库的数据库管理系统的统称. MongoDB 是一个基于分布式文件存储的数据库, 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.
MongoDB的数据结构与关系型数据库数据结构对比
关系型数据库术语/ 概念 | MongoDB 术语/ 概念 | 解释/ 说明 |
Database | Database | 数据库 |
Table | Collection | 数据库表/集合 |
Row | Document | 数据记录行/文档 |
Column | Field | 数据列/数据字段 |
Index | Index | 索引 |
Table joins | 表关联/MongoDB 不支持 | |
Primary Key | Object ID | 主键/MongoDB 自动将_id 设置为主键 |
MongoDB 的应用场景和不适用场景
1、适用场景
a.网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
b.缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。
c.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
d.高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。
e.用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。
2、不适用场景
a.高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
b.传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
接下来进行实战:mongodb集群搭建
搭建环境准备: vmware workstation + centos7.0, 还不会搭建环境的同学么需要努力,这些都是程序员必备的
知识准备:如下图所示
图中的机器名 端口号等等,也将是我们本文之后要达到的目的
说明:由于资源有限,三台机器IP:192.168.131.129,IP:192.168.131.130,IP:192.168.131.131,route:mongodb路由配置主要是起到负载均衡的作用, 也可以搭建集群,本文为了演示,
就不弄那么复杂,只部署129一台机器上
configsvr:为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,决定该条记录属于哪个 chunk,配置服务器可以存储以下信息,每个shard节点的配置信息,每个chunk的shard key范围,chunk在各shard 的分布情况,集群中所有 DB 和 collection 的 sharding 配置信息。
repl副本集:主从配置(master-slave),需要注意 mongodb中增删改操作都在master上,slave只作为备份,不做任何操作,当然也可以通过配置来修改
chunks:每个副本集下又分为多个chunks,在shard分片的时候,根据规则存储在不同的chunks,所有的chunks做并集就是全部数据,也就是说可以把chunks理解为负无穷大到正无穷大,然后中间有几个分割点而已.
开始搭建:
1. wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.1.tgz 下载mongodb数据库
2. tar -xzvfmongodb-linux-x86_64-amazon-3.6.1.tgz 解压安装包
3. 博主是解压在了/opt/mongodb/目录下, 然后在三台机器上分别创建目录replica1(副本集配置信息),
replica2, configserver, route(路由配置信息),
如下图所示
4. 每台机器下的每个文件夹下需要创建目录data, logs以及文件mongodb.cfg(三台机器都需要创建以下目录)
说明:data目录存放数据库信息, logs目录存放日志信息, mongdb.cfg文件配置数据库启动相关参数, 详见后续说明
mkdir -p /opt/mongodb/replica1/data
mkdir -p /opt/mongodb/replica1/logs
mkdir -p /opt/mongodb/replica2/data
mkdir -p /opt/mongodb/replica2/logs
mkdir -p /opt/mongodb/configserver/data
mkdir -p /opt/mongodb/configserver/logs
由于本文只搭建一个路由服务,所以下面目录只需要在129上创建即可
mkdir -p /opt/mongodb/route/data
mkdir -p /opt/mongodb/route/logs
接下来,看看mongodb.cfg是如何配置的?
1) 首先 我们要知道 mongo, mongod, mongos 这三个命令分别代表什么?
a. mongo:是指客户端连接数据库的命令,比如 mongo 192.168.131.129:27017
b. mongod:是指启动数据库服务的命令,如何启动 下面的问题回答
c. mongos:这个命令是连接路由配置的,也就是说本文最终要在129机器上配置一台路由服务,端口号为30000
将来我们最终的增删改操作都是连接的路由服务,由路由服务根据配置规则去副本集中查询真正的数据
例如: mongos192.168.131.129:30000
2)启动mongodb数据库命令的操作和方式有什么?
a. 在后续过程中我们会一直使用mongodb中的命令, 所以需要配置环境变量,这个过程又有临时配置生效和
永久生效, 我们采用后一种,
vim /etc/profile
export MONGODB_HOME=/opt/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
source /etc/profile 是配置生效
b. 继续说启动操作(拿副本集replica1举例)
第一种 mongod --dbpath=/opt/mongodb/replica1/data --logpath=/opt/mongodb/replica1/logs --logappend --port=27017 --fork
第二种 采用配置文件的方式启动, 就是把上面红色标注的命令放入文件中 例如mongodb.cfg
mongod -f /opt/mongodb/replica1/mongodb.cfg 来启动数据库
相信对linux操作熟悉的人都知道 以上第二种启动方式在很多地方都雷同 比如redis中也可以这样指定
上面有哪些基本参数以及代表什么含义,详见下面的问题
3) mongodb.cfg的基本配置参数有哪些, 有代表什么含义?
基本参数及解释
dbpath:数据存放目录(也就是上文中创建的data目录)
logpath:日志存放路径(也就是上文中创建的logs目录)
logappend:以追加的方式记录日志
replSet:replica set 的名字
bind_ip:mongodb 所绑定的 ip 地址
port:mongodb 进程所使用的端口号,默认为 27017
fork:以后台方式运行进程
shardsvr: 表示以sharding(分片)模式启动服务
以上问题,看了之后希望能够理解,接下来就是傻瓜式的操作,
不断的配置mongodb.cfg, 然后指定所在目录,不断的以
mongod -f /opt/mongodb/***/mongodb.cfg 启动
最后 在启动路由服务时 mongos -f /opt/mongodb/route/mongodb.cfg
好啦 不在废话 直接操作
1.先搭建第一个副本集replica1
分别修改三台机器的以下文件
vim /opt/mongodb/replica1/mongodb.cfg
上图部分指定一个副本集shard1 和分别绑定对应的IP地址, 以及端口号都设置为27017
细心的同学发现了最后一个图并没有指定shardsvr=true
这是为什么呢?
因为我们要把最后一台机器设置为arbiter仲裁节点,这个节点可以不用设置分片
2.设置完成后,开始分别启动数据库
mongod -f /opt/mongodb/replica1/mongodb.cfg
3. 使副本集的数据节点生效
mongo 192.168.131.129:27017 (ip: 129 或 130 都可以, port为上文配置中写的端口)
use admin
cfg={_id:"shard1",members:[{_id:0,host:'192.168.131.129:27017',priority:9},
{_id:1,host:'192.168.131.130:27017',priority:1},{_id:2,host:'192.168.131.131:27017',arbiterOnly:true}]};
priority:9 //代表权重值 值越大越可能成为master
arbiterOnly:true //就是指定为仲裁节点
rs.initiate(cfg) //使配置生效
rs.status() //可以查看节点状态
可以看到 master(129) slave(130) arbiter(131)
4. 搭建第二个副本集replica2, 过程操作步骤和上述一摸一样,只不过为了区分,
只需要修改mongodb.cfg中的 replSet=shard2, port=27018, dbpath, logpath修改为对应目录
只上一张图看看, 其它的重复上面步骤即可
mongo 192.168.131.129:27018
use admin
cfg={_id:"shard2",members:[{_id:0,host:'192.168.131.129:27018'},
{_id:1,host:'192.168.131.130:27018'},{_id:2,host:'192.168.131.131:27018'}]};
rs.initiate(cfg)
这个副本集中没有配置仲裁节点,当然也可以配置
5. 搭建configserver
同样修改mongodb.cfg文件
port=27019 //统一指定端口为27019
configsvr=true// 指定为configsvr
分别启动各台机器的服务
mongod -f /opt/mongodb/configserver/mongodb.cfg
使configsvr节点集群生效
mongo 192.168.131.129:27019 (ip: 129 或 130 都可以, port为上文配置中写的端口)
use admin
cfg={_id:"configrs",members:[{_id:0,host:'192.168.131.129:27019'},{_id:1,host:'192.168.131.130:27019'},
{_id:2,host:'192.168.131.131:27019'}]};
rs.initiate(cfg) //使配置生效
6. 配置路由节点
由于只在129上配置 直接上图说话
7. 启动路由节点
mongos -f /opt/mongodb/route/mongodb.cf //注意 这里是mongos 不是mongod
8. 连接路由节点, 开始配置sharding
mongo 192.168.131.129:30000 //这里必须连接路由节点
sh.addShard("shard1/192.168.131.129:27017");
sh.addShard("shard2/192.168.131.130:27018");
shard1、shard2 表示 replica set 的名字 当把主节点添加到 shard 以后,会自动找到 set里的主,备,决策节点
use testdb //数据库名为testdb
sh.enableSharding("testdb") //开启数据库分片
sh.shardCollection("testdb.testcon",{"name":"hashed"}) //根据表testcon中的字段name值进行hash分配
for (var i = 1; i <= 30; i++) db.testcon.save({"name":"tom"+i,"age":i}) 在路由节点中插入30条数据
然后我们查看 不同的副本集中存了数据是否一致
可以看出结果 30条记录根据name的hash值, 存放入不同的分片中,
也就是上文中说的他们的并集就是30条记录
问题:
1. 有的人可能在连接上某一台机器执行 show dbs, show collections等命令时报错
这是因为 mongdb中默认不会让我们在slave上面操作,增删改查只能在master上,如果非要在slave上操作也是可以的,
需要到admin用户下 use admin 执行一个方法 rs.slaveOk()即可