从图中可以看到有四个组件:mongos、config server、shard、replica set。
mongos:数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server:顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
shard:这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做。
我们要求是做的 6片的集群 参考上面3切片图片 数据存储 用的是内存存储盘提高速度(机器配置 32h 260GB内存)。
一,3台机器建立准备工作
yum -y install numactl vim lrzsz
mkdir -p /data/{work,app}
mkdir -p /data/work/mongodb/conf
调整存储空间大小
umount /dev/shm/
mount tmpfs /dev/shm -t tmpfs -o size=200G
[root@localhost work]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 78G 1.1G 73G 2% /
/dev/sda1 485M 31M 429M 7% /boot
/dev/sdb2 3.6T 33M 3.6T 1% /data
/dev/sda2 197G 267M 187G 1% /home
tmpfs 200G 0 200G 0% /dev/shm
cd /data/work/mongodb/
mkdir {shard1,shard2,shard3,shard4,shard5,shard6,server,mongos}
cd /dev/shm/
mkdir {shard1,shard2,shard3,shard4,shard5,shard6,server}
二启动sharding服务
wget http://10.31.67.32:8099/Download/mongodb/mongodb-linux-x86_64-rhel62-3.4.2.tgz
tar -zxvf mongodb-linux-x86_64-rhel62-3.4.2.tgz
mv mongodb-linux-x86_64-rhel62-3.4.2 /data/app/mongodb
#####开启验证需要 任意服务器产生kefile文件:
openssl rand -base64 741 > keyfile
chmod 600 keyfile
注意:要上传到集群中每一台服务器:/data/work/mongodb/mongo-keyfile
cd /data/work/mongodb/conf
吧配置文件上传
cat /data/work/mongodb/conf/shard1.conf
storage:
dbPath: /dev/shm/shard1
journal:
enabled: true
directoryPerDB: true
#syncPeriodSecs: 60
engine: wiredTiger
processManagement:
fork: true
pidFilePath: /data/work/mongodb/shard1/mongod.pid
net:
port: 27011
http:
enabled: false
systemLog:
destination: file
path: /data/work/mongodb/shard1/mongod.log
logAppend: true
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
需要用户认证则开启
###security:
## keyFile: /data/work/mongodb/mongo-keyfile
#authorization: enabled
replication:
oplogSizeMB: 20000
replSetName: rs001
每个配置文件 日志路径和存储路径 改下即可
3台机器从别启动
numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard1.conf
numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard2.conf
numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard3.conf
numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard4.conf
numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard5.conf
numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard6.conf
以上3台机器全部执行
让 主从仲裁 分别在每台机器上
host | rs001 | rs002 | rs003 | rs004 | rs005 | rs006 |
10.33.100.118 | 主 | 仲 | 从 | 主 | 仲 | 从 |
10.33.100.118 | 从 | 主 | 仲 | 从 | 主 | 仲 |
10.33.100.119 | 仲 | 从 | 主 | 仲 | 从 | 主 |
登入 端口27011 -27016
/data/app/mongodb/bin/mongo --port 27016
cfg={ _id:"rs006", members:[ {_id:0,host:'10.33.100.119:27016',priority:2}, {_id:1,host:'10.33.100.117:27016',priority:1},{_id:2,host:'10.33.100.118:27016',arbiterOnly:true}] };
rs.initiate(cfg)
rs.status()
三启动配置服务
[root@localhost ~]# cat /data/work/mongodb/conf/server.conf
storage:
dbPath: /dev/shm/server
journal:
enabled: true
directoryPerDB: true
#syncPeriodSecs: 60
engine: wiredTiger
processManagement:
fork: true
pidFilePath: /data/work/mongodb/server/mongod.pid
net:
port: 27020
http:
enabled: false
systemLog:
destination: file
path: /data/work/mongodb/server/mongod.log
logAppend: true
replication:
replSetName: configReplSet
/data/app/mongodb/bin/mongod --configsvr -f /data/work/mongodb/conf/server.conf
3台分别 配置服务启动
/data/app/mongodb/bin/mongo --port 27020
rs.initiate( {_id: "configReplSet",configsvr: true,members: [{ _id: 0, host: "10.33.100.117:27020"},{ _id: 1, host: "10.33.100.118:27020"},{ _id: 2, host: "10.33.100.119:27020"}]} )
四:3台分别路由接口
cat /data/work/mongodb/conf/mongos.conf
processManagement:
fork: true
pidFilePath: /data/work/mongodb/mongos/mongos.pid
net:
port: 27030
http:
enabled: false
systemLog:
destination: file
path: /data/work/mongodb/mongos/mongos.log
logAppend: true
sharding:
configDB: configReplSet/10.33.100.117:27020,10.33.100.118:27020,10.33.100.119:27020
#配置服务的端口和地址。
numactl --interleave=all /data/app/mongodb/bin/mongos -f /data/work/mongodb/conf/mongos.conf
至此每个机器保证8个mongodb 进程。
/data/app/mongodb/bin/mongo --port 27030
依次添加6个分片
sh.addShard("rs001/10.33.100.117:27011,10.33.100.118:27011,10.33.100.119:27011")
测试分片
sh.enableSharding("test")
sh.shardCollection("test.Log", { id: 1})
use test
for(var i = 1; i <= 100000; i++){
db.Log.save({id:i,"message":"message"+i});
}
rs.status()
db.Log.stats()
db.Log.drop()