CentOS6u9 MongoDB3.4集群搭建:分片+副本集

简单说明:

本实验转载于博客:https://www.cnblogs.com/ityouknow/p/7344005.html
原文原理清晰,步骤清楚,有几处笔误小坑,本实验是该博文的个人搭建测试记录

原理简析:

本实验模拟的MongoDB集群分以下几个层次或角色:

mongos层:请求的入口,是router的角色,相当于监听,负责将请求分发到对应的存储数据的shard上,多副本冗余

config server层:记录了mongos中使用到的元数据,自动向mongos同步最新的集群配置,多副本冗余

shard主节点层:将数据分片,数据库拆分,并将其分散在不同的机器上,原理是将整个数据集合切块
块分散到各个shard中,每个shard只负责总数据的一部分,通过一个均衡器来对各个shard均衡,多副本冗余

shard副本层:是shard的备份,多副本冗余

shard仲裁层:用于仲裁,不存储数据,使用最小的资源,需要基数个仲裁角色,且不能放在同一设备上

总结:

应用请求mongos来操作mongodb的增删改查
配置服务器存储数据库元信息,并且和mongos做同步
数据最终存入在shard(分片)上
为了防止数据丢失同步在副本集中存储了一份
仲裁在数据存储到分片的时候决定存储到哪个节点

主机角色端口规划:
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第1张图片
可以看到每台主机上有3个分片,三台主机的相同分片之间构成了主、副和仲裁三个角色

实验步骤:

1° 依据《CentOS6实验机模板搭建部署》克隆实验机,并做以下修改配置:

# 三主机均操作
HOSTNAME=mongodb1
# 另外两台机器主机名分别为 mongodb2和mongodb3
hostname $HOSTNAME
echo "$(grep -E '127|::1' /etc/hosts)">/etc/hosts
echo "$(ifconfig eth0|grep inet|awk -F'[ :]' '{print $13}') $(hostname)">>/etc/hosts
sed -i "s/^HOSTNAME.*$/HOSTNAME=$HOSTNAME/g" /etc/sysconfig/network
ping -c 3 $(hostname)

cat >/etc/hosts<127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.201 mongodb1
192.168.1.202 mongodb2
192.168.1.203 mongodb3
EOF

2° 下载解压安装mongodb-3.4.6

# 三主机均操作
# 下载
cd /tmp
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.6.tgz
# 解压安装
cd /usr/local
tar -xf /tmp/mongodb-linux-x86_64-3.4.6.tgz
mv mongodb-linux-x86_64-3.4.6 mongodb
# 创建目录
# 创建存放配置文件的目录
mkdir -pv /usr/local/mongodb/conf
# 创建存放mongos日志的目录
mkdir -pv /usr/local/mongodb/mongos/log
# 创建存放config server数据和日志的目录
mkdir -pv /usr/local/mongodb/config/{data,log}
# 创建存放主shard、备份shard和仲裁shard数据和日志的目录
mkdir -pv /usr/local/mongodb/shard1/{data,log}
mkdir -pv /usr/local/mongodb/shard2/{data,log}
mkdir -pv /usr/local/mongodb/shard3/{data,log}
# 添加环境变量
echo 'export MONGODB_HOME=/usr/local/mongodb'>>/etc/profile
echo 'export PATH=$MONGODB_HOME/bin:$PATH'>>/etc/profile
source /etc/profile

3° 配置config server:

# 三主机均操作
cat >/usr/local/mongodb/conf/config.conf<<EOF
# 配置pid和data以及log的存储路径,绑定IP
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath      = /usr/local/mongodb/config/data
logpath     = /usr/local/mongodb/config/log/congigsrv.log
logappend   = true
bind_ip     = 0.0.0.0
port        = 21000
fork        = true
# 定义这是一个集群的config server角色
configsvr   = true
# 副本集名称
replSet     = configs
# 设置最大连接数
maxConns    = 20000
EOF
# 启动config server
mongod -f /usr/local/mongodb/conf/config.conf

4° 在config server中配置集群信息

# 任意一节点操作
# 连接config server
mongo --port 21000
config = {
   _id : "configs",
    members : [
        {_id : 0, host : "192.168.1.201:21000" },
        {_id : 1, host : "192.168.1.202:21000" },
        {_id : 2, host : "192.168.1.203:21000" }
        ]
}
rs.initiate(config)
exit
# 使用config配置,使用rs.initiate命令初始化config配置
# 其中id是配置文件中统一配置的副本集名称
# members中配置相应的id和对应的IP和端口

CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第2张图片

5° 配置每个主机的第一个shard:

# 三主机均操作
cat >/usr/local/mongodb/conf/shard1.conf<<EOF
# 配置pid和data以及log的存储路径,绑定IP
pidfilepath   = /usr/local/mongodb/shard1/log/shard1.pid
dbpath        = /usr/local/mongodb/shard1/data
logpath       = /usr/local/mongodb/shard1/log/shard1.log
logappend     = true
bind_ip       = 0.0.0.0
port          = 27001
fork          = true
# 打开web监控
httpinterface = true
rest          = true
# 副本集名称
replSet       = shard1
# 定义这是一个集群的 shard1 角色
shardsvr      = true
# 设置最大连接数
maxConns      = 20000
EOF
# 启动shard1
mongod -f /usr/local/mongodb/conf/shard1.conf

