MongoDB安装部署、集群和分片
目录
一、 Mongo安装、启动和关闭
1. MongoDB安装
下载MongoDB压缩包
解压
tar –zxvf mongodb-linux-x86_64-rhel62-3.2.4.tgz
将解压包拷贝到指定目录
Mv mongodb-linux-x86_64-rhel62-3.2.4 /usr/local/mongodb
在~/.bashrc添加export PATH=/usr/local/mongodb/bin:$PATH
创建数据库目录
Mkdir –p /data/db
2.mongoDb启动
/usr/local/mongodb/bin/mongod
3.MongoDB后台管理shell
/usr/local/mongodb/bin/mongo
4.mongoDB关闭
a.进入后台管理shell
mongo
use admin
db.shutdownServer()
b.或者直接kill -15 <pid> of mongodb
注意kill -9 可能会导致数据文件损坏
二、 MongoDB基本概念
Database:数据库, collection: 数据库表/集合, field: 数据字段/域,index: 索引,
Table joins: MongoDB不支持表连接, Primary key: 主键,MongoDB自动将_id字段设置为主键。
三、 MongoDB 数据类型
下表为MongoDB中常用的几种数据类型。
数据类型 | 描述 |
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。 |
四、 MongoDB集群部署
1.服务器分布情况
主机 | 用途 |
192.168.0.56 | 主节点(master) |
192.168.0.55 | 备节点+仲裁点(slave+arbiter) |
2.建立数据目录mkdir -p /data/mongodb/{master,slave,arbiter}
3、建立配置文件:
主节点:
vi /etc/mongodb_master.conf
#master.conf
dbpath=/data/mongodb/master
logpath=/data/mongodb/master.log
pidfilepath=/data/mongodb/master.pid
#keyFile=/data/mongodb/mongodb.key
directoryperdb=true
logappend=true
replSet=91db
bind_ip=192.168.0.56
port=27017
#auth=true
oplogSize=100
fork=true
noprealloc=true
#maxConns=4000
备节点:
vi /etc/mongodb_slave.conf
#slave.conf
dbpath=/data/mongodb/slave
logpath=/data/mongodb/slave.log
pidfilepath=/data/mongodb/slave.pid
#keyFile=/data/mongodb/mongodb.key
directoryperdb=true
logappend=true
replSet=91db
bind_ip=192.168.0.55
port=27017
#auth=true
oplogSize=100
fork=true
noprealloc=true
#maxConns=4000
仲裁点:
vi /etc/mongodb_arbiter.conf
#arbiter.conf
dbpath=/data/mongodb/arbiter
logpath=/data/mongodb/arbiter.log
pidfilepath=/data/mongodb/arbiter.pid
#keyFile=/data/mongodb/mongodb.key
directoryperdb=true
logappend=true
replSet=91db
bind_ip=192.168.0.55
port=27019
#auth=true
oplogSize=100
fork=true
noprealloc=true
#maxConns=4000
备注:
keyFile和auth选项要在集群配置好后,并且添加了验证用户后再启用
参数说明:
dbpath:存放数据目录
logpath:日志数据目录
pidfilepath:pid文件
keyFile:节点之间用于验证文件,内容必须保持一致,权限600,仅Replica Set 模式有效
directoryperdb:数据库是否分目录存放
logappend:日志追加方式存放
replSet:Replica Set的名字
bind_ip:mongodb绑定的ip地址
port:端口
auth:是否开启验证
oplogSize:设置oplog的大小(MB)
fork:守护进程运行,创建进程
moprealloc:是否禁用数据文件预分配(往往影响性能)
maxConns:最大连接数,默认2000
4、启动mongodb(可以相对路径也可以绝对路径)
/usr/local/mongodb/bin/mongod -f /etc/mongodb_master.conf
/usr/local/mongodb/bin/mongod -f /etc/mongodb_slave.conf
/usr/local/mongodb/bin/mongod -f /etc/mongodb_arbiter.conf
5、 在主节点上配置
进入mongo shell
/usr/local/mongodb/bin/mongo 192.168.0.56 #因为备节点和仲裁点在同一个机器以端口区分,所以登陆时要加上端口
>use admin
>cfg={ _id:"91db", members:[ {_id:0,host:'192.168.0.56:27017',priority:2},{_id:1,host:'192.168.0.55:27017',priority:1},{_id:2,host:'192.168.0.55:27019',arbiterOnly:true}] };
> rs.initiate(cfg)使cfg配置生效
说明:
cfg名字可选,只要跟mongodb参数不冲突,_id为Replica Set名字,members里面的优先级priority值高的为主节点,对于仲裁点一定要加上arbiterOnly:true,否则主备模式不生效
查看是否生效:
>rs.status()
91db:PRIMARY> rs.status()
{
"set" : "91db",
"date" : ISODate("2016-04-12T02:28:15.656Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.0.56:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 578056,
"optime" : {
"ts" : Timestamp(1460427578, 2),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2016-04-12T02:19:38Z"),
"electionTime" : Timestamp(1460427578, 1),
"electionDate" : ISODate("2016-04-12T02:19:38Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.0.55:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 524,
"optime" : {
"ts" : Timestamp(1460427578, 2),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2016-04-12T02:19:38Z"),
"lastHeartbeat" : ISODate("2016-04-12T02:28:14.433Z"),
"lastHeartbeatRecv" : ISODate("2016-04-12T02:28:15.374Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.0.56:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.0.55:27019",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"lastHeartbeat" : ISODate("2016-04-12T02:28:14.651Z"),
"lastHeartbeatRecv" : ISODate("2016-04-06T02:46:24.852Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
}
],
"ok" : 1
}
结果显示每个机器的信息,stateStr字段为主备仲裁节点的标志,下面会显示字样:"ok" : 1
注意:若有多个slave,再需要建立数据目录、配置文件、指定不同端口,启动它。然后在执行cfg=时把它们加进去即可,再执行rs.initiate(cfg)
五、 MongoDB 分片
分片
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据也足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
为什么使用分片
- 复制所有的写入操作到主节点
- 延迟的敏感数据会在主节点查询
- 单个副本集限制在12个节点
- 当请求量巨大时会出现内存不足。
- 本地磁盘不足
- 垂直扩展价格昂贵
MongoDB分片
下图展示了在MongoDB中使用分片集群结构分布:
上图中主要有如下所述三个主要组件:
- Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
- Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
- Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
分片实例
分片结构端口分布如下:
Shard Server 1:192.168.0.55 27020
Shard Server 2:192.168.0.55 27021
Shard Server 3:192.168.0.56 27022
Shard Server 4:192.168.0.56 27023
Shard Server 5:192.168.0.56 27024
Config Server :192.168.0.55 27100
Route Process:
1. 启动Shard Server(192.168.0.55)
创建分片数据目录和日志目录
[root@www shard]# mkdir -p /www/mongoDB/shard/s0
[root@www shard]# mkdir -p /www/mongoDB/shard/s1
[root@www shard]# mkdir -p /www/mongoDB/shard/log
启动shard server
[root@www shard]# /usr/local/mongodb/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 31103
child process started successfully, parent exiting
[root@www shard]# /usr/local/mongodb/bin/mongod --port 27021 --dbpath=/www/mongoDB/shard/s1 --logpath=/www/mongoDB/shard/log/s1.log --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 31126
child process started successfully, parent exiting
2. 启动Shard Server(192.168.0.56)
[root@testlv /]# /usr/local/mongodb/bin/mongod --port 27022 --dbpath=/www/mongoDB/shard/s2 --logpath=/www/mongoDB/shard/log/s2.log --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 11665
child process started successfully, parent exiting
[root@testlv /]# /usr/local/mongodb/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 11683
child process started successfully, parent exiting
[root@testlv /]# /usr/local/mongodb/bin/mongod --port 27024 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork
3.启动config Server
[root@www shard]# cd /www/mongoDB/shard/config/
[root@www /]#/usr/local/mongodb/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 31159
child process started successfully, parent exiting
注意:这里我们完全可以像启动普通mongodb服务一样启动,不需要添加—shardsvr和configsvr参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以。
4.启动Route Process
[root@www /]# /usr/local/mongodb/bin/mongos --port 40000 --configdb 192.168.0.55:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500
2016-04-13T17:26:19.352+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
about to fork child process, waiting until server is ready for connections.
forked process: 31181
child process started successfully, parent exiting
mongos启动参数中,chunkSize这一项是用来指定chunk的大小的,单位是MB,默认大小为200MB.
5. 配置Sharding
接下来,我们使用MongoDB Shell登录到mongos,添加Shard节点
[root@www /]# /usr/local/mongodb/bin/mongo admin --port 40000
MongoDB shell version: 3.2.4
connecting to: 127.0.0.1:40000/admin
Server has startup warnings:
2016-04-13T17:26:19.358+0800 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.
2016-04-13T17:26:19.358+0800 I CONTROL [main]
mongos> db.runCommand({addshard:"192.168.0.55:27020"})
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:"192.168.0.55:27021"})
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({addshard:"192.168.0.56:27022"})
{ "shardAdded" : "shard0002", "ok" : 1 }
mongos> db.runCommand({addshard:"192.168.0.56:27023"})
{ "shardAdded" : "shard0003", "ok" : 1 }
mongos> db.runCommand({addshard:"192.168.0.56:27024"})
{ "shardAdded" : "shard0004", "ok" : 1 }
mongos> db.runCommand({enablesharding:"test"}) #设置分片存储的数据库
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"test.log",key:{id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }
程序代码内无需太大更改,直接按照连接普通的mongo数据库那样,将数据库连接接入接口40000
标签:www,--,MongoDB,分片,shard,192.168,process,集群,mongodb From: https://blog.51cto.com/u_13360482/6992637