Loading

实现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

image

三台机器的配置服务(21000)形成复制集,分片1、2、3也在各机器都部署一个实例,它们之间形成复制集,客户端直接连接3个路由服务与之交互,配置服务和分片服务对客户端是透明的。

二、安装MangoDB

2.1下载解压MongoDB

tar -xzvf
mongodb-linux-x86_64-rhel70-3.2.22.tgz -C /nosql/

image

改名:

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。响应内容如下:

image

四、配置分片副本集

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

③登陆任意一台服务器,初始化副本集

image

4.2设置第二个分片副本集

过程与设置第一个分片副本集类似,这里直接给出设置结果:

image

4.3设置第三个分片副本集

过程与设置第一个分片副本集类似,这里直接给出设置结果:

image

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

image

5.2查看集群状态

响应内容如下:

image

六、启用集合分片生效

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

6.1指定testdb分片生效

db.runCommand(
{ enablesharding :"testdb"});

6.2指定数据库里需要分片的集合和片键,哈希id 分片

db.runCommand(
{ shardcollection : "testdb.table1",key : {"id":
"hashed"} } );

image

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"})};

查看此时的集群状态,并分组查看总数量:

image

分组查看总数量是:100000

posted @ 2021-12-22 21:03  Christopher·阳  阅读(318)  评论(3编辑  收藏  举报