mongodb 3.4 集群搭建:分片+副本集

mongodb 3.4 集群搭建:分片 + 副本集
1. 概述
1.1 背景
为解决 mongodb replica set 每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考虑到后期 mongodb 集群的在数据压力巨大时的扩展性,应对海量数据引出了分片机制。
1.2 分片概念
分片是将数据库进行拆分,将其分散在不同的机器上的过程,无需功能强大的服务器就可以存储更多的数据,处理更大的负载,在总数据中,将集合切成小块,将这些块分散到若干片中,每个片只负载总数据的一部分,通过一个知道数据与片对应关系的组件 mongos 的路由进程进行操作。
1.3 基础组件
其利用到了四个组件: mongos config server shard replica set
mongos :数据库集群请求的入口,所有请求需要经过 mongos 进行协调,无需在应用层面利用程序来进行路由选择, mongos 其自身是一个请求分发中心,负责将外部的请求分发到对应的 shard 服务器上, mongos 作为统一的请求入口,为防止 mongos 单节点故障,一般需要对其做 HA
config server :配置服务器,存储所有数据库元数据(分片,路由)的配置。 mongos 本身没有物理存储分片服务器和数据路由信息,只是存缓存在内存中来读取数据, mongos 在第一次启动或后期重启时候,就会从 config server 中加载配置信息,如果配置服务器信息发生更新会通知所有的 mongos 来更新自己的状态,从而保证准确的请求路由,生产环境中通常也需要多个 config server ,防止配置文件存在单节点丢失问题。
shard :在传统意义上来讲,如果存在海量数据,单台服务器存储 1T 压力非常大,无论考虑数据库的硬盘,网络 IO ,又有 CPU ,内存的瓶颈,如果多台进行分摊 1T 的数据,到每台上就是可估量的较小数据,在 mongodb 集群只要设置好分片规则,通过 mongos 操作数据库,就可以自动把对应的操作请求转发到对应的后端分片服务器上。
replica set :在总体 mongodb 集群架构中,对应的分片节点,如果单台机器下线,对应整个集群的数据就会出现部分缺失,这是不能发生的,因此对于 shard 节点需要 replica set 来保证数据的可靠性,生产环境通常为 2 个副本 +1 个仲裁。
1.4 架构图
2. 安装部署
2.1 基础环境
为了节省服务器,采用多实例配置,三个 mongos ,三个 config server ,单个服务器上面运行不同角色的 shard (为了后期数据分片均匀,将三台 shard 在各个服务器上充当不同的角色。),在一个节点内采用 replica set 保证高可用,对应主机与端口信息如下
主机名
IP
组件 mongos
组件config server
shard
mongodb-1
192.168.13.150
端口: 20000
端口: 21000
主节点:  22001
副本节点: 22002
仲裁节点: 22003
mongodb-2
192.168.13.160
端口: 20000
端口: 21000
仲裁节点: 22001
主节点:  22002
副本节点: 22003
mongodb-3
192.168.13.165
端口: 20000
端口: 21000
副本节点: 22001
仲裁节点: 22002
主节点:  22003
2.2 安装部署
2.2.1 软件下载目录创建
[root@mongodb-1 local]# wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgz
[root@mongodb-1 local]# tar -zxvf mongodb-linux-x86_64-rhel62-3.4.10.tgz
[root@mongodb-1 local]# mv mongodb-linux-x86_64-rhel62-3.4.10 mongodb
[root@mongodb-1 local]# vim /etc/profile
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
[root@mongodb-1 local]# source /etc/profile
2.2.2 创建目录
分别在 mongodb-1/mongodb-2/mongodb-3 创建目录及日志文件
[root@mongodb-1 local]#mkdir -p /data/mongodb/mongos/{log,conf}
[root@mongodb-1 local]#mkdir -p /data/mongodb/mongoconf/{data,log,conf}
[root@mongodb-1 local]#mkdir -p /data/mongodb/shard1/{data,log,conf}
[root@mongodb-1 local]#mkdir -p /data/mongodb/shard2/{data,log,conf}
[root@mongodb-1 local]#mkdir -p /data/mongodb/shard3/{data,log,conf}
[root@mongodb-1 local]#touch /data/mongodb/mongos/log/mongos.log
[root@mongodb-1 local]#touch /data/mongodb/mongoconf/log/mongoconf.log
[root@mongodb-1 local]#touch /data/mongodb/shard1/log/shard1.log
[root@mongodb-1 local]#touch /data/mongodb/shard2/log/shard2.log
[root@mongodb-1 local]#touch /data/mongodb/shard3/log/shard3.log
2.2.3 配置 config server 副本集
mongodb3.4 版本后要求配置服务器也创建为副本集,在此副本集名称: replconf
在三台服务器上配置 config server 副本集配置文件,并启动服务
[root@mongodb-1 local]#cat>/data/mongodb/mongoconf/conf/mongoconf.conf<
dbpath=/data/mongodb/mongoconf/data
logpath=/data/mongodb/mongoconf/log/mongoconf.log
logappend=true

