方案改型成,如下:
四个组件:mongos、config server、shard、replica set
mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。
Shard,和大数据存储HDFS分片存储的思想的东西。
Replica set,副本集服务器。
准备环境:
ip:192.168.2.30
ip:192.168.2.33
ip:192.168.2.36
在每台机器上建立mongos、config、shard1、shard2、shard3五个目录。
#建立mongos目录
mkdir -p /home/mongodbtest/mongos
#建立config server 数据文件存放目录
mkdir -p /home/mongodbtest/config/data
#建立config server 日志文件存放目录
mkdir -p /home/mongodbtest/config/log
#建立config server 日志文件存放目录
mkdir -p /home/mongodbtest/mongos/log
#建立shard1 数据文件存放目录
mkdir -p /home/mongodbtest/shard1/data
#建立shard1 日志文件存放目录
mkdir -p /home/mongodbtest/shard1/log
#建立shard2 数据文件存放目录
mkdir -p /home/mongodbtest/shard2/data
#建立shard2 日志文件存放目录
mkdir -p /home/mongodbtest/shard2/log
#建立shard3 数据文件存放目录
mkdir -p /home/mongodbtest/shard3/data
#建立shard3 日志文件存放目录
mkdir -p /home/mongodbtest/shard3/log
6)规划5个组件对应的端口号,由于一个机器需要同时部署mongos、configserver 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以自由定义,在本文mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.
参数说明:
dbpath:数据存放目录 logpath:日志存放路径logappend:以追加的方式记录日志 replSet:replica set 的名字 port:mongodb 进程所使用的端口号,默认为 27017 fork:以后台方式运行进程
journal:写日志 smallfiles:当提示空间不够时添加此参数 其他参数 pidfilepath:进程文件,方便停止 mongodbdirectoryperdb:为每一个数据库按照数据库名建立文件夹存放bind_ip:mongodb 所绑定的 ip 地址 oplogSize:mongodb 操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的 5% noprealloc:不预先分配存储 shardsvr:分片 configsvr:配置服务节点 configdb:配置 config 节点到 route 节点
7)在每台机器上启动配置服务器
/home/mongodb/bin/mongod --configsvr--replSetphReplSet --dbpath /home/mongodbtest/config/data --port21000 --logpath /home/mongodbtest/config/log/config.log --fork
连接到任意一台配置服务器上
/home/mongodb/bin/mongo --host 192.168.2.36 --port 21000
创建配置服务器副本集
rs.initiate({_id:"phReplSet",configsvr:true,members:[{_id:0,host:"192.168.2.30:21000"},{_id:1,host:"192.168.2.33:21000"},{_id:2,host:"192.168.2.36:21000"}]})
配置各个分片的副本集
#在每个机器里分别设置分片1服务器及副本集shard1
/home/mongodb/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /home/mongodbtest/shard1/data --logpath /home/mongodbtest/shard1/log/shard1.log --fork -nojournal
#在每个机器里分别设置分片2服务器及副本集shard2
/home/mongodb/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /home/mongodbtest/shard2/data --logpath /home/mongodbtest/shard2/log/shard2.log --fork -nojournal
#在每个机器里分别设置分片3服务器及副本集shard3
/home/mongodb/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /home/mongodbtest/shard3/data --logpath /home/mongodbtest/shard3/log/shard3.log --fork -nojournal
任意登陆一个机器,比如登陆192.168.2.36,连接mongodb
注意"arbiterOnly" : true 可以设置仲裁节点
如{_id:2,host:"192.168.2.36:22001","arbiterOnly" : true }
#设置第一个分片副本集/home/mongodb/bin/mongo 192.168.2.36:22001
> use admin;
switched to db admin
#定义副本集配置 并初始化>rs.initiate({_id:"shard1",members:[{_id:0,host:"192.168.2.30:22001"},{_id:1,host:"192.168.2.33:22001"},{_id:2,host:"192.168.2.36:22001"}]})
#设置第二个分片副本集/home/mongodb/bin/mongo 192.168.2.36:22002
> use admin;
switched to db admin
#定义副本集配置 并初始化>rs.initiate({_id:"shard2",members:[{_id:0,host:"192.168.2.30:22002"},{_id:1,host:"192.168.2.33:22002"},{_id:2,host:"192.168.2.36:22002"}]})
#设置第三个分片副本集/home/mongodb/bin/mongo 192.168.2.36:22003
> use admin;
switched to db admin
#定义副本集配置 并初始化>rs.initiate({_id:"shard3",members:[{_id:0,host:"192.168.2.30:22003"},{_id:1,host:"192.168.2.33:22003"},{_id:2,host:"192.168.2.36:22003"}]})
选择一台服务器启动mongos路由服务。(每台)
/home/mongodb/bin/mongos --configdb phReplSet/192.168.2.30:21000,192.168.2.33:21000,192.168.2.36:21000 --port 20000 --logpath /home/mongodbtest/mongos/log/mongos.log --fork
登录路由服务客户端
/home/mongodb/bin/mongo--host 192.168.2.36 --port 20000
添加分片到集群
sh.addShard("shard1/192.168.2.30:22001,192.168.2.33:22001,192.168.2.36:22001")
sh.addShard("shard2/192.168.2.30:22002,192.168.2.33:22002,192.168.2.36:22002")
sh.addShard("shard3/192.168.2.30:22003,192.168.2.33:22003,192.168.2.36:22003")
Enable Sharding for a Database
sh.enableSharding("test")
Shard a Collection
sh.shardCollection("test.Log",{ id: 1}) 我用了sh.shardCollection("test.Log",{ id: “hash”})
8、测试
use test
for(var i = 1; i <=100000; i++){
db.Log.save({id:i,"message":"message"+i});
}
mongos> for(var i = 1; i <= 100000;i++){
... db.Log.save({id:i,"message":"message"+i});
... }
WriteResult({ "nInserted" : 1 })
mongos> db.Log.stats()
查看分片服务器配置
db.runCommand({listshards : 1 });
察看进程
ps –ef|grep mongo
另一类为分片集群,用下面方式查看状况: 登陆mongos mongos>printShardingStatus()
分块大小设置
登入mongos
use config
db.settings.save( { _id:"chunksize", value: 1 } ) //value 的单位MB
查看分块大小db.settings.find()
分块详细信息 db.chunks.find()
生成keyfile
openssl rand –base64 753 > keyFile
给keyFile文件设置600权限(必须设置600权限):
chmod 600 keyFile
注意:分片中所有的keyfile 多必须为同一个,当初被坑了....
建用户
db.createUser(
... {
... user: "dba",
... pwd: "dba",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
//这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
mongod
#!/bin/sh
#
#mongod - Startup script for mongod
#
# chkconfig: - 85 15
# description: Mongodb database.
# processname: mongod
# Source function library
. /etc/rc.d/init.d/functions
# things from mongod.conf get there by mongod reading it
# OPTIONS
OPTIONS="-f /home/mongodb/data/mongodb.conf"
#mongod
mongod="/home/mongodb/bin/mongod"
#CONFIG
CONFIG="-f /home/mongodbtest/config/config.conf"
#shard1
shard1="-f /home/mongodbtest/config/shard1.conf"
#shard2
shard2="-f /home/mongodbtest/config/shard2.conf"
#shard3
shard3="-f /home/mongodbtest/config/shard3.conf"
#MONGOS
MONGOS=/home/mongodb/bin/mongos
#mongos
mongos="-f /home/mongodbtest/config/mongos.conf"
start()
{
echo -n $"Starting mongod: "
daemon $mongod $OPTIONS
echo -n $"Starting config: "
daemon $mongod $CONFIG
echo -n $"Starting shard1: "
daemon $mongod $shard1
echo -n $"Starting shard2: "
daemon $mongod $shard2
echo -n $"Starting shard3: "
daemon $mongod $shard3
echo -n $"Starting mongos: "
daemon $MONGOS $mongos
RETVAL=$?
}
stop()
{
echo -n $"Stopping mongos: "
killall mongos
echo -n $"Stopping mongod: "
killproc $mongod -QUIT
RETVAL=$?
}
restart () {
stop
start
}
ulimit -n 12000
RETVAL=0
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload|force-reload)
restart
;;
condrestart)
[ -f $lockfile ] && restart || :
;;
status)
status $mongod
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
RETVAL=1
esac
exit $RETVAL