Mongo分片配置与总结 - smile0821/learngit GitHub Wiki

分片角色

  1. 配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。 不需要太多的空间和资源,配置服务器的1KB空间相当于真实数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
  2. 路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
  3. 分片服务器。是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器

  在部署之前先明白片键的意义,一个好的片键对分片至关重要。片键必须是一个索引,数据根据这个片键进行拆分分散。通过sh.shardCollection加会自动创建索引。一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。

服务器信息

服务器两台:10.146.157.115 | 10.93.156.243

mongos:10.146.157.115:20000[mongs] | 10.93.156.243:20000[mongos]
config:10.146.157.115:21000[mongoconfig] | 10.146.157.115:21001[mongoconfig] | 10.93.156.243:21000[mongoconfig]
shard1:10.146.157.115:22001[shard1] | 10.93.156.243:22001[shard1] | 10.93.156.243:22011[shard2]
shard2:10.146.157.115:22002[shard2] | 10.93.156.243:22002[shard3] | 10.93.156.243:22012[shard4]
注:[]中是对应服务器上的文件夹名称

前期准备

10.146.157.115:
mkdir -p /u01/data/mongoDB/mongos/{log}
mkdir -p /u01/data/mongoDB/mongoconf/{data,log}
mkdir -p /u01/data/mongoDB/mongoconf2/{data,log}
mkdir -p /u01/data/mongoDB/shard1/{data,log}
mkdir -p /u01/data/mongoDB/shard2/{data,log}
10.93.156.243:
mkdir -p /u01/data/mongoDB/mongos/{log}
mkdir -p /u01/data/mongoDB/mongoconf/{data,log}
mkdir -p /u01/data/mongoDB/shard1/{data,log}
mkdir -p /u01/data/mongoDB/shard2/{data,log}
mkdir -p /u01/data/mongoDB/shard3/{data,log}
mkdir -p /u01/data/mongoDB/shard4/{data,log}

启动config

启动三个配置,在两台服务器中对应文件夹下创建,同一台服务器中启动两个的,只修改端口号 vi /u01/data/mongoDB/mongoconfig/mongoconf.conf

dbpath=/u01/data/mongoDB/mongoconfig/data  #数据路径
logpath=/u01/data/mongoDB/mongoconfig/log/mongoconf.log  #日志路径
logappend=true  #新日志不覆盖旧日志,以追加方式生成
bind_ip=0.0.0.0 #不设置时默认只能本地连接,如localhost,127.0.0.0,设置为0.0.0.0表示所有IP均可连接,后续mongos节点这个参数一定要设置,避免本地代码提示连接失败
port=21000 #端口号
maxConns=1000  #最大连接数
journal=true  #是否记录日志
journalCommitInterval=200
fork=true  #后台启动
syncdelay=60 
oplogSize=1000
configsvr=true  #配置服务器
replSet=replconf #副本集名称

三个配置服务均启动

/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/mongoconfig/mongoconf.conf /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/mongoconfig2/mongoconf.conf /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/mongoconfig/mongoconf.conf 登录任意一个进行配置服务器副本集初始化

/u01/data/mongoDB/package/bin/mongo --port 21000
>use admin
>config={_id:"replconf",members:[{_id:0,host:"10.146.157.115:21000",priority:1},{_id:1,host:"10.146.157.115:21001"},{_id:2,host:"10.93.156.243:21000"}]}
>rs.initiate(config);
>rs.status();
如果均为SECONDARY节点,强制其中的一台为PRIMARY命令如下:
cfg = rs.conf()
cfg.members[0].priority=1
rs.reconfig(cfg);

副本集statestr状态说明
STARTUP:刚加入到复制集中,配置还未加载
STARTUP2:配置已加载完,初始化状态
RECOVERING:正在恢复,不适用读
ARBITER: 仲裁者
DOWN:节点不可到达
UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构
REMOVED:移除复制集
ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步
PRIMARY:主节点
SECONDARY:备份节点

配置shard集群

shard1配置

vi /u01/data/mongoDB/shard1/shard.conf

dbpath=/u01/data/mongoDB/shard1/data
logpath=/u01/data/mongoDB/shard1/log/shard1.log
port=22001
bind_ip=0.0.0.0
#bind_ip_all=true
logappend=true
fork=true
oplogSize=4096
journal=true
shardsvr=true
replSet=shard1

三个shard1均启动 /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard1/shard.conf /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard1/shard.conf /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard2/shard.conf 登录任意一个shard1服务器配置副本集

/u01/data/mongoDB/package/bin/mongo --port 22001
use admin
shardcfg={_id:"shard1",members:[{_id:0,host:"10.146.157.115:22001"},{_id:1,host:"10.93.156.243:22001",arbiterOnly:true},{_id:2,host:"10.93.156.243:22011"}]}
rs.initiate(shardcfg);

shard2配置

vi /u01/data/mongoDB/shard2/shard.conf

dbpath=/u01/data/mongoDB/shard2/data
logpath=/u01/data/mongoDB/shard2/log/shard2.log
port=22002
bind_ip=0.0.0.0
#bind_ip_all=true
logappend=true
fork=true
oplogSize=4096
journal=true
shardsvr=true
replSet=shard2

启动shard2 /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard2/shard.conf /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard3/shard.conf /u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard4/shard.conf 配置shard2副本集

/u01/data/mongoDB/package/bin/mongo --port 22002
use admin
shardcfg={_id:"shard2",members:[{_id:0,host:"10.146.157.115:22002"},{_id:1,host:"10.93.156.243:22002",arbiterOnly:true},{_id:2,host:"10.93.156.243:22012"}]}
rs.initiate(shardcfg);

配置路由服务器

/u01/data/mongoDB/package/bin/mongos -f /u01/data/mongoDB/mongos/mongos.conf
use admin
db.runCommand({addshard:"shard1/10.146.157.115:22001,10.93.156.243:22001,10.93.156.243:22011"})
db.runCommand({addshard:"shard2/10.146.157.115:22002,10.93.156.243:22002,10.93.156.243:22012"})
db.runCommand({enablesharding:"test"});
db.runCommand({shardcollection:"test.92a095df-42f0-4190-af25-53578c049998_1_be08757f-ef1d-411b-94cf-e607e4041cc8",key : {_id:"hashed"}})

本地连接mongodb时,注意关闭防火墙

配置文件参数解释

参数 说明
--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 # 如果需要升级数据库
  • Replicaton 参数
    | 参数 | 说明 |
    |-------------------|-------------------------------:|
    | --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数据保存 | *手动预先分片
use test
for(var i=0;i<40;i++){
sh.splitAt('test.user',{_id:i*1000})
}

添加mongodb的启动停止脚本

groupadd -g 27017 mongod useradd -g 27017 -u 27017 mongod

cd /etc/init.d/
cat mongodb
#!/bin/bash
#
#chkconfig: 2345 80 90
#description: mongodb
start() {
 su - mongod -c "/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/package/mongodb.cnf"
}

stop() {
  su - mongod -c "/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/package/mongodb.cnf --shutdown"
}

case "$1" in
  start)
 start
 ;;
  stop)
 stop
 ;;
  restart)
 stop
 start
 ;;
  *)
 echo $"Usage: $0 {start|stop|restart}"
 exit 1
esac

chkconfig --add mongodb chmod +x mongodb chkconfig mongodb on

shell脚本自自启动集群

#!bin/bash
IP=$1
PORT=21000
RELCON=relconfig

if [$2 == 'reset']; then
   pkill -9 mongo
   rm -rf /u01/data/mongoDB
fi

if [$2 == 'config']; then
  mkdir -p /u01/data/mongoDB/mongoconfig/{data,log}
  mkdir -p /u01/data/mongoDB/shard1/{data,log}
  mkidr -p /u01/data/mongoDB/shard2/{data,log}
  mkdir -p /u01/data/mongoDB/shard3/{data,log}
  mkdir -p /u01/data/mongoDB/mongos/log
  
  vi /u01/data/mongoDB/mongoconfig/mongoconfig.conf <<EOF
dbpath=/u01/data/mongoDB/shard1/data
logpath=/u01/data/mongoDB/mongoconfig/log/mongoconfig.log
port=${PORT}
bind_ip=0.0.0.0
logappend=true
fork=true
oplogSize=4096
journal=true
shardsvr=true
replSet=replconf
EOF
  vi /u01/data/mongoDB/mongoconfig/shard1.conf <<EOF
...
EOF   
vi /u01/data/mongoDB/mongoconfig/shard2.conf <<EOF
...
EOF 
vi /u01/data/mongoDB/mongoconfig/shard3.conf <<EOF
...
EOF
vi /u01/data/mongoDB/mongoconfig/momgos.conf <<EOF
...
EOF 

/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/mongoconfig/mongoconfig.conf
/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard1/shard.conf
/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard2/shard.conf
/u01/data/mongoDB/package/bin/mongod -f /u01/data/mongoDB/shard3/shard.conf
fi

非正常关闭后如何恢复

  1. 删除数据路径下的.lock文件
  2. 输入命令mongd --repair
  3. 重启mongoDB

https://www.cnblogs.com/zhanjindong/archive/2013/04/12/3017387.html#top

⚠️ **GitHub.com Fallback** ⚠️