脚本宝典收集整理的这篇文章主要介绍了分布式NoSQL数据库MongoDB初体验-v5.0.5,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
MongoDB官网 https://www.mongodb.com/ 社区版最新版本5.0,其中5.2版本很快也要面世了
MongoDB GitHub源码 https://github.com/mongodb
MongoDB文档地址 https://docs.mongodb.com/manual/
MongoDB是一个流行的开源分布式文档型数据库,由 C++ 语言编写,旨在处理大规模额数据,为 WEB 应用提供可扩展、高性能的数据存储解决方案。
MongoDB介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。前面我们学习了MySQL和Elasticsearch,我们本篇后续章节也会学习和聊聊MongoDB与这两者的故事。
bson是一种二进制形式的存储格式,采用了相似于C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具备轻量性、可遍历性、高效性的特色,能够有效描述非结构化数据和结构化数据,有点相似于Google的Protocol Buffer。
前面我们学习了Docker,本篇我们就利用docker-compose来编排部署MongoDB分片集群,那我们就开始练手了
部署一个两个副本集(每个副本集3个节点)、配置服务器集群(3个节点)、一个路由节点
当前目录下创建scripts文件夹,创建setup.sh、setup-cnf.sh、init-shard.sh和docker-compose.yml文件。
setup.sh内容如下:
#!/bin/bash
mongodb1=`getent hosts ${MONGO1} | awk '{ print $1 }'`
mongodb2=`getent hosts ${MONGO2} | awk '{ print $1 }'`
mongodb3=`getent hosts ${MONGO3} | awk '{ print $1 }'`
port=${PORT:-27017}
echo "Waiting for startup.."
until mongo --host ${mongodb1}:${port} --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
printf '.'
sleep 1
done
echo "Started.."
echo setup.sh time now: `date +"%T" `
mongo --host ${mongodb1}:${port} <<EOF
var cfg = {
"_id": "${RS}",
"protocolVersion": 1,
"members": [
{
"_id": 0,
"host": "${mongodb1}:${port}"
},
{
"_id": 1,
"host": "${mongodb2}:${port}"
},
{
"_id": 2,
"host": "${mongodb3}:${port}"
}
]
};
rs.initiate(cfg, { force: true });
rs.reconfig(cfg, { force: true });
EOF
setup-cnf.sh内容如下:
#!/bin/bash
mongodb1=`getent hosts ${MONGO1} | awk '{ print $1 }'`
mongodb2=`getent hosts ${MONGO2} | awk '{ print $1 }'`
mongodb3=`getent hosts ${MONGO3} | awk '{ print $1 }'`
port=${PORT:-27017}
echo "Waiting for startup.."
until mongo --host ${mongodb1}:${port} --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
printf '.'
sleep 1
done
echo "Started.."
echo setup-cnf.sh time now: `date +"%T" `
mongo --host ${mongodb1}:${port} <<EOF
var cfg = {
"_id": "${RS}",
"configsvr": true,
"protocolVersion": 1,
"members": [
{
"_id": 100,
"host": "${mongodb1}:${port}"
},
{
"_id": 101,
"host": "${mongodb2}:${port}"
},
{
"_id": 102,
"host": "${mongodb3}:${port}"
}
]
};
rs.initiate(cfg, { force: true });
rs.reconfig(cfg, { force: true });
EOF
init-shard.sh内容如下:
#!/bin/bash
mongodb1=`getent hosts ${MONGOS} | awk '{ print $1 }'`
mongodb11=`getent hosts ${MONGO11} | awk '{ print $1 }'`
mongodb12=`getent hosts ${MONGO12} | awk '{ print $1 }'`
mongodb13=`getent hosts ${MONGO13} | awk '{ print $1 }'`
mongodb21=`getent hosts ${MONGO21} | awk '{ print $1 }'`
mongodb22=`getent hosts ${MONGO22} | awk '{ print $1 }'`
mongodb23=`getent hosts ${MONGO23} | awk '{ print $1 }'`
mongodb31=`getent hosts ${MONGO31} | awk '{ print $1 }'`
mongodb32=`getent hosts ${MONGO32} | awk '{ print $1 }'`
mongodb33=`getent hosts ${MONGO33} | awk '{ print $1 }'`
port=${PORT:-27017}
echo "Waiting for startup.."
until mongo --host ${mongodb1}:${port} --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
printf '.'
sleep 1
done
echo "Started.."
echo init-shard.sh time now: `date +"%T" `
mongo --host ${mongodb1}:${port} <<EOF
sh.addShard( "${RS1}/${mongodb11}:${PORT1},${mongodb12}:${PORT2},${mongodb13}:${PORT3}" );
sh.addShard( "${RS2}/${mongodb21}:${PORT1},${mongodb22}:${PORT2},${mongodb23}:${PORT3}" );
sh.status();
EOF
docker-compose.yml内容如下:
version: '3.9'
services:
mongo-1-2:
container_name: "mongo-1-2"
image: mongo:5.0.5
ports:
- "30012:27017"
command: mongod --replSet rs1 --shardsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-1-3:
container_name: "mongo-1-3"
image: mongo:5.0.5
ports:
- "30013:27017"
command: mongod --replSet rs1 --shardsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-1-1:
container_name: "mongo-1-1"
image: mongo:5.0.5
ports:
- "30011:27017"
command: mongod --replSet rs1 --shardsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-rs1-setup:
container_name: "mongo-rs1-setup"
image: mongo:5.0.5
depends_on:
- "mongo-1-1"
- "mongo-1-2"
- "mongo-1-3"
volumes:
- ./scripts:/scripts
environment:
- MONGO1=mongo-1-1
- MONGO2=mongo-1-2
- MONGO3=mongo-1-3
- RS=rs1
entrypoint: [ "/scripts/setup.sh" ]
networks:
- mongo
mongo-2-2:
container_name: "mongo-2-2"
image: mongo:5.0.5
ports:
- "30022:27017"
command: mongod --replSet rs2 --shardsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-2-3:
container_name: "mongo-2-3"
image: mongo:5.0.5
ports:
- "30023:27017"
command: mongod --replSet rs2 --shardsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-2-1:
container_name: "mongo-2-1"
image: mongo:5.0.5
ports:
- "30021:27017"
command: mongod --replSet rs2 --shardsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-rs2-setup:
container_name: "mongo-rs2-setup"
image: mongo:5.0.5
depends_on:
- "mongo-2-1"
- "mongo-2-2"
- "mongo-2-3"
volumes:
- ./scripts:/scripts
environment:
- MONGO1=mongo-2-1
- MONGO2=mongo-2-2
- MONGO3=mongo-2-3
- RS=rs2
entrypoint: [ "/scripts/setup.sh" ]
networks:
- mongo
mongo-cnf-2:
container_name: "mongo-cnf-2"
image: mongo:5.0.5
ports:
- "30102:27017"
command: mongod --replSet cnf-serv --configsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-cnf-3:
container_name: "mongo-cnf-3"
image: mongo:5.0.5
ports:
- "30103:27017"
command: mongod --replSet cnf-serv --configsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-cnf-1:
container_name: "mongo-cnf-1"
image: mongo:5.0.5
ports:
- "30101:27017"
command: mongod --replSet cnf-serv --configsvr --port 27017 --oplogSize 16
restart: always
networks:
- mongo
mongo-cnf-setup:
container_name: "mongo-cnf-setup"
image: mongo:5.0.5
depends_on:
- "mongo-cnf-1"
- "mongo-cnf-2"
- "mongo-cnf-3"
volumes:
- ./scripts:/scripts
environment:
- MONGO1=mongo-cnf-1
- MONGO2=mongo-cnf-2
- MONGO3=mongo-cnf-3
- RS=cnf-serv
- PORT=27017
entrypoint: [ "/scripts/setup-cnf.sh" ]
networks:
- mongo
mongo-router:
container_name: "mongo-router"
image: mongo:5.0.5
ports:
- "30001:27017"
depends_on:
- "mongo-rs1-setup"
- "mongo-rs2-setup"
- "mongo-cnf-setup"
command: mongos --configdb cnf-serv/mongo-cnf-1:27017,mongo-cnf-2:27017,mongo-cnf-3:27017 --port 27017 --bind_ip 0.0.0.0
restart: always
networks:
- mongo
mongo-shard-setup:
container_name: "mongo-shard-setup"
image: mongo:5.0.5
depends_on:
- "mongo-router"
volumes:
- ./scripts:/scripts
environment:
- MONGOS=mongo-router
- MONGO11=mongo-1-1
- MONGO12=mongo-1-2
- MONGO13=mongo-1-3
- MONGO21=mongo-2-1
- MONGO22=mongo-2-2
- MONGO23=mongo-2-3
- RS1=rs1
- RS2=rs2
- PORT=27017
- PORT1=27017
- PORT2=27017
- PORT3=27017
entrypoint: [ "/scripts/init-shard.sh" ]
restart: on-failure:20
networks:
- mongo
networks:
mongo:
driver: bridge
ipam:
config:
- subnet: 10.200.1.10/24
#docker-compose.yml当前目录下一键运行docker-compose,也可以使用-f docker-compose.yml指定文件
docker-compose up -d
#查看运行日志,至此分片集群启动和配置完成
docker-compose logs
#查看进程信息或者docker ps
docker-compose ps
##进入路由节点
docker exec -it 1eb3991a6f68 /bin/bash
## 执行mongo客户端
mongo
#查看集群分片信息,目前数据节点由rs1和rs2两个副本集组成
db.stats()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6lsTfrK-1640346822317)(image-20211224172209608.png)]
#进入一个副本集节点里
docker exec -it 210f0e977622 /bin/bash
## 执行mongo客户端
mongo
#查看当前所在副本集的集群节点信息
rs.status()
MongoDB基于文档的管理,官方提供详细说明,包括插入数据、修改数据、删除数据、基础查询。
spring-boot整合
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
yaml文件配置
spring:
data:
mongodb:
uri: mongodb://192.168.50.95:30001/test
import cn.aotain.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.*;
@SpringBootTest
class GitTestApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
//批量插入
void batInsertUser() {
List<User> users = new ArrayList<>();
for (long i = 1; i <= 1000; i++) {
users.add(new User(i,"user"+i, new Random().nextInt(100), UUID.randomUUID().toString(),new Date()));
}
mongoTemplate.insert(users,"user_info");
}
@Test
//查询全部
public void findAllUser() throws Exception {
List<User> users = mongoTemplate.findAll(User.class,"user_info");
System.out.println("查询结果:" + users.toString());
}
@Test
//查询条件
public void findUserByConditionAndSort() {
Query query = new Query(Criteria.where("age").is(62)).with(Sort.by("createTime"));
List<User> users = mongoTemplate.find(query, User.class,"user_info");
users.forEach(System.out::println);
}
@Test
//查询一个
public void findOneUser(){
Query query = new Query(Criteria.where("userId").is(233L));
User user = mongoTemplate.findOne(query, User.class,"user_info");
System.out.printf(user.toString());
}
}
对MongoDB集合进行分片时需要选择一个片键 , 片键是每条记录都必须包含的字段,且为建立了索引的单个字段或复合字段,MongoDB数据库按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中。为了按照片键划分数据块,MongoDB使用基于范围的分片方式或者基于哈希的分片方式。但需要注意的是一旦集合设置分片并插入文档之后每个文档的分片的键和值都是不可更改的。如果需要修改文档的分片键,必须要先删除文档,再修改分片键,然后重新插入文档。分片键也不支持数组索引,文本索引和地理空间索引。
#基于范围的分片键设置,使用如下命令,开启数据库分片开关,参数database表示要开启分片集合的数据库
sh.enableSharding(database)
#设置分片键,参数namespace表示需要进行分片的目标集合的完整命名空间<database>.<collections>,key表示要设置分片键的索引,如果需要进行分片的目标集合是空集合,可以不创建索引直接进行下一步的分片设置,该操作会自动创建索引,如果需要进行分片的目标集合是非空集合,则需要先创建索引key。然后使用如下命令设置分片键。
sh.shardCollection(namespace, key)
然后再使用如下命令创建基于哈希的分片键#基于范围的分片键设置,使用如下命令,开启数据库分片开关,参数database表示要开启分片集合的数据库
sh.enableSharding(database)
#设置基于哈希的分片键,其中numInitialChunks值的估算方法是:db.collection.stats().size / 10*1024*1024*1024。
sh.shardCollection("<database>.<collection>", { <shard key> : "hashed" }* , false, {numInitialChunks: 预置的chunk个数})
#如果集合已经包含数据,则需要先使用如下命令对需要创建的基于哈希的分片键先创建哈希索引
db.collection.createIndex()
#然后再使用如下命令创建基于哈希的分片键
sh.shardCollection()
#基于Hash分片
sh.enableSharding("test")
sh.shardCollection("test.user_info_shard",{ "userId" : "hashed" },false)
我们往test.user_info_shard集合中插入10000条数据,查看两个rs中的文档数可以看到数据已经分散到两个副本集集群中了。
**本人博客网站 **IT小神 www.itxiaoshen.com
以上是脚本宝典为你收集整理的分布式NoSQL数据库MongoDB初体验-v5.0.5全部内容,希望文章能够帮你解决分布式NoSQL数据库MongoDB初体验-v5.0.5所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。