1.博客教程
https://www.jb51.net/article/167276.htm
2.镜像下载:
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-v3.4-latest.tgz
防火墙:
service iptables status
yum install -y iptables
yum update iptables
yum install iptables-services
systemctl stop firewalld
systemctl mask firewalld
iptables -L -n
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
service iptables save
systemctl enable iptables.service
systemctl start iptables.service
systemctl status iptables.service
service iptables save
service iptables reload
iptables -L -n
3. 端口规划:
replica server
第一个副本集rs1
share1 127.0.0.1:30011:/data/share_rs/share_rs1/share1/data/
share2 127.0.0.1:40011:/data/share_rs/share_rs1/share2/data/
share3 127.0.0.1:50011:/data/share_rs/share_rs1/share3/data/
第二个副本集rs2
share1 127.0.0.1:30012:/data/share_rs/share_rs2/share1/data/
share2 127.0.0.1:40012:/data/share_rs/share_rs2/share2/data/
share3 127.0.0.1:50012:/data/share_rs/share_rs2/share3/data/
第三个副本集rs3
share1 127.0.0.1:30013:/data/share_rs/share_rs3/share1/data/
share2 127.0.0.1:40013:/data/share_rs/share_rs3/share2/data/
share3 127.0.0.1:50013:/data/share_rs/share_rs3/share3/data/
config server
config1 127.0.0.1:30002:/data/share_rs/config/config1/data/
config2 127.0.0.1:40002:/data/share_rs/config/config2/data/
config3 127.0.0.1:50002:/data/share_rs/config/config3/data/
mongos prox server
mongos1 127.0.0.1:30001:/data/share_rs/mongos/mongos1/data/
mongos2 127.0.0.1:40001:/data/share_rs/mongos/mongos2/data/
mongos3 127.0.0.1:50001:/data/share_rs/mongos/mongos3/data/
配置MongoDB环境变量:
vi /etc/profile
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
保存后,重启系统配置
source /etc/profile
启动三台服务器的config server
mongod -f /data/share_rs/config/config1/mongo.conf
mongod -f /data/share_rs/config/config2/mongo.conf
mongod -f /data/share_rs/config/config3/mongo.conf
登录任意一台配置服务器,初始化配置副本集
#连接
mongo --port 30002
连接不上的话:
1)到控制台放开所有端口
2)重置iptables,并放开所有
#config变量
rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:"127.0.0.1:30002"},{_id:1,host:"127.0.0.1:40002"},{_id:2,host:"127.0.0.1:50002"}]})
其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 为三个节点的 ip 和 port
启动各个分片以及相应的副本
mongod -f /data/share_rs/share_rs1/share1/mongo.conf
mongod -f /data/share_rs/share_rs1/share2/mongo.conf
mongod -f /data/share_rs/share_rs1/share3/mongo.conf
mongod -f /data/share_rs/share_rs2/share1/mongo.conf
mongod -f /data/share_rs/share_rs2/share2/mongo.conf
mongod -f /data/share_rs/share_rs2/share3/mongo.conf
mongod -f /data/share_rs/share_rs3/share1/mongo.conf
mongod -f /data/share_rs/share_rs3/share2/mongo.conf
mongod -f /data/share_rs/share_rs3/share3/mongo.conf
设置副本集
mongo --port 30011
第一个副本集rs1
rs.initiate({_id:"rs1",members:[{_id:0,host:"127.0.0.1:30011"},{_id:1,host:"127.0.0.1:40011"},{_id:2,host:"127.0.0.1:50011"}]})
mongo --port 30012
第一个副本集rs2
rs.initiate({_id:"rs2",members:[{_id:0,host:"127.0.0.1:30012"},{_id:1,host:"127.0.0.1:40012"},{_id:2,host:"127.0.0.1:50012"}]})
mongo --port 30013
第一个副本集rs3
rs.initiate({_id:"rs3",members:[{_id:0,host:"127.0.0.1:30013"},{_id:1,host:"127.0.0.1:40013"},{_id:2,host:"127.0.0.1:50013"}]})
依次启动三体mongos服务器
mongos -f /data/share_rs/mongos/mongos1/mongo.conf
mongos -f /data/share_rs/mongos/mongos2/mongo.conf
mongos -f /data/share_rs/mongos/mongos3/mongo.conf
5、启用分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登录任意一台路由服务器
mongo --port 30001
#使用admin数据库
use admin;
#串联路由服务器与分配副本集
sh.addShard("rs1/127.0.0.1:30011,127.0.0.1:40011,127.0.0.1:50011")
sh.addShard("rs2/127.0.0.1:30012,127.0.0.1:40012,127.0.0.1:50012")
sh.addShard("rs3/127.0.0.1:30013,127.0.0.1:40013,127.0.0.1:50013")
#查看集群状态
sh.status()
6.springboot连接shard集群
1)无用户名密码,只能连接admin数据库进行操作
spring.data.mongodb.uri=mongodb://127.0.0.1:30002,127.0.0.1:40002,127.0.0.1:50002/admin
其他数据库会报错:
can't create user databases on a --configsvr instance
2)
(1) configserver集群
#主节点操作
mongo --port 30001
use admin
db.createUser({user:"root", pwd:"pwd123", roles:[{role: "root", db:"admin" }]}) #root账号(超级管理员)
use admin
db.createUser({user:"admin", pwd:"pwd123", roles:[{role: "userAdminAnyDatabase", db:"admin" }]}) #管理员账号
use admin
db.createUser({user:"clusteradmin", pwd:"pwd123", roles:[{role: "clusterAdmin", db:"admin" }]}) #集群管理账号
(2) sharding集群的主节点(sharding节点设置,主要用于单独登陆分片节点的副本集集群时使用,业务库的账号,在mongos上建立即可)
是否是主节点,登录进去看是否显示是primary即可;
mongo --port 30011
use admin
db.createUser({user:"root", pwd:"pwd123", roles:[{role: "root", db:"admin" }]}) #root账号(超级管理员)
use admin
db.createUser({user:"admin", pwd:"pwd123", roles:[{role: "userAdminAnyDatabase", db:"admin" }]}) #管理员账号
use admin
db.createUser({user:"clusteradmin", pwd:"pwd123", roles:[{role: "clusterAdmin", db:"admin" }]}) #集群管理账号
mongo --port 30012
use admin
db.createUser({user:"root", pwd:"pwd123", roles:[{role: "root", db:"admin" }]}) #root账号(超级管理员)
use admin
db.createUser({user:"admin", pwd:"pwd123", roles:[{role: "userAdminAnyDatabase", db:"admin" }]}) #管理员账号
use admin
db.createUser({user:"clusteradmin", pwd:"pwd123", roles:[{role: "clusterAdmin", db:"admin" }]}) #集群管理账号
mongo --port 30013
use admin
db.createUser({user:"root", pwd:"pwd123", roles:[{role: "root", db:"admin" }]}) #root账号(超级管理员)
use admin
db.createUser({user:"admin", pwd:"pwd123", roles:[{role: "userAdminAnyDatabase", db:"admin" }]}) #管理员账号
use admin
db.createUser({user:"clusteradmin", pwd:"pwd123", roles:[{role: "clusterAdmin", db:"admin" }]}) #集群管理账号
8.修改各个节点配置文件中认证相关配置
创建秘钥文件:
openssl rand -base64 64 > mongodb_keyfile 注意生成路径和文件名保持和配置文件中的一致
chmod 600 mongodb-keyfile 注意必须是600,否则后续启动时候会报错permissions on ****** are too open
vim config/config1/mongo.conf
vim config/config2/mongo.conf
vim config/config3/mongo.conf
vim mongos/mongos1/mongo.conf
vim mongos/mongos2/mongo.conf
vim mongos/mongos3/mongo.conf
vim share_rs1/share1/mongo.conf
vim share_rs1/share2/mongo.conf
vim share_rs1/share3/mongo.conf
vim share_rs2/share1/mongo.conf
vim share_rs2/share2/mongo.conf
vim share_rs2/share3/mongo.conf
vim share_rs3/share1/mongo.conf
vim share_rs3/share2/mongo.conf
vim share_rs3/share3/mongo.conf
关闭所有进程:
killall mongod
killall mongos
删除lock文件:
rm -rf /data/share_rs/config/config1/data/mongod.lock
rm -rf /data/share_rs/config/config2/data/mongod.lock
rm -rf /data/share_rs/config/config3/data/mongod.lock
rm -rf /data/share_rs/share_rs1/share1/data/mongod.lock
rm -rf /data/share_rs/share_rs1/share2/data/mongod.lock
rm -rf /data/share_rs/share_rs1/share3/data/mongod.lock
rm -rf /data/share_rs/share_rs2/share1/data/mongod.lock
rm -rf /data/share_rs/share_rs2/share2/data/mongod.lock
rm -rf /data/share_rs/share_rs2/share3/data/mongod.lock
rm -rf /data/share_rs/share_rs3/share1/data/mongod.lock
rm -rf /data/share_rs/share_rs3/share2/data/mongod.lock
rm -rf /data/share_rs/share_rs3/share3/data/mongod.lock
重启服务器:
mongod -f /data/share_rs/config/config1/mongo.conf
mongod -f /data/share_rs/config/config2/mongo.conf
mongod -f /data/share_rs/config/config3/mongo.conf
mongod -f /data/share_rs/share_rs1/share1/mongo.conf
mongod -f /data/share_rs/share_rs1/share2/mongo.conf
mongod -f /data/share_rs/share_rs1/share3/mongo.conf
mongod -f /data/share_rs/share_rs2/share1/mongo.conf
mongod -f /data/share_rs/share_rs2/share2/mongo.conf
mongod -f /data/share_rs/share_rs2/share3/mongo.conf
mongod -f /data/share_rs/share_rs3/share1/mongo.conf
mongod -f /data/share_rs/share_rs3/share2/mongo.conf
mongod -f /data/share_rs/share_rs3/share3/mongo.conf
mongos -f /data/share_rs/mongos/mongos1/mongo.conf
mongos -f /data/share_rs/mongos/mongos2/mongo.conf
mongos -f /data/share_rs/mongos/mongos3/mongo.conf
使用集群管理账号认证
db.auth("clusteradmin","pwd123")
db.auth("admin","pwd123");
db.auth("root","pwd123") --权限最高
spring.data.mongodb.uri=mongodb://root:pwd123@127.0.0.1:30001,127.0.0.1:40001,127.0.0.1:50001/admin
6.测试
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
use admin;//必须先使用admin,才能操作enablesharding命令
db.auth("root","pwd123")
db.runCommand( { enablesharding :"db1"});
use db1;
db.createCollection("tmp", {size: 20, capped: 5, max: 100});
db.createUser({user:"dbOwner",pwd:"pwd123",roles:[{role:"dbOwner",db:"db1"}]})
db.createUser({user:"root", pwd:"pwd123", roles:[{role: "root", db:"db1" }]}) --执行失败
db.auth("dbOwner","pwd123")
sh.shardCollection("db1.user",{_id:"hashed"})
for (var i = 1; i<=40; i++){ db.user.save({"_id":new String(i)),"name":"harvey"})};
====================================
查看该集合的状态
db.user.stats();
====================================
sh.shardCollection("db1.userRole",{_id:"hashed"})
====================================
查看该集合的状态
db.userRole.stats();
====================================
db.table1.ensureIndex({"_id":"hashed"})
sh.shardCollection("db1.table1",{_id:"hashed"})
db.table2.ensureIndex({"_id":"hashed"})
sh.shardCollection("db1.table2",{_id:"hashed"})
db.table3.ensureIndex({"_id":"hashed"})
sh.shardCollection("db1.table3",{_id:"hashed"})
7.