环境
IP | Instance |
192.168.65.129 | mongos(30000) config(27017) shard1主节点(40001) shard2仲裁节点(40002) shard3副节点(40003) |
192.168.65.130 | mongos(30000) config(27017) shard1副节点(40001) shard2主节点(40002) shard3仲裁节点(40003) |
192.168.65.131 | mongos(30000) config(27017) shard1仲裁节点(40001) shard2副节点(40002) shard3主节点(40003) |
3台机,每台机5个实例,分别mongos 1 个,config server 1 个,shard server 3 个
创建想应目录
mkdir -p /mongodb/{data,logs,apps}
mkdir -p /mongodb/data/shard{1,2,3}
mkdir -p /mongodb/data/config
创建用户及修改权限
/usr/sbin/groupadd -g 10001 mongodb
/usr/sbin/useradd -u 10001 -g mongodb mongodb
id mongodb
passwd mongodb
chown -R mongodb:mongodb /mongodb
chmod 775 /mongodb
配置 config 配置服务器
配置文件(3 个节点都一样,无需改动):
vi /mongodb/apps/mongodb/bin/mongodb-config.conf
dbpath=/mongodb/data/config
logpath=/mongodb/logs/mongodb-config.log
port=27017
fork=true
journal=true
maxConns=500
logappend=true
pidfilepath=/tmp/mongo-config.pid
directoryperdb=true
replSet=tyconfig
configsvr=true
bind_ip=0.0.0.0
启动config实例
3台机
mongod --config /mongodb/apps/mongodb/bin/mongodb-config.conf
创建复制集
连接一个实例
mongo 192.168.65.129:27017
config={_id:"tyconfig",members:[
{_id:0,host:"192.168.65.129:27017"},
{_id:1,host:"192.168.65.130:27017"},
{_id:2,host:"192.168.65.131:27017"},
]}
这个 tyconfig 名字一定要和config 配置文件中 replSet 的名字一致
初始化复制集
rs.initiate(config)
检查状态
rs.status()
复制集配完后,可能状态不会马上改变(可能都是secondary),过几秒就会自动更新
部署和管理分片服务器
部署shard1分片服务器
vi /mongdb/apps/mongodb/bin/mongodb-shard1.conf
dbpath=/mongodb/data/shard1
logpath=/mongodb/logs/mongodb-shard1.log
port=40001
fork=true
#auth=true
#noauth=true
#verbose=true
#vvvv=true
journal=true
maxConns=500
logappend=true
directoryperdb=true
pidfilepath=/tmp/mongo_27018.pid
#cpu=true
#nohttpinterface=false
#notablescan=false
#profile=0
#slowms=200
#quiet=true
#syncdelay=60
replSet=tyshard1
bind_ip=0.0.0.0
shardsvr=true
将此文件copy到另外2台机器
scp /mongodb/apps/mongodb/bin/mongodb-shard1.conf mongodb@192.168.65.130:/mongodb/apps/mongodb/bin/
scp /mongodb/apps/mongodb/bin/mongodb-shard1.conf mongodb@192.168.65.131:/mongodb/apps/mongodb/bin/
启动3台shard1实例
mongod --config /mongodb/apps/mongodb/bin/mongodb-shard1.conf
连接一个实例
mongo 192.168.65.129:40001
创建复制集
use admin
config={_id:"tyshard1",members:[
{_id:0,host:"192.168.65.129:40001",priority:2},
{_id:1,host:"192.168.65.130:40001",priority:1},
{_id:2,host:"192.168.65.131:40001",arbiterOnly:true},
]}
这个 tyshard1名字一定要和 shard1配置文件中 replSet 的名字一致
初始化复制集
rs.initiate(config)
检查状态
rs.status()
复制集配完后,可能状态不会马上改变(可能都是secondary),过几秒就会自动更新
部署shard2分片服务器
将shard1的配置文件copy一份,修改其中的端口、路径及复制集名称。然后copy给另外2台主机
启动实例
mongod --config /mongodb/apps/mongodb/bin/mongodb-shard2.conf
连接第二个节点创建复制集(为什么是连接第二个,因为规划的shard 的仲裁节点是129:40002,仲裁节点不能写数据,所以这里不能连129,要连130)
mongo 192.168.65.130:40002
use admin
config={_id:"tyshard2",members:[
{_id:0,host:"192.168.65.129:40002",arbiterOnly:true},
{_id:1,host:"192.168.65.130:40002",priority:2},
{_id:2,host:"192.168.65.131:40002",priority:1},
]}
这个 tyshard1名字一定要和 shard1配置文件中 replSet 的名字一致
初始化复制集
rs.initiate(config)
检查状态
rs.status()
复制集配完后,可能状态不会马上改变(可能都是secondary),过几秒就会自动更新
部署shard3分片服务器
将shard1的配置文件copy一份,修改其中的端口、路径及复制集名称。然后copy给另外2台主机
启动实例
mongod --config /mongodb/apps/mongodb/bin/mongodb-shard3.conf
连接第二个节点创建复制集(为什么是连接第二个,因为规划的shard 的仲裁节点是129:40002,仲裁节点不能写数据,所以这里不能连129,要连130)
mongo 192.168.65.129:40003
use admin
config={_id:"tyshard3",members:[
{_id:0,host:"192.168.65.129:40003",priority:1},
{_id:1,host:"192.168.65.130:40003",arbiterOnly:true},
{_id:2,host:"192.168.65.131:40003",priority:2},
]}
这个 tyshard1名字一定要和 shard1配置文件中 replSet 的名字一致
初始化复制集
rs.initiate(config)
检查状态
rs.status()
复制集配完后,可能状态不会马上改变(可能都是secondary),过几秒就会自动更新
创建路由实例
vi /mongodb/apps/mongodb/bin/mongodb-route.conf
pidfilepath=/mongodb/apps/mongo-route.pid
logpath=/mongodb/logs/mongodb-route.log
port=30000
fork=true
maxConns=5000
logappend=true
bind_ip=0.0.0.0
configdb=tyconfig/192.168.66.129:27017,192.168.66.130:27017,192.168.66.121:27017
并传入另外2台机器
scp /mongodb/apps/mongodb/bin/mongodb-route.conf mongodb@192.168.65.130://mongodb/apps/mongodb/bin/
scp /mongodb/apps/mongodb/bin/mongodb-route.conf mongodb@192.168.65.131://mongodb/apps/mongodb/bin/
启动路由实例
mongos --config /mongodb/apps/mongodb/bin/mongodb-route.conf
启用分片功能
登陆路由节点
mongo 192.168.65.129:30000
use admin
sh.addShard("tyshard1/192.168.65.129:40001,192.168.65.130:40001,192.168.65.131:40001")
sh.addShard("tyshard2/192.168.65.129:40002,192.168.65.130:40002,192.168.65.131:40002")
sh.status()
测试服务器分片功能
use config
db.settings.save({"_id":"chunksize","value":1})
模拟写入数据
在tydb库的tyuser表中循环写入6万条数据
use tydb
show collections
for(i=1;i<=60000;i++){db.tyuser.insert({"id":i,"name":"ty"+i})}
启用数据库分片
sh.enableSharding("tydb")
围标创建的索引
db.tyuser.createIndex({"id":1})
启用表分片
sh.shardCollection(”tydb.tyuser",{"id":1})
查看分片情况
sh.status()
手动添加分片服务器
mongo 192.168.65.129:30000
use admin
sh.addShard("tyshard3/192.168.65.129:40003,192.168.65.130:40003,192.168.65.131:40003")
sh.status()
服务器又对数据进行重新分片,当你再次移除一个分片服务器,此时又会对数据再次进行分片
use tydb
db.tydb.stats()
其他
开启平衡器
use admin sh.startBalance()
或者
sh.setBalancerState(true)
关闭平衡器
use admin
sh.stopBalancer()
或者
sh.setBalancerState(false)
.查看是否关闭,返回flase表示平衡器已关闭,还需要查询均衡器正在运行的 情况
sh.getBalancerState()
删除分片服务器
1.执行RemoveShard命令
db.runCommand({removeshard:"tyshard3"})
2.查看迁移状态
我们可以反复执行上面语句,查看执行结果。
db.runCommand({removeshard:"tyshard3"})
3.移出非Shard数据
db.runCommand({movePrimary:"tydb",to:"tyshard1"})
4.最后的清理
上面步骤都完成后,还需要在执行一次RemoveShard,清理残余数据。
db.runCommand({removeshard:"mongodb0"})
如果要移除的分片正好是某一个表的primary,就会报错无法移除,那么就先进行如下操作
db.runCommand({moveprimary:"tydb",to:"tyshard1"})