一、目标机器
操作系统:Centos7.0
服务器分配
二、依赖安装
三、下载安装包mongodb
进入mongodb官网下载页面:https://www.mongodb.com/try/download,选择自己需要的版本:
四、部署mongodb
解压并重命名(在一台上面操作)
将安装包解压到/usr/local目录下,并更改为mongodb
tar -xvf mongodb-linux-x86_64-rhel70-5.0.3.tgz -C /usr/local/
cd /usr/local
mv mongodb-linux-x86_64-rhel70-5.0.3 mongodb
新建相关目录(在一台上面操作)
进入/usr/local/mongodb,新建目录
mkdir keymkdir -p route/{data,pid,log} mkdir -p config/{data,pid,logs} mkdir -p shard1/{data,pid,log} mkdir -p shard2/{data,pid,log} mkdir -p shard3/{data,pid,log}
配置文件
配置服务器:config/config.conf
vi /usr/local/mongodb/config/config.conf 指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录 启动mongod时就会在数据目录中创建mongod.lock文件,防止其他mongod进程使用该数据目录 dbpath=/usr/local/mongodb/config/data 日志文件存放目录 logpath=/usr/local/mongodb/config/logs/config.log 进程存放目录 pidfilepath=/usr/local/mongodb/config/pid/config.pid 一个数据库一个文件夹 directoryperdb=true 使用追加的方式写日志 logappend=true 集群名字#这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了 replSet=config 指定服务器监听的端口,默认是27017port=21000 #以守护进程的方式运行 MongoDBfork=trueconfigsvr=true 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 journal=true 不启动认证 #noauth=true 启动认证 #auth=true
配置路由服务器:/route/route.conf
vi /usr/local/mongodb/route/route.conf 设定config server的地址列表,每个server地址之间以“,”分割 configdb=config/192.168.0.166:21000,192.168.0.218:21000,192.168.0.130:21000 进程存放目录 pidfilepath=/usr/local/mongodb/route/pid/route.pid 指定服务器监听的端口,默认是27017 port=20000 sharded集群中每个chunk的大小,单位:MB,默认为64 #chunkSize=1 日志文件存放目录 logpath=/usr/local/mongodb/route/log/route.log 使用追加的方式写日志 logappend=true 以守护进程的方式运行fork=true
配置shard服务器:
shard1/shard1.conf vi /usr/local/mongodb/shard1/shard1.conf 指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录 dbpath=/usr/local/mongodb/shard1/data 日志文件存放目录 logpath=/usr/local/mongodb/shard1/log/shard1.log 进程存放目录pidfilepath=/usr/local/mongodb/shard1/pid/shard1.pid 一个数据库一个文件夹 directoryperdb=true 使用追加的方式写日志 logappend=true 集群名字 这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了 replSet=shard1 指定服务器监听的端口,默认是27017 port=22001 以守护进程的方式运行 MongoDBfork=true 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 journal=true 此实例为shard(分片),侦听27018端口 shardsvr=true
shard2/shard2.conf vi /usr/local/mongodb/shard2/shard2.conf 指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录 dbpath=/usr/local/mongodb/shard2/data 日志文件存放目录 logpath=/usr/local/mongodb/shard2/log/shard2.log 进程存放目录 pidfilepath=/usr/local/mongodb/shard2/pid/shard2.pid 一个数据库一个文件夹directoryperdb=true 使用追加的方式写日志 logappend=true 集群名字 这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了 replSet=shard2 指定服务器监听的端口,默认是27017 port=22002 以守护进程的方式运行 MongoDBfork=true 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 journal=true 此实例为shard(分片),侦听27018端口 shardsvr=true
shard3/shard3.conf vi /usr/local/mongodb/shard3/shard3.conf 指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录 dbpath=/usr/local/mongodb/shard3/data 日志文件存放目录 logpath=/usr/local/mongodb/shard3/log/shard3.log 进程存放目录 pidfilepath=/usr/local/mongodb/shard3/pid/shard3.pid 一个数据库一个文件夹 directoryperdb=true 使用追加的方式写日志 logappend=true 集群名字 这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了 replSet=shard3 指定服务器监听的端口,默认是27017 port=22003 以守护进程的方式运行 MongoDBfork=true 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 journal=true 此实例为shard(分片),侦听27018端口 shardsvr=true
将同样的配置分发到其他节点上
将mongodb 整个目录拷贝到其他2个节点上:
cd /usr/local
scp -r mongodb/ root@192.168.0.218:/usr/local/
scp -r mongodb/ root@192.168.0.130:/usr/local/
配置环境变量(3台都需要配置)
vi /etc/profile 最后添加内容:
#mongodb
MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:${MONGODB_HOME}/bin
使其生效:
source /etc/profile
启动3台的config server(3台分别执行)
mongod -f /usr/local/mongodb/config/config.conf
登录任意一台,初始化副本集
登录:mongo --host 192.168.0.166 --port 21000
use admin
db.runCommand({"replSetInitiate":{"_id":"config","members":[{"_id":0,"host":"192.168.166:21000"},{"_id":1,"host":"192.168.0.218:21000"},{"_id":2,"host":"192.168.0.130:21000"}]}});
查看副本集配置:
rs.conf()
查看副本集状态:
rs.status()
创建分片副本集
i. 第一个分片副本集shard1(3台分别启动)
mongod -f /usr/local/mongodb/shard1/shard1.conf
登录任意一台,初始化第一个分片副本集:
$ mongo --host 192.168.0.166 --port 22001
> use admin
> db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{"_id":0,"host":"192.168.0.166:22001",priority:10},{"_id":1,"host":"192.168.0.218:22001",priority:8},{"_id":2,"host":"192.168.0.130:22001",arbiterOnly:true}]}});
ii. 第一个分片副本集shard2(3台分别启动)
mongod -f /usr/local/mongodb/shard2/shard2.conf
登录任意一台,初始化第二个分片副本集:
$ mongo --host 192.168.0.218 --port 22002
> use admin
> db.runCommand({"replSetInitiate":{"_id":"shard2","members":[{"_id":0,"host":"192.168.0.166:22002",arbiterOnly:true},{"_id":1,"host":"192.168.0.218:22002",priority:10},{"_id":2,"host":"192.168.0.130:22002",priority:8}]}});
iii. 第一个分片副本集shard3(3台分别启动)
mongod -f /usr/local/mongodb/shard3/shard3.conf
$ mongo --host 192.168.0.130 --port 22003
> use admin
> db.runCommand({"replSetInitiate":{"_id":"shard3","members":[{"_id":0,"host":"192.168.0.166:22003",priority:8},{"_id":1,"host":"192.168.0.218:22003",arbiterOnly:true},{"_id":2,"host":"192.168.0.130:22003",priority:10}]}});
配置路由服务器mongos
首先确定配置服务器和分片服务器启动成功后,启动路由服务器(3台分别启动)
mongos -f /usr/local/mongodb/route/route.conf
启用分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登录任意一台mongos
$ mongo --host 192.168.0.130 --port 20000
使用admin数据库
> use admin
串联路由服务器与分片副本集
>db.runCommand({addshard:"shard1/192.168.0.166:22001,192.168.0.218:22001,192.168.0.130:22001"})
>db.runCommand({addshard:"shard2/192.168.0.166:22002,192.168.0.218:22002,192.168.0.130:22002"})
>db.runCommand({addshard:"shard3/192.168.0.166:22003,192.168.0.218:22003,192.168.0.130:22003"})
查看集群状态
sh.status()
查看分片服务器的配置
db.runCommand({ listshards:1 })
测试
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
连接数据库
mongo --host 192.168.0.166 --port 20000
创建emqx库,指定emqx分片生效
show dbs;
use admin
db.runCommand({enablesharding:"emqx"})
使用emqx里的test表来做分片,片键为id且唯一,指定数据库里分片的集合和片键
db.runCommand({shardcollection:"emqx.test",key:{id:1},unique : true })
注意:设置friends的 user表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
批量导入一笔数据
use emqx;
show collections;
for (var i = 1; i <= 1000000; i++) db.test.save({id:i, name:"weiyang", addr:"Beijing", country:"China"});
查看集合test数据的条数
db.test.count()
验证集合test分片
db.test.stats()
删除分片和数据库(可选、额外)
删除分片表
1. use emqx
2. db.test.drop()
3. use config
4. db.collections.remove({_id:"emqx.test"})
5. db.locks.remove( { _id: "emqx.test" } )
删除数据库
use config
db. databases.remove( { _id: "emqx" } )
db.locks.remove( { _id: "emqx" } )
刷新数据库
use admin
db.adminCommand("flushRouterConfig")
集群安全
key 生成
生成autokey密钥,然后分发到其他两台节点上:
cd /usr/local/mongodb/key/
openssl rand -base64 753 >autokey
chmod 600 autokey
scp autokey root@192.168.0.218:/usr/local/mongodb/key/
scp autokey root@192.168.0.130:/usr/local/mongodb/key/
配置文件修改
分别修改 机器166、218、 130所对应配置, shard 1-3(分片) 、config(配置)、route(路由,不加auth=true)下对对应的文件夹下 添加 keyFile 所对应路径:
添加一下信息:
keyFile= /usr/local/mongodb/key/autokey
auth=true
增加权限
use admin
db.createUser({user:"admin",pwd:"admin",roles:["userAdminAnyDatabase"]})
针对emqx 数据库增加用户:emqx;密码:emqx;
use emqx
db.createUser({user:"emqx",pwd:"emqx",roles:["readWrite"]})
五、启停操作
mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos
1. 3台分别启动:
i. mongod -f /usr/local/mongodb/config/config.conf
ii. mongod -f /usr/local/mongodb/shard1/shard1.conf
mongod -f /usr/local/mongodb/shard2/shard2.conf
mongod -f /usr/local/mongodb/shard3/shard3.conf
iii. mongos -f /usr/local/mongodb/route/route.conf
2. 3台分别停止命令:ps -ef|grep mongod|grep -v grep |awk '{print $2}'|xargs kill