实现MongoDB的复制集与分片
介绍
Mongodb复制集(replica set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary通过oplog来同步Primary的数据,保证主从节点数据的一致性;复制集在完成主从复制的基础上,通过心跳机制,一旦Primary节点出现宕机,则触发选举一个新的主节点,剩下的secondary节点指向新的Primary,时间应该在10-30s内完成感知Primary节点故障,实现高可用数据库集群
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集。分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量
一、系统环境
Centos MongoDB 关闭防火墙
192.168.174.131 | 192.168.174.132 | 192.168.174.133 |
---|---|---|
mongos | mongos | mongos |
config server | config server | config server |
shard server1 主节点 | shard server1 副节点 | shard server1 仲裁 |
shard server2 仲裁 | shard server2 主节点 | shard server2 副节点 |
shard server3 副节点 | shard server3 仲裁 | shard server3 主节点 |
端口分配:
-
mongos:20000
-
config:21000
-
shard1:27001
-
shard2:27002
-
shard3:27003
三台机器的配置服务(21000)形成复制集,分片1、2、3也在各机器都部署一个实例,它们之间形成复制集,客户端直接连接3个路由服务与之交互,配置服务和分片服务对客户端是透明的。
二、安装MangoDB
2.1下载解压MongoDB
tar -xzvf
mongodb-linux-x86_64-rhel70-3.2.22.tgz -C /nosql/
改名:
cd /nosql/
mv mongodb-linux-x86_64-rhel70-3.2.22 mongodb
2.2创建路由、配置、分片等的相关目录与文件
分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
启动配置文件存放的文件夹:mkdir -p /nosql/mongodb/conf
路由服务日志存放文件: mkdir -p /nosql/mongodb/mongos/log
配置服务数据存放目录: mkdir -p /nosql/mongodb/config/data
配置服务日志存放文件: mkdir -p /nosql/mongodb/config/log
分片1服务数据存放目录:mkdir -p /nosql/mongodb/shard1/data
分片1服务日志存放文件:mkdir -p /nosql/mongodb/shard1/log
分片2服务数据存放目录: mkdir -p /nosql/mongodb/shard2/data
分片2服务日志存放文件: mkdir -p /nosql/mongodb/shard2/log
分片3服务数据存放目录: mkdir -p /nosql/mongodb/shard3/data
分片3服务日志存放文件:mkdir -p /nosql/mongodb/shard3/log
2.3配置环境变量
vi /etc/profile
export MONGODB_HOME=/nosql/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
立即生效:
source /etc/profile
三、config server配置服务器
3.1(三台机器)添加配置文件
vi /nosql/mongodb/conf/config.conf
配置文件内容
pidfilepath = /nosql/mongodb/config/log/configsrv.pid
dbpath = /nosql/mongodb/config/data
logpath = /nosql/mongodb/config/log/congigsrv.log
logappend =true
bind_ip =0.0.0.0
port = 21000
fork = true
configsvr =true
#副本集名称
replSet =configs
#设置最大连接数
maxConns =20000
3.2配置副本集
启动三台服务器的config server
mongod -f /nosql/mongodb/conf/config.conf
登录任意一台配置服务器,初始化配置副本集
连接 MongoDB: mongo --port 21000
- 其中,"_id"
- "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port。响应内容如下:
四、配置分片副本集
4.1设置第一个分片副本集
①配置文件
vi /nosql/mongodb/conf/shard1.conf
配置文件内容
pidfilepath = /nosql/mongodb/shard1/log/shard1.pid
dbpath = /nosql/mongodb/shard1/data
logpath = /nosql/mongodb/shard1/log/shard1.log
logappend =true
bind_ip =0.0.0.0
port = 27001
fork = true
#副本集名称
replSet =shard1
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000
②启动三台服务器的shard1 server
mongod -f /nosql/mongodb/conf/shard1.conf
③登陆任意一台服务器,初始化副本集
4.2设置第二个分片副本集
过程与设置第一个分片副本集类似,这里直接给出设置结果:
4.3设置第三个分片副本集
过程与设置第一个分片副本集类似,这里直接给出设置结果:
4.4配置路由器mongos
三台机器)先启动配置服务器和分片服务器,后启动路由实例启动路由实例:
vi /nosql/mongodb/conf/mongos.conf
#内容
pidfilepath = /nosql/mongodb/mongos/log/mongos.pid
logpath = /nosql/mongodb/mongos/log/mongos.log
logappend =true
bind_ip =0.0.0.0
port = 20000
fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb =
configs/192.168.252.121:21000,192.168.252.122:21000,192.168.252.123:21000
#设置最大连接数
maxConns =20000
启动三台服务器的mongos server
mongos -f /nosql/mongodb/conf/mongos.conf
五、串联路由服务器
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
5.1串联路由服务器与分配副本集
登陆任意一台mongos :mongo --port 20000
使用admin数据库: use admin
5.2查看集群状态
响应内容如下:
六、启用集合分片生效
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
6.1指定testdb分片生效
db.runCommand(
{ enablesharding :"testdb"});
6.2指定数据库里需要分片的集合和片键,哈希id 分片
db.runCommand(
{ shardcollection : "testdb.table1",key : {"id":
"hashed"} } );
6.3测试分片配置结果
我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表都需要分片。
切换到 testdb 数据库 插入测试数据
use testdb;
for(i=1;i<=100000;i++){db.table1.insert({"id":i,"name":"penglei"})};
查看此时的集群状态,并分组查看总数量:
分组查看总数量是:100000
有时会发现学习是一件很快乐的事情 比一直跑步容易多了 不是嘛