Step1.
mongod的主要参数有:
基本配置
--------------------------------------------------------------------------------
--quiet | # 安静输出 |
--port arg | # 指定服务端口号,默认端口27017 |
--bind_ip arg | # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP |
--logpath arg | # 指定MongoDB日志文件,注意是指定文件不是目录 |
--logappend | # 使用追加的方式写日志 |
--pidfilepath arg | # PID File 的完整路径,如果没有设置,则没有PID文件 |
--keyFile arg | # 集群的私钥的完整路径,只对于Replica Set 架构有效 |
--unixSocketPrefix arg | # UNIX域套接字替代目录,(默认为 /tmp) |
--fork | # 以守护进程的方式运行MongoDB,创建服务器进程 |
--auth | # 启用验证 |
--cpu | # 定期显示CPU的CPU利用率和iowait |
--dbpath arg | # 指定数据库路径 |
--diaglog arg | # diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads |
--directoryperdb | # 设置每个数据库将被保存在一个单独的目录 |
--journal | # 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 |
--journalOptions arg | # 启用日志诊断选项 |
--ipv6 | # 启用IPv6选项 |
--jsonp | # 允许JSONP形式通过HTTP访问(有安全影响) |
--maxConns arg | # 最大同时连接数 默认2000 |
--noauth | # 不启用验证 |
--nohttpinterface | # 关闭http接口,默认关闭27018端口访问 |
--noprealloc | # 禁用数据文件预分配(往往影响性能) |
--noscripting | # 禁用脚本引擎 |
--notablescan | # 不允许表扫描 |
--nounixsocket | # 禁用Unix套接字监听 |
--nssize arg (=16) | # 设置信数据库.ns文件大小(MB) |
--objcheck | # 在收到客户数据,检查的有效性, |
--profile arg | # 档案参数 0=off 1=slow, 2=all |
--quota | # 限制每个数据库的文件数,设置默认为8 |
--quotaFiles arg | # number of files allower per db, requires --quota |
--rest | # 开启简单的rest API |
--repair | # 修复所有数据库run repair on all dbs |
--repairpath arg | # 修复库生成的文件的目录,默认为目录名称dbpath |
--slowms arg (=100) | # value of slow for profile and console log |
--smallfiles | # 使用较小的默认文件 |
--syncdelay arg (=60) | # 数据写入磁盘的时间秒数(0=never,不推荐) |
--sysinfo | # 打印一些诊断系统信息 |
--upgrade | # 如果需要升级数据库 |
--------------------------------------------------------------------------------
--fastsync | # 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步 |
--autoresync | # 如果从库与主库同步数据差得多,自动重新同步, |
--oplogSize arg | # 设置oplog的大小(MB) |
--master | # 主库模式 |
--slave | # 从库模式 |
--source arg | # 从库 端口号 |
--only arg | # 指定单一的数据库复制 |
--slavedelay arg | # 设置从库同步主库的延迟时间 |
--------------------------------------------------------------------------------
--replSet arg | # 设置副本集名称 |
--------------------------------------------------------------------------------
--configsvr | # 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb |
--shardsvr | # 声明这是一个集群的分片,默认端口27018 |
--noMoveParanoia | # 关闭偏执为moveChunk数据保存 |
![](https://i-blog.csdnimg.cn/blog_migrate/169c12636515bca454602e5edc256dd8.png)
这里我说明下这个图所表达的意思。
- l Shard服务器:使用Replica Sets确保每个数据节点都具有备份、自动容错转移、自动恢复的能力。
-
l 配置服务器:使用使用3个配置服务器确保元数据完整性。
-
l 路由进程:使用3个路由进程实现平衡,提高客户端接入性能
-
l 3 个分片进程:Shard11,Shard12,Shard13 组成一个副本集,提供Sharding 中 shard1 的功能。
-
l 3 个分片进程:Shard21,Shard22,Shard23 组成一个副本集,提供Sharding 中 Shard2 的功能。
- l 3个配置服务器进程和3个路由器进程。
构建一个 mongoDB Sharding Cluster 需要三种角色:shard 服务器(ShardServer)、配置服务器(config Server)、路由进程(Route Process)
Shard 服务器
shard 服务器即存储实际数据的分片,每个 shard 可以是一个 mongod 实例, 也可以是一组 mongod 实例构成的 Replica Sets.为了实现每个 Shard 内部的故障 自动转换,MongoDB 官方建议每个 shard 为一组 Replica Sets.
配置服务器
为了将一个特定的 collection 存储在多个 shard 中,需要为该 collection 指定 一个 shard key,决定该条记录属于哪个 chunk,配置服务器可以存储以下信息, 每个shard节点的配置信息,每个chunk的shard key范围,chunk在各shard 的分布情况,集群中所有 DB 和 collection 的 sharding 配置信息。
路由进程
它是一个前段路由,客户端由此接入,首先询问配置服务器需要到哪个 shard 上查询或保存记录,然后连接相应的 shard 执行操作,最后将结果返回给客户端,客 户端只需要将原本发给 mongod 的查询或更新请求原封不动地发给路由进程,而 不必关心所操作的记录存储在哪个 shard 上。
按照架构图,理论上是需要 16 台机器的,由于资源有限,用目录来替代物理机(有风险,若其中某台机器宕机,配置在该机器的服务都会 down 掉)
务器 |
Host |
服务和端口 |
1 |
10.211.55.28 |
Shard11:10011 Shard21:10021 ConfigSvr:10031 Mongos:10040 |
2 |
10.211.55.28 |
Shard12:10012 Shard22:10022 ConfigSvr:10032 Mongos:10042 |
3 |
10.211.55.28 |
Shard13:10013 Shard23:10023 ConfigSvr:10033 Mongos:10043 |
环境变量
下面给出 MongoDB 的环境变量配置,输入命令并配置:
[root@mongo ~]# vi /etc/profile export MONGO_HOME=/root/mongodb-linux-x86_64-2.6.7 export PATH=$PATH:$MONGO_HOME/bin
然后保存退出,输入以下命令配置文件立即生效:
[root@mongo ~]# . /etc/profile
配置 Shard+Replica Sets
我们分别启动 Shard1 的所有进程,并设置副本集为:shard1。下面给出启动 Shard1 的脚本文件。
shard11.conf
dbpath=/mongodb/data/shard11 logpath=/mongodb/log/shard11.log pidfilepath=/mongodb/pid/shard11.pid directoryperdb=true logappend=true replSet=shard1 port=10011 fork=true shardsvr=true journal=true
shard12.conf
dbpath=/mongodb/data/shard12 logpath=/mongodb/log/shard12.log pidfilepath=/mongodb/pid/shard12.pid directoryperdb=true logappend=true replSet=shard1 port=10012 fork=true shardsvr=true journal=true
shard13.conf
dbpath=/mongodb/data/shard13 logpath=/mongodb/log/shard13.log pidfilepath=/mongodb/pid/shard13.pid directoryperdb=true logappend=true replSet=shard1 port=10013 fork=true shardsvr=true journal=true
shard21.conf
dbpath=/mongodb/data/shard21 logpath=/mongodb/log/shard21.log pidfilepath=/mongodb/pid/shard21.pid directoryperdb=true logappend=true replSet=shard2 port=10021 fork=true shardsvr=true journal=true
shard22.conf
dbpath=/mongodb/data/shard22 logpath=/mongodb/log/shard22.log pidfilepath=/mongodb/pid/shard22.pid directoryperdb=true logappend=true replSet=shard2 port=10022 fork=true shardsvr=true journal=true
shard23.conf
dbpath=/mongodb/data/shard23 logpath=/mongodb/log/shard23.log pidfilepath=/mongodb/pid/shard23.pid directoryperdb=true logappend=true replSet=shard2 port=10023 fork=true shardsvr=true journal=true
config1.conf
dbpath=/mongodb/config/config1 logpath=/mongodb/log/config1.log pidfilepath=/mongodb/pid/config1.pid directoryperdb=true logappend=true port=10031 fork=true configsvr=true journal=true
config2.conf
dbpath=/mongodb/config/config2 logpath=/mongodb/log/config2.log pidfilepath=/mongodb/pid/config2.pid directoryperdb=true logappend=true port=10032 fork=true configsvr=true journal=true
config3.conf
dbpath=/mongodb/config/config3 logpath=/mongodb/log/config3.log pidfilepath=/mongodb/pid/config3.pid directoryperdb=true logappend=true port=10033 fork=true configsvr=true journal=true
路由配置文件即为mongos 节点配置文件
- route.conf
configdb=mongo:10031,mongo:10032,mongo:10033 pidfilepath=/mongodb/pid/route.pid port=10040 chunkSize=1 logpath=/mongodb/log/route.log logappend=true fork=true
- route2.conf
configdb=mongo:10031,mongo:10032,mongo:10033 pidfilepath=/mongodb/pid/route.pid port=10042 chunkSize=1 logpath=/mongodb/log/route2.log logappend=true fork=true
- route3.conf
configdb=mongo:10031,mongo:10032,mongo:10033 pidfilepath=/mongodb/pid/route3.pid port=10043 chunkSize=1 logpath=/mongodb/log/route3.log logappend=true fork=true
注:配置文件中的目录必须存在,不存在需创建。
启动批处理
下面给出启动批处理的脚本,内容如下:
mongod -f /etc/shard11.conf mongod -f /etc/shard12.conf mongod -f /etc/shard13.conf mongod -f /etc/shard21.conf mongod -f /etc/shard22.conf mongod -f /etc/shard23.conf mongod -f /etc/config1.conf mongod -f /etc/config2.conf mongod -f /etc/config3.conf mongos -f /etc/route.conf mongos -f /etc/route2.conf mongos -f /etc/route3.conf
参数说明
dbpath:数据存放目录
logpath:日志存放路径 logappend:以追加的方式记录日志
replSet:replica set 的名字
port:mongodb 进程所使用的端口号,默认为 27017 fork:以后台方式运行进程
journal:写日志
smallfiles:当提示空间不够时添加此参数
其他参数
pidfilepath:进程文件,方便停止 mongodb directoryperdb:为每一个数据库按照数据库名建立文件夹存放 bind_ip:mongodb 所绑定的 ip 地址
oplogSize:mongodb 操作日志文件的最大大小。单位为 Mb,默认为硬盘剩余 空间的 5%
noprealloc:不预先分配存储
shardsvr:分片
configsvr:配置服务节点
configdb:配置 config 节点到 route 节点
配置分片的表和片键
首先,我们需要登录到路由节点(mongos),这里我们登录到其中一个 10040 端口下的节点。输入如下命令:
mongo mongo:10040 use admin db.runCommand({addshard:"shard1/mongo:10011,mongo:10012,mongo:10013"}) db.runCommand({addshard:"shard2/mongo:10021,mongo:10022,mongo:10023"}) db.runCommand({ listshards:1 }) #列出 shard 个数 db.runCommand({enablesharding:"friends"}); #创建 friends 库 db.runCommand( { shardcollection : "friends.user",key : {id: 1},unique : true } ) # 使用 user 表来做分片,片键为 id 且唯一
至此,整个集群的搭建完成,下面我们测试集群的高可用性。
贴出创建目录的脚本,方便搭建的时候,快速创建目录。
1
2
3
4
5
6
7
8
9
10
11
|
mkdir -p /mongodb/data/shard11
mkdir -p /mongodb/data/shard12
mkdir -p /mongodb/data/shard13
mkdir -p /mongodb/data/shard21
mkdir -p /mongodb/data/shard22
mkdir -p /mongodb/data/shard23
mkdir -p /mongodb/log
mkdir -p /mongodb/pid
mkdir -p /mongodb/config/config1
mkdir -p /mongodb/config/config2
mkdir -p /mongodb/config/config3
|
停止脚本:
1
2
3
4
5
6
7
8
9
10
11
12
|
kill -
9
$(cat /mongodb/pid/shard11.pid)
kill -
9
$(cat /mongodb/pid/shard12.pid)
kill -
9
$(cat /mongodb/pid/shard13.pid)
kill -
9
$(cat /mongodb/pid/shard21.pid)
kill -
9
$(cat /mongodb/pid/shard22.pid)
kill -
9
$(cat /mongodb/pid/shard23.pid)
kill -
9
$(cat /mongodb/pid/config1.pid)
kill -
9
$(cat /mongodb/pid/config2.pid)
kill -
9
$(cat /mongodb/pid/config3.pid)
kill -
9
$(cat /mongodb/pid/route.pid)
kill -
9
$(cat /mongodb/pid/route2.pid)
kill -
9
$(cat /mongodb/pid/route3.pid)
|