bind_ip = 0.0.0.0

port = 21000
maxConns = 1000 # 链接数
journal = true # 日志开启
journalCommitInterval = 200
fork = true # 后台执行
syncdelay = 60
oplogSize = 1000
configsvr = true # 配置服务器
replSet=replconf #config server 配置集 replconf
EOF
# 三台服务器均启动 config server
[root@mongodb-1 local]#mongod -f /data/mongodb/mongoconf/conf/mongoconf.conf
任意登录一台服务器进行配置服务器副本集初始化
[root@mongodb-1 local]#mongo --port 21000
use admin
config = {_id:"replconf",members:[
{_id:0,host:"192.168.13.150:21000"},
{_id:1,host:"192.168.13.160:21000"},
{_id:2,host:"192.168.13.165:21000"},]
}
rs.initiate(config);
查看集群状态:
replconf:OTHER> rs.status()
{
"set" : "replconf",
"date" : ISODate("2017-12-04T07:42:09.054Z"),
"myState" : 1,
"term" : NumberLong(1),
"configsvr" : true,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1512373328, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1512373328, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1512373328, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1512373328, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "172.20.6.10:21000",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 221,
"optime" : {
"ts" : Timestamp(1512373328, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T07:42:08Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1512373296, 1),
"electionDate" : ISODate("2017-12-04T07:41:36Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "172.20.6.11:21000",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 42,
"optime" : {
"ts" : Timestamp(1512373318, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1512373318, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T07:41:58Z"),
"optimeDurableDate" : ISODate("2017-12-04T07:41:58Z"),
"lastHeartbeat" : ISODate("2017-12-04T07:42:08.637Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T07:42:07.648Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "172.20.6.10:21000",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "172.20.6.12:21000",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 42,
"optime" : {
"ts" : Timestamp(1512373318, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1512373318, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T07:41:58Z"),
"optimeDurableDate" : ISODate("2017-12-04T07:41:58Z"),
"lastHeartbeat" : ISODate("2017-12-04T07:42:08.637Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T07:42:07.642Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "172.20.6.10:21000",
"configVersion" : 1
}
],
"ok" : 1
}
此时 config server 集群已经配置完成, mongodb-1 primary mongdb-2/mongodb-3 secondary
2.2.4 配置 shard 集群
三台服务器均进行 shard 集群配置
shard1 配置
[root@mongodb-1 local]#cat >/data/mongodb/shard1/conf/shard.conf <
dbpath=/data/mongodb/shard1/data
logpath = /data/mongodb/shard1/log/shard1.log
port = 22001

bind_ip = 0.0.0.0

logappend = true
nohttpinterface = true
fork = true
oplogSize = 4096
journal = true
smallfiles=true
shardsvr=true #shard 服务器
replSet=shard1 # 副本集名称 shard1
EOF
# 启动 shard 服务
[root@mongodb-1 local]#mongod -f /data/mongodb/shard1/conf/shard.conf
查看此时服务已经正常启动, shard1 22001 端口已经正常监听,接下来登录 mongodb-1 服务器进行 shard1 副本集初始化
[root@mongodb-1 local]#mongo 192.168.13.150:22001
use admin
config = {_id:"shard1",members:[
{_id:0,host:"192.168.13.150:22001"},
{_id:1,host:"192.168.13.160:22001",arbiterOnly:true},
{_id:2,host:"192.168.13.165:22001"},]
}
rs.initiate(config);
查看集群状态,只列出了部分信息:
{
"_id" : 0,
"name" : "172.20.6.10:22001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #mongodb-1 primary
"uptime" : 276,
"optime" : {
"ts" : Timestamp(1512373911, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T07:51:51Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1512373879, 1),
"electionDate" : ISODate("2017-12-04T07:51:19Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "172.20.6.11:22001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER", #mongodb-2 arbiter
"uptime" : 45,
"lastHeartbeat" : ISODate("2017-12-04T07:51:53.597Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T07:51:51.243Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
},
{
"_id" : 2,
"name" : "172.20.6.12:22001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #mongodb-3 secondary
"uptime" : 45,
"optime" : {
"ts" : Timestamp(1512373911, 1),
"t" : NumberLong(1)
}
此时 shard1 副本集已经配置完成, mongodb-1 primary mongodb-2 arbiter mongodb-3 secondary
同样的操作进行 shard2 配置和 shard3 配置
注意:进行 shard2 的副本集初始化,在 mongodb-2 , 初始化 shard3 副本集在 mongodb-3 上进行操作。
shard2 配置文件
[root@mongodb-1 local]#cat >/data/mongodb/shard2/conf/shard.conf <
dbpath=/data/mongodb/shard2/data
logpath = /data/mongodb/shard2/log/shard2.log
port = 22002

bind_ip = 0.0.0.0

logappend = true
nohttpinterface = true
fork = true
oplogSize = 4096
journal = true
smallfiles=true
shardsvr=true
replSet=shard2
EOF
[root@mongodb-1 local]#mongod -f /data/mongodb/shard2/conf/shard.conf
shard3 配置文件
[root@mongodb-1 local]#cat >/data/mongodb/shard3/conf/shard.conf <
dbpath=/data/mongodb/shard3/data
logpath = /data/mongodb/shard3/log/shard3.log
port = 22003
logappend = true
nohttpinterface = true
fork = true
oplogSize = 4096
journal = true
smallfiles=true
shardsvr=true
replSet=shard3
EOF
[root@mongodb-1 local]#mongod -f /data/mongodb/shard3/conf/shard.conf
mongodb-2 上进行 shard2 副本集初始化
# 登录 mongodb-2
[root@mongodb-2 local]#mongo 192.168.13.160:22002
use admin
config = {_id:"shard2",members:[
{_id:0,host:"192.168.13.150:22002"},
{_id:1,host:"192.168.13.160:22002"},
{_id:2,host:"192.168.13.165:22002",arbiterOnly:true},]
}
rs.initiate(config);
查看 shard2 副本集状态
{
"_id" : 0,
"name" : "172.20.6.10:22002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #mongodb-2 secondary
"uptime" : 15,
"optime" : {
"ts" : Timestamp(1512374668, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1512374668, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T08:04:28Z"),
"optimeDurableDate" : ISODate("2017-12-04T08:04:28Z"),
"lastHeartbeat" : ISODate("2017-12-04T08:04:30.527Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T08:04:28.492Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "172.20.6.11:22002",
"configVersion" : 1
},
{
"_id" : 1,
"name" : "172.20.6.11:22002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #mongodb-2 primary
"uptime" : 211,
"optime" : {
"ts" : Timestamp(1512374668, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T08:04:28Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1512374666, 1),
"electionDate" : ISODate("2017-12-04T08:04:26Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "172.20.6.12:22002", #mongodb-3 arbiter
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 15,
"lastHeartbeat" : ISODate("2017-12-04T08:04:30.527Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T08:04:28.384Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
}
登录 mongodb-3 进行 shard3 副本集初始化
# 登录 mongodb-3
[root@mongodb-3 local]#mongo 192.168.13.165:22003
use admin
config = {_id:"shard3",members:[
{_id:0,host:"192.168.13.150:22003",arbiterOnly:true},
{_id:1,host:"192.168.13.160:22003"},
{_id:2,host:"192.168.13.165:22003"},]
}
rs.initiate(config);
查看 shard3 副本集状态
{
"_id" : 0,
"name" : "172.20.6.10:22003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER", #mongodb-1 arbiter
"uptime" : 18,
"lastHeartbeat" : ISODate("2017-12-04T08:07:37.488Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T08:07:36.224Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "172.20.6.11:22003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #mongodb-2 secondary
"uptime" : 18,
"optime" : {
"ts" : Timestamp(1512374851, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1512374851, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T08:07:31Z"),
"optimeDurableDate" : ISODate("2017-12-04T08:07:31Z"),
"lastHeartbeat" : ISODate("2017-12-04T08:07:37.488Z"),
"lastHeartbeatRecv" : ISODate("2017-12-04T08:07:36.297Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "172.20.6.12:22003",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "172.20.6.12:22003",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #mongodb-3 primary
"uptime" : 380,
"optime" : {
"ts" : Timestamp(1512374851, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-12-04T08:07:31Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1512374849, 1),
"electionDate" : ISODate("2017-12-04T08:07:29Z"),
"configVersion" : 1,
"self" : true
}
此时 shard 集群全部已经配置完毕。
2.2.5 配置路由服务器 mongos
目前三台服务器的配置服务器和分片服务器均已启动,配置三台 mongos 服务器
由于 mongos 服务器的配置是从内存中加载,所以自己没有存在数据目录 configdb 连接为配置服务器集群
[root@mongodb-1 local]#cat >/data/mongodb/mongos/conf/mongos.conf<
logpath=/data/mongodb/mongos/log/mongos.log
logappend=true
port = 20000
maxConns = 1000
configdb=replconf/192.168.13.150:21000,192.168.13.160:21000,192.168.13.165:21000 # 制定 config server 集群
fork = true
EOF
[root@mongodb-1 local]#mongos -f /data/mongodb/mongos/conf/mongos.conf
mongodb 3.4 集群搭建:分片+副本集_第1张图片
目前 config server 集群 /shard 集群 /mongos 服务均已启动,但此时为设置分片,还不能使用分片功能。需要登录 mongos 启用分片
登录任意一台 mongos
[root@mongodb-1 local]#mongo 192.168.13.150:20000
use admin
db.runCommand({addshard:"shard1/192.168.13.150:22001,192.168.13.160:22001,192.168.13.165:22001"})
db.runCommand({addshard:"shard2/192.168.13.150:22002,192.168.13.160:22002,192.168.13.165:22002"})
db.runCommand({addshard:"shard3/192.168.13.150:22003,192.168.13.160:22003,192.168.13.165:22003"})
mongodb 3.4 集群搭建:分片+副本集_第2张图片
查看集群
mongodb 3.4 集群搭建:分片+副本集_第3张图片
3. 测试一
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,此时进行数据插入,数据能够自动分片。连接在 mongos 上让指定的数据库、指定的集合分片生效。
注意:设置分片需要在 admin 数据库进行
[root@mongodb-1 local]#mongo 192.168.13.150:20000
use admin
db.runCommand( { enablesharding :"kaliarchdb"}); # 开启 kaliarch 库分片功能
db.runCommand( { shardcollection : "kaliarchdb.table1",key : {_id:"hashed"} } ) # 指定数据库里需要分片的集合 tables 和片键 _id
设置 kaliarchdb table1 表需要分片,根据 _id 自动分片到 shard1 shard2 shard3 上面去。
mongodb 3.4 集群搭建:分片+副本集_第4张图片
查看分片信息
mongodb 3.4 集群搭建:分片+副本集_第5张图片
测试插入数据
use kaliarchdb;
for (var i = 1; i <= 100000; i++) db.table1.save({_id:i,"test1":"testval1"});
mongodb 3.4 集群搭建:分片+副本集_第6张图片
查看分片情况:(省去部分信息)
db.table1.stats()
{
"sharded" : true,
"capped" : false,
"ns" : "kaliarchdb.table1",
"count" : 100000, # count
"size" : 3800000,
"storageSize" : 1335296,
"totalIndexSize" : 4329472,
"indexSizes" : {
"_id_" : 1327104,
"_id_hashed" : 3002368
},
"avgObjSize" : 38,
"nindexes" : 2,
"nchunks" : 6,
"shards" : {
"shard1" : {
"ns" : "kaliarchdb.table1",
"size" : 1282690,
"count" : 33755, #shard1 count
"avgObjSize" : 38,
"storageSize" : 450560,
"capped" : false,
......
"shard2" : {
"ns" : "kaliarchdb.table1",
"size" : 1259434,
"count" : 33143, #shard2 count
"avgObjSize" : 38,
"storageSize" : 442368,
"capped" : false,
.......
"shard3" : {
"ns" : "kaliarchdb.table1",
"size" : 1257876,
"count" : 33102, #shard3 count
"avgObjSize" : 38,
"storageSize" : 442368,
"capped" : false
此时架构中的 mongos config server shard 集群均已经搭建部署完毕,在实际生产环境需要对前端的 mongos 做高可用来替身整体高可用。
4. 测试二
4.1 查看数据是否已经分片
[root@mongodb-1 local]#mongo 192.168.13.150:20000
use admin
db.runCommand({"enablesharding":"llh"})
db.runCommand({"shardcollection":"llh.person","key":{_id:'hashed'}})
use llh
for(var i=0;i<10;i++){db.person.insert({name:"liulonghui"+i});}
[root@mongodb-1 local]#mongo 192.168.13.150:22001
mongodb 3.4 集群搭建:分片+副本集_第7张图片
[root@mongodb-2 local]#mongo 192.168.13.160:22002
mongodb 3.4 集群搭建:分片+副本集_第8张图片
[root@mongodb-3 local]#mongo 192.168.13.165:22003
mongodb 3.4 集群搭建:分片+副本集_第9张图片
4.2 登录从库服务器,查看主从是否同步
[root@mongodb-3 local]# mongo 192.168.13.165:22001
mongodb 3.4 集群搭建:分片+副本集_第10张图片
[root@mongodb-1 local]# mongo 192.168.13.150:22002
mongodb 3.4 集群搭建:分片+副本集_第11张图片
[root@mongodb-2 local]# mongo 192.168.13.160:22003
mongodb 3.4 集群搭建:分片+副本集_第12张图片
5. 后期运维
5.1 启动关闭
mongodb 的启动顺序是,先启动配置服务器,在启动分片,最后启动 mongos.
mongod -f /data/mongodb/mongoconf/conf/mongoconf.conf
mongod -f /data/mongodb/shard1/conf/shard.conf
mongod -f /data/mongodb/shard2/conf/shard.conf
mongod -f /data/mongodb/shard3/conf/shard.conf
mongos -f /data/mongodb/mongos/conf/mongos.conf


mongod -f /home/wangshumin/mongodb/mongoconf/conf/mongoconf.conf
mongod -f /home/wangshumin/mongodb/shard1/conf/shard.conf
mongod -f /home/wangshumin/mongodb/shard2/conf/shard.conf
mongod -f /home/wangshumin/mongodb/shard3/conf/shard.conf
mongos -f /home/wangshumin/mongodb/mongos/conf/mongos.conf











5.2 关闭时,直接 killall 杀掉所有进程
killall mongod
killall mongos

你可能感兴趣的:(mongodb)