6° 配置集群中每台主机的第一个shard的角色:
配置第一台主机第一个shard为主节点
配置第二台主机第一个shard为副节点
配置第三台主机第一个shard为仲裁

# 任意一节点操作
# 连接shard1
mongo --port 27001
use admin
config = {
   _id : "shard1",
    members : [
        {_id : 0, host : "192.168.1.201:27001" },
        {_id : 1, host : "192.168.1.202:27001" },
        {_id : 2, host : "192.168.1.203:27001" , arbiterOnly: true }
    ]
}
rs.initiate(config);
exit
# 切换到admin库
# 第三个节点的 "arbiterOnly":true 代表其为仲裁节点

CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第3张图片

7° 重复5°和6°操作,配置shard2和shard3:

# 三主机均操作
cat >/usr/local/mongodb/conf/shard2.conf<local/mongodb/shard2/log/shard2.pid
dbpath        = /usr/local/mongodb/shard2/data
logpath       = /usr/local/mongodb/shard2/log/shard2.log
logappend     = true
bind_ip       = 0.0.0.0
port          = 27002
fork          = true
httpinterface = true
rest          = true
replSet       = shard2
shardsvr      = true
maxConns      = 20000
EOF
mongod -f /usr/local/mongodb/conf/shard2.conf

cat >/usr/local/mongodb/conf/shard3.conf<local/mongodb/shard3/log/shard3.pid
dbpath        = /usr/local/mongodb/shard3/data
logpath       = /usr/local/mongodb/shard3/log/shard3.log
logappend     = true
bind_ip       = 0.0.0.0
port          = 27003
fork          = true
httpinterface = true
rest          = true
replSet       = shard3
shardsvr      = true
maxConns      = 20000
EOF
mongod -f /usr/local/mongodb/conf/shard3.conf

# 任意一节点操作
mongo --port 27002
use admin
config = {
   _id : "shard2",
    members : [
        {_id : 0, host : "192.168.1.201:27002" , arbiterOnly: true },
        {_id : 1, host : "192.168.1.202:27002" },
        {_id : 2, host : "192.168.1.203:27002" }
    ]
}
rs.initiate(config);
exit

mongo --port 27003
use admin
config = {
   _id : "shard3",
    members : [
        {_id : 0, host : "192.168.1.201:27003" },
        {_id : 1, host : "192.168.1.202:27003" , arbiterOnly: true },
        {_id : 2, host : "192.168.1.203:27003" }
    ]
}
rs.initiate(config);
exit

# 遇到问题,shard2的仲裁节点为 192.168.1.201:27002
# 在 192.168.1.201 上打开 27002 添加配置时报错
# 切换到另外的主机测成功
# 同理,shard2的仲裁节点不能在192.168.1.202主机上添加, 相同报错

这里写图片描述

8° 配置每个主机的mongos

# 三主机均操作
cat >/usr/local/mongodb/conf/mongos.conf<<EOF
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath     = /usr/local/mongodb/mongos/log/mongos.log
logappend   = true
bind_ip     = 0.0.0.0
port        = 20000
fork        = true
# 监听的配置服务器,只能有1个或者3个,configs为配置服务器的副本集名字
configdb    = configs/192.168.1.201:21000,192.168.1.202:21000,192.168.1.203:21000
# 设置最大连接数
maxConns    = 20000
EOF
mongos -f /usr/local/mongodb/conf/mongos.conf

9° 配置集群中的mongos,关联三个shard:

# 任意一节点操作
mongo --port 20000
use admin
sh.addShard("shard1/192.168.1.201:27001,192.168.1.202:27001,192.168.1.203:27001")
sh.addShard("shard2/192.168.1.201:27002,192.168.1.202:27002,192.168.1.203:27002")
sh.addShard("shard3/192.168.1.201:27003,192.168.1.202:27003,192.168.1.203:27003")
sh.status()
exit

CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第4张图片

10° 测试

# 任意一节点操作
mongo --port 20000
use admin
db.runCommand( { enablesharding  : "testdb1"});
db.runCommand( { shardcollection : "testdb1.tab1",key : {id: 1} } )
exit
# 创建一个testdb1库,指定该库分片
# 分配testdb1库的需要分片的集合和键

# 任意一节点操作
mongo 127.0.0.1:20000
use testdb1;
for(var i=1;i<=100000;i++) db.tab1.save({id:i,"test1":"testval1"});
exit

# 任意一节点操作
mongo 127.0.0.1:20000
use testdb1;
db.tab1.stats();
exit

# 使用testdb1库
# 循环插入数据到testdb1库的tab1集合中的键id中
# 该库对应的该集合对应的该键被设置成了分片
# 查看分片情况

CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第5张图片
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第6张图片
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第7张图片
分别在三个主机上操作配置库、插入测试数据、查看测试数据
验证了副本同步,最后的显示结果看到 “sharded” : true 表示分片也是成功的

11° 开机启动配置:

# 三主机均操作
cat >>/etc/rc.local<<EOF
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/config.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard1.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard2.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard3.conf
/usr/local/mongodb/bin/mongos -f /usr/local/mongodb/conf/mongos.conf
EOF

12° 原文的笔误之处:
中文双引号
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第8张图片
use而非user
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第9张图片
这个地方需要连到mongos,然后use admin,然后才能配置成功
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第10张图片

13° 转载出处信息:
CentOS6u9 MongoDB3.4集群搭建:分片+副本集_第11张图片

[TOC]

你可能感兴趣的:(MongoDB)