mongo 分片+副本集配置

方案改型成,如下:

 

四个组件:mongosconfig servershardreplica 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

 

在每台机器上建立mongosconfigshard1shard2shard3五个目录。

#建立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. 备份恢复角色:backuprestore
    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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值