架构图
文章图片
环境准备
- 下载:mongodb-macos-x86_64-4.2.8.tgz
- 解压、改名:shard_cluster
tar -zxvf mongodb-macos-x86_64-4.2.8.tgz
mv mongodb-macos-x86_64-4.2.8 shard_cluster
- 建立config节点文件夹
mkdir -p config/{config1,config2,config3,logs}
- 建立shard节点文件夹
mkdir -p shard/{shard1/{shard1-37011,shard1-37013,shard1-37015,shard1-37017,logs},shard2/{shard2-47011,shard2-47013,shard2-47015,shard2-47017,logs},shard3/{shard3-57011,shard3-57013,shard3-57015,shard3-57017,logs},shard4/{shard4-58011,shard4-58013,shard4-58015,shard4-58017,logs}}
- 建立route节点文件夹
mkdir -p route/logs
- 建立密钥文件夹
mkdir -p data/mongodb
config节点部署
- config/config-17011.conf
# 数据库文件位置
dbpath=config/config1
#日志文件位置
logpath=config/logs/config1.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
bind_ip=0.0.0.0
port=17011
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
- config/config-17013.conf
# 数据库文件位置
dbpath=config/config2
#日志文件位置
logpath=config/logs/config2.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
bind_ip=0.0.0.0
port=17013
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
- config/config-17015.conf
# 数据库文件位置
dbpath=config/config3
#日志文件位置
logpath=config/logs/config3.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
bind_ip=0.0.0.0
port=17015
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
- 启动配置节点
./bin/mongod -f config/config-17011.conf
./bin/mongod -f config/config-17013.conf
./bin/mongod -f config/config-17015.conf
- 进入任意config节点的mongo shell,添加config节点集群,注意:user admin
./bin/mongo --port 17011use adminvar cfg = {"_id":"configsvr",
"members":[
{"_id":1, "host":"localhost:17011"},
{"_id":2, "host":"localhost:17013"},
{"_id":3, "host":"localhost:17015"}
]
};
rs.initiate(cfg)
shard1节点集群部署
- shard/shard1/shard1-37011.conf
dbpath=shard/shard1/shard1-37011
bind_ip=0.0.0.0
port=37011
fork=true
logpath=shard/shard1/logs/shard1-37011.log
replSet=shard1
shardsvr=true
- shard/shard1/shard1-37013.conf
dbpath=shard/shard1/shard1-37013
bind_ip=0.0.0.0
port=37013
fork=true
logpath=shard/shard1/logs/shard1-37013.log
replSet=shard1
shardsvr=true
- shard/shard1/shard1-37015.conf
dbpath=shard/shard1/shard1-37015
bind_ip=0.0.0.0
port=37015
fork=true
logpath=shard/shard1/logs/shard1-37015.log
replSet=shard1
shardsvr=true
- shard/shard1/shard1-37017.conf
dbpath=shard/shard1/shard1-37017
bind_ip=0.0.0.0
port=37017
fork=true
logpath=shard/shard1/logs/shard1-37017.log
replSet=shard1
shardsvr=true
- 启动shard1节点
./bin/mongod -f shard/shard1/shard1-37011.conf
./bin/mongod -f shard/shard1/shard1-37013.conf
./bin/mongod -f shard/shard1/shard1-37015.conf
./bin/mongod -f shard/shard1/shard1-37017.conf
- 进入任意shard1节点的mongo shell,添加shard1节点集群
./bin/mongo --port 37011var cfg = {"_id":"shard1",
"protocolVersion" : 1,
"members":[
{"_id":1, "host":"localhost:37011"},
{"_id":2, "host":"localhost:37013"},
{"_id":3, "host":"localhost:37015"},
{"_id":4, "host":"localhost:37017", "arbiterOnly":true}
]
};
rs.initiate(cfg) rs.status()
shard2节点集群部署
- shard/shard2/shard2-47011.conf
dbpath=shard/shard2/shard2-47011
bind_ip=0.0.0.0
port=47011
fork=true
logpath=shard/shard2/logs/shard2-47011.log
replSet=shard2
shardsvr=true
- shard/shard2/shard2-47013.conf
dbpath=shard/shard2/shard2-47013
bind_ip=0.0.0.0
port=47013
fork=true
logpath=shard/shard2/logs/shard2-47013.log
replSet=shard2
shardsvr=true
- shard/shard2/shard2-47015.conf
dbpath=shard/shard2/shard2-47015
bind_ip=0.0.0.0
port=47015
fork=true
logpath=shard/shard2/logs/shard2-47015.log
replSet=shard2
shardsvr=true
- shard/shard2/shard2-47017.conf
dbpath=shard/shard2/shard2-47017
bind_ip=0.0.0.0
port=47017
fork=true
logpath=shard/shard2/logs/shard2-47017.log
replSet=shard2
shardsvr=true
- 启动shard2节点
./bin/mongod -f shard/shard2/shard2-47011.conf
./bin/mongod -f shard/shard2/shard2-47013.conf
./bin/mongod -f shard/shard2/shard2-47015.conf
./bin/mongod -f shard/shard2/shard2-47017.conf
- 进入任意shard2节点的mongo shell,添加shard2节点集群
./bin/mongo --port 47011var cfg = {"_id":"shard2",
"protocolVersion" : 1,
"members":[
{"_id":1, "host":"localhost:47011"},
{"_id":2, "host":"localhost:47013"},
{"_id":3, "host":"localhost:47015"},
{"_id":4, "host":"localhost:47017", "arbiterOnly":true}
]
};
rs.initiate(cfg) rs.status()
shard3节点集群部署
- shard/shard3/shard3-57011.conf
dbpath=shard/shard3/shard3-57011
bind_ip=0.0.0.0
port=57011
fork=true
logpath=shard/shard3/logs/shard3-57011.log
replSet=shard3
shardsvr=true
- ashard/shard3/shard3-57013.conf
dbpath=shard/shard3/shard3-57013
bind_ip=0.0.0.0
port=57013
fork=true
logpath=shard/shard3/logs/shard3-57013.log
replSet=shard3
shardsvr=true
- shard/shard3/shard3-57015.conf
dbpath=shard/shard3/shard3-57015
bind_ip=0.0.0.0
port=57015
fork=true
logpath=shard/shard3/logs/shard3-57015.log
replSet=shard3
shardsvr=true
- shard/shard3/shard3-57017.conf
dbpath=shard/shard3/shard3-57017
bind_ip=0.0.0.0
port=57017
fork=true
logpath=shard/shard3/logs/shard3-57017.log
replSet=shard3
shardsvr=true
- 启动shard3节点
./bin/mongod -f shard/shard3/shard3-57011.conf
./bin/mongod -f shard/shard3/shard3-57013.conf
./bin/mongod -f shard/shard3/shard3-57015.conf
./bin/mongod -f shard/shard3/shard3-57017.conf
- 进入任意shard3节点的mongo shell,添加shard3节点集群
./bin/mongo --port 57011var cfg = {"_id":"shard3",
"protocolVersion" : 1,
"members":[
{"_id":1, "host":"localhost:57011"},
{"_id":2, "host":"localhost:57013"},
{"_id":3, "host":"localhost:57015"},
{"_id":4, "host":"localhost:57017", "arbiterOnly":true}
]
};
rs.initiate(cfg) rs.status()
shard4节点集群部署
- shard/shard4/shard4-58011.conf
dbpath=shard/shard4/shard4-58011
bind_ip=0.0.0.0
port=58011
fork=true
logpath=shard/shard4/logs/shard4-58011.log
replSet=shard4
shardsvr=true
- shard/shard4/shard4-58013.conf
dbpath=shard/shard4/shard4-58013
bind_ip=0.0.0.0
port=58013
fork=true
logpath=shard/shard4/logs/shard4-58013.log
replSet=shard4
shardsvr=true
- shard/shard4/shard4-58015.conf
dbpath=shard/shard4/shard4-58015
bind_ip=0.0.0.0
port=58015
fork=true
logpath=shard/shard4/logs/shard4-58015.log
replSet=shard4
shardsvr=true
- shard/shard4/shard4-58017.conf
dbpath=shard/shard4/shard4-58017
bind_ip=0.0.0.0
port=58017
fork=true
logpath=shard/shard4/logs/shard4-58017.log
replSet=shard4
shardsvr=true
- 启动shard4节点
./bin/mongod -f shard/shard4/shard4-58011.conf
./bin/mongod -f shard/shard4/shard4-58013.conf
./bin/mongod -f shard/shard4/shard4-58015.conf
./bin/mongod -f shard/shard4/shard4-58017.conf
- 进入任意shard4节点的mongo shell,添加shard4节点集群
./bin/mongo --port 58011var cfg = {"_id":"shard4",
"protocolVersion" : 1,
"members":[
{"_id":1, "host":"localhost:58011"},
{"_id":2, "host":"localhost:58013"},
{"_id":3, "host":"localhost:58015"},
{"_id":4, "host":"localhost:58017", "arbiterOnly":true}
]
};
rs.initiate(cfg) rs.status()
route节点部署
- route/route-27017.conf
port=27017
bind_ip=0.0.0.0
fork=true
logpath=route/logs/route.log
configdb=configsvr/localhost:17011,localhost:17013,localhost:17015
- 启动route节点
./bin/mongos -f route/route-27017.conf
- mongos中添加分片节点
./bin/mongo --port 27017sh.status()sh.addShard("shard1/localhost:37011,localhost:37013,localhost:37015,localhost:37017");
sh.addShard("shard2/localhost:47011,localhost:47013,localhost:47015,localhost:47017");
sh.addShard("shard3/localhost:57011,localhost:57013,localhost:57015,localhost:57017");
sh.addShard("shard4/localhost:58011,localhost:58013,localhost:58015,localhost:58017");
sh.status()
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f1ef531f4a85c5270098b90")
}
shards:
{"_id" : "shard1","host" : "shard1/localhost:37011,localhost:37013,localhost:37015","state" : 1 }
{"_id" : "shard2","host" : "shard2/localhost:47011,localhost:47013,localhost:47015","state" : 1 }
{"_id" : "shard3","host" : "shard3/localhost:57011,localhost:57013,localhost:57015","state" : 1 }
{"_id" : "shard4","host" : "shard4/localhost:58011,localhost:58013,localhost:58015","state" : 1 }
active mongoses:
"4.2.8" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled:yes
Currently running:no
Failed balancer rounds in last 5 attempts:0
Migration Results for the last 24 hours:
No recent migrations
databases:
{"_id" : "config","primary" : "config","partitioned" : true }
- 开启数据库和集合分片,指定片键(验证分片效果使用)
sh.enableSharding("lx_resume")sh.shardCollection("lx_resume.lx_resume_datas",{"name":"hashed"})
增加权限控制
- 进入route节点
./bin/mongo --port 27017use lx_resumedb.createUser(
{
user: "lx",
pwd: "abc321",
roles: [
{ role: "readWrite", db: "lx_resume" }
]
}
)
Successfully added user: {
"user" : "lx",
"roles" : [
{
"role" : "readWrite",
"db" : "lx_resume"
}
]
}
- 关闭所有的config节点、分片节点、route节点
killall mongodkillall mongoskillall mongo
- 生成密钥文件,并修改权限(也可以用509证书)
openssl rand -base64 756 > data/mongodb/testKeyFile.filechmod 600 data/mongodb/testKeyFile.file
- config节点集群和shard节点集群开启安全认证和指定密钥文件
auth=true
keyFile=data/mongodb/testKeyFile.file
- 在route配置文件中,设置密钥文件
keyFile=data/mongodb/testKeyFile.file
- 【db|MongoDB的分片集群搭建】编写shell启动config节点、shard节点、route节点
start.sh
./bin/mongod -f config/config-17011.conf
./bin/mongod -f config/config-17013.conf
./bin/mongod -f config/config-17015.conf
./bin/mongod -f shard/shard1/shard1-37011.conf
./bin/mongod -f shard/shard1/shard1-37013.conf
./bin/mongod -f shard/shard1/shard1-37015.conf
./bin/mongod -f shard/shard1/shard1-37017.conf
./bin/mongod -f shard/shard2/shard2-47011.conf
./bin/mongod -f shard/shard2/shard2-47013.conf
./bin/mongod -f shard/shard2/shard2-47015.conf
./bin/mongod -f shard/shard2/shard2-47017.conf
./bin/mongod -f shard/shard3/shard3-57011.conf
./bin/mongod -f shard/shard3/shard3-57013.conf
./bin/mongod -f shard/shard3/shard3-57015.conf
./bin/mongod -f shard/shard3/shard3-57017.conf
./bin/mongod -f shard/shard4/shard4-58011.conf
./bin/mongod -f shard/shard4/shard4-58013.conf
./bin/mongod -f shard/shard4/shard4-58015.conf
./bin/mongod -f shard/shard4/shard4-58017.conf
./bin/mongos -f route/route-27017.conf
- 使用route节点进行安全认证测试
./bin/mongo --port 27017use lx_resumedb.auth("lx","abc321")
SpringBoot访问MongoDB
- pom.xml
org.springframework.boot
spring-boot-starter-data-mongodb
2.2.2.RELEASE
org.springframework.boot
spring-boot-starter-test
2.2.2.RELEASE
>test
- application.properties
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=lx_resume
spring.data.mongodb.username=lx
spring.data.mongodb.password=abc321
- 建立pojo
package com.lx.pojo;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
@Document("lx_resume_datas")
public class Resume {private String id;
private String name;
private String city;
private Date birthday;
private Double expectSalary;
public Resume() {
}public Resume(String id, String name, String city, Date birthday, Double expectSalary) {
this.id = id;
this.name = name;
this.city = city;
this.birthday = birthday;
this.expectSalary = expectSalary;
}@Override
public String toString() {
return "Resume{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", city='" + city + '\'' +
", birthday=" + birthday +
", expectSalary=" + expectSalary +
'}';
}public String getId() {
return id;
}public void setId(String id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getCity() {
return city;
}public void setCity(String city) {
this.city = city;
}public Date getBirthday() {
return birthday;
}public void setBirthday(Date birthday) {
this.birthday = birthday;
}public Double getExpectSalary() {
return expectSalary;
}public void setExpectSalary(Double expectSalary) {
this.expectSalary = expectSalary;
}
}
- 建立dao
package com.lx.dao;
import com.lx.pojo.Resume;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface IResumeDao extends MongoRepository {
}
- 建立启动类
package com.lx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MongoRepositoryMain {public static void main(String[] args) {
SpringApplication.run(MongoRepositoryMain.class, args);
}
}
- 建立测试类
package com.lx;
import com.lx.dao.IResumeDao;
import com.lx.pojo.Resume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MongoRepositoryMain.class)
public class TestRepository {@Autowired
private IResumeDao resumeDao;
@Test
public void testAdd() throws ParseException {
Resume resume = new Resume();
resume.setName("test2");
resume.setCity("BJ");
resume.setExpectSalary(18000d);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2002-08-11 11:13:14");
resume.setBirthday(date);
resumeDao.save(resume);
}@Test
public void testQuery() {
List list = resumeDao.findAll();
list.forEach(resume -> {
System.out.println(resume);
});
}
}
推荐阅读
- 数据库|微信小程序·云开发 云数据库的使用教程
- 线上活动| 如何运用 MongoDB 可调一致性(报名直播技术大佬带你了解!)
- 数据库|Navicat Premium操作Mongodb(基本的增删改查)
- Java进阶之路|好用到爆,GitHub 星标 32.5k+的命令行软件管理神器,功能真强大
- 活动报名 | MongoDB 5.0 时序存储特性介绍
- Mongodb 唯一索引
- Mongodb模式设计案例一例
- mongodb之进阶
- MongoDB添加索引