1、MongoDB副本集介绍
官方文档:https://www.mongodb.com/docs/manual/replication/
MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。副本集没有固定的主节点,当主节点发生故障时整个集群会选举一个主节点为系统提供服务以保证系统的高可用。
Automatic Failover
自动故障转移机制:当主节点未与集合的其他成员通信超过配置的选举超时时间(默认为10秒)时,合格的辅助节点将调用选举以将自己提名为新的主节点。集群尝试完成新主节点的选举并恢复正常操作。
搭建副本集
-
创建数据目录
# 在安装目录mongodb文件夹中创建,使用yum安装时,自己创建一个mongodb文件夹 - mkdir -p ./repl_chenke/data1 - mkdir -p ./repl_chenke/data2 - mkdir -p ./repl_chenke/data3
-
搭建副本集
$ mongod --port 27017 --dbpath ./repl_chenke/data1 --bind_ip 0.0.0.0 --replSet myreplace/[124.222.89.10:27018,124.222.89.10:27019]
$ mongod --port 27018 --dbpath ./repl_chenke/data2 --bind_ip 0.0.0.0 --replSet myreplace/[124.222.89.10:27017,124.222.89.10:27019]
$ mongod --port 27019 --dbpath ./repl_chenke/data3 --bind_ip 0.0.0.0 --replSet myreplace/[124.222.89.10:27017,124.222.89.10:27018]
注意:–replSet 副本集 myreplace 副本集名称/集群中其他节点的主机和端口
-
配置副本集,连接任意节点
-
use admin
-
初始化副本集:登录任意一个mongodb数据库
使用 > mongodb --port 27017 >var config = { _id:"myreplace", members: [ {_id :0 , host : "124.222.89.10:27017"}, {_id :1 , host : "124.222.89.10:27018"}, {_id :2 , host : "124.222.89.10:27019"} ] } > rs.initiate(config);//初始化配置
注意:当副本集中只有一个机器在线时,对外不提供服务,所有请求将阻塞
在云服务器中部署副本集中不要使用localhost
-
设置客户端临时可以访问
主节点默认可以读写,副节点不能读写
rs.slaveOk();
-
2、MongoDB分片集群
官方文档:https://www.mongodb.com/docs/manual/sharding/
副本集:自动故障转移,主从复制,集群 解决问题:1、数量冗余备份2、架构高可用
副本集不能解决压力问题:单节点压力过大,并发访问压力,物理上线问题
分片(sharding)是指将数据拆分,将其分散存在不同机器的过程,有时也用==分区(partitioning)==来表示这个概念,将数据分散在不同的机器上,不需要功能强大的大型计算机就能存储更多的数据,处理更大的负载。
分片目的是通过分片能够增加更多机器来应对不断的增加负载和数据,还不影响应用运行。
MongoDB支持自动分片,可以摆脱手动分片的管理困扰,集群自动切分数据做负载均衡。MongoDB分片的基本思想就是将集合拆分成多个块,这些快分散在若干个片里,每个片只负责总数据的一部分,应用程序不必知道哪些片对应哪些数据,甚至不需要知道数据拆分了,所以在分片之前会运行一个路由进程,mongos进程,这个路由器知道所有的数据存放位置,应用只需要直接与mongos交互即可。mongos自动将请求转到相应的片上获取数据,从应用角度看分不分片没有什么区别。
架构:
Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server:mongod实例,存储了整个ClusterMetadata。
Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单―数据库,前端应用可以透明使用。
Shard Key:片键,设置分片时需要在集合中选一个键,用该键的值作为拆分数据的依据,这个片键称之为(shard key),片键的选取很重要,片键的选取决定了数据散列是否均匀。
搭建
# 1.集群规划
- Shard Server 1:27017
- Shard Repl 1: 27018
- Shard Server 2:27019
- Shard Repl 2:27020
- Shard Server 3: 27021
- Shard Repl 3:27022
- Config Server : 27023
- Config Server : 27024
- Config Server : 27025
- Route Process : 27026
# 2.进入安装的bin目录创建数据目录
- mkdir -p ./cluster/shard/s0
- mkdir -p ./cluster/shard/s0-repl
- mkdir -p ./cluster/shard/s1
- mkdir -p ./cluster/shard/s1-repl
- mkdir -p ./cluster/shard/s2
- mkdir -p ./cluster/shard/s2-repl
- mkdir -p ./cluster/shard/config1
- mkdir -p ./cluster/shard/config2
- mkdir -p ./cluster/shard/config3
# 3、启动4个 shard服务
# 启动 s0 r0
> mongod --port 27017 --dbpath ./cluster/shard/s0 --bind_ip 0.0.0.0 --shardsvr --replSet r0/124.222.89.10:27018
> mongod --port 27018 --dbpath ./cluster/shard/s0-repl --bind_ip 0.0.0.0 --shardsvr --replSet r0/124.222.89.10:27017
-- 1、登录任意节点 mongo --port 27017
-- 2、use admin
-- 3、执行
> var config = {
_id:"r0",
members: [
{_id :0 , host : "124.222.89.10:27017"},
{_id :1 , host : "124.222.89.10:27018"},
]
}
> rs.initiate(config);//初始化配置
# 启动 s1 r1
> mongod --port 27019 --dbpath ./cluster/shard/s1 --bind_ip 0.0.0.0 --shardsvr --replSet r1/124.222.89.10:27020
> mongod --port 27020 --dbpath ./cluster/shard/s1-repl --bind_ip 0.0.0.0 --shardsvr --replSet r1/124.222.89.10:27019
-- 1、登录任意节点 mongo --port 27019
-- 2、use admin
-- 3、执行
> var config = {
_id:"r1",
members: [
{_id :0 , host : "124.222.89.10:27019"},
{_id :1 , host : "124.222.89.10:27020"},
]
}
> rs.initiate(config);//初始化配置
# 启动 s2 r2
> mongod --port 27021 --dbpath ./cluster/shard/s2 --bind_ip 0.0.0.0 --shardsvr --replSet r2/124.222.89.10:27022
> mongod --port 27022 --dbpath ./cluster/shard/s2-repl --bind_ip 0.0.0.0 --shardsvr --replSet r2/124.222.89.10:27021
-- 1、登录任意节点 mongo --port 27021
-- 2、use admin
-- 3、执行
> var config = {
_id:"r2",
members: [
{_id :0 , host : "124.222.89.10:27021"},
{_id :1 , host : "124.222.89.10:27022"},
]
}
> rs.initiate(config);//初始化配置
# 启动3个config服务
> mongod --port 27023 --dbpath ./cluster/shard/config1 --bind_ip 0.0.0.0 --replSet config/[124.222.89.10:27024,124.222.89.10:27025] --configsvr
> mongod --port 27024 --dbpath ./cluster/shard/config2 --bind_ip 0.0.0.0 --replSet config/[124.222.89.10:27023,124.222.89.10:27025] --configsvr
> mongod --port 27025 --dbpath ./cluster/shard/config3 --bind_ip 0.0.0.0 --replSet config/[124.222.89.10:27023,124.222.89.10:27024] --configsvr
-- 初始化 config副本集
-- 1、登录任意节点 mongo --port 27023
-- 2、use admin
-- 3、执行
> var config = {
_id:"config",
configsvr:true,
members: [
{_id :0 , host : "124.222.89.10:27023"},
{_id :1 , host : "124.222.89.10:27024"},
{_id :2 , host : "124.222.89.10:27025"},
]
}
> rs.initiate(config);//初始化配置
# 5、启动mongos路由服务
> mongos --port 27026 --configdb config/124.222.89.10:27023,124.222.89.10:27024,124.222.89.10:27025 --bind_ip 0.0.0.0
# 6、登录到mongos路由服务
-- 1、mongo --port 27026
-- 2、use admin
-- 3、添加分配信息
> db.runCommand({addshard:"r0/124.222.89.10:27017,124.222.89.10:27018","allowLocal":true });
> db.runCommand({addshard:"r1/124.222.89.10:27019,124.222.89.10:27020","allowLocal":true });
> db.runCommand({addshard:"r2/124.222.89.10:27021,124.222.89.10:27022","allowLocal":true });
-- 4、指定分片数据库
db.runCommand({enablesharding:"chenke"});
-- 5、设置片健信息
db.runCommand({shardcollection:"chenke.users",key:{_id:1}});
db.runCommand({shardcollection:"chenke.books",key:{_id:"hashed"}});
注意:
1、查询mongodb是否正在运行ps aux | grep mongo
所有配置操作要在admin库中进行,指定分片库后数据操作在分片库中进行