本实验转载于博客: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(分片)上
为了防止数据丢失同步在副本集中存储了一份
仲裁在数据存储到分片的时候决定存储到哪个节点
主机角色端口规划:
可以看到每台主机上有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和端口
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 代表其为仲裁节点
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
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中
# 该库对应的该集合对应的该键被设置成了分片
# 查看分片情况
分别在三个主机上操作配置库、插入测试数据、查看测试数据
验证了副本同步,最后的显示结果看到 “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° 原文的笔误之处:
中文双引号
use而非user
这个地方需要连到mongos,然后use admin,然后才能配置成功
[TOC]