Mongo分片配置与总结 - smile0821/learngit GitHub Wiki
- 配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。 不需要太多的空间和资源,配置服务器的1KB空间相当于真实数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
- 路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
- 分片服务器。是一个独立普通的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}
启动三个配置,在两台服务器中对应文件夹下创建,同一台服务器中启动两个的,只修改端口号 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:备份节点
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);
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})
}
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
#!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
- 删除数据路径下的.lock文件
- 输入命令mongd --repair
- 重启mongoDB
https://www.cnblogs.com/zhanjindong/archive/2013/04/12/3017387.html#top