MongoDB分片式安装部署
参考文献
https://blog.csdn.net/Powerful_Fy/article/details/103615902
https://www.runoob.com/mongodb/mongodb-sharding.html
MongoDB分片介绍
分片就是将数据库进行拆分,将大型集合分隔到不同服务器上。比如,本来100G的数据,可以分割成10份存储到10台服务器上,这样每台机器只有10G的数据,通过一个mongos的进程(路由)实现分片后的数据存储与访问,也就是说mongos是整个分片架构的核心,对客户端而言是不知道是否有分片的,客户端只需要把读写操作转达给mongos即可。虽然分片会把数据分隔到很多台服务器上,但是每一个节点都是需要有一个备用角色(副本集),这样能保证数据的高可用。当系统需要更多空间或者资源的时候,分片可以让我们按需方便扩展,只需要把mongodb服务的机器加入到分片集群中即可
上图中主要有如下所述三个主要组件:
Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
MongoDB集群 分片搭建实例
Server1(192.168.10.110)搭建:Mongos、Config Server、副本集1主节点、副本集2仲裁节点、副本集3从节点
Server2(192.168.10.111)搭建:Mongos、Config Server、副本集1从节点、副本集2主节点、副本集3仲裁节点
Server3(192.168.10.112)搭建:Mongos、Config Server、副本集1仲裁节点、副本集2从节点、副本集3主节点
各节点端口号:Mogos:20000 Config:21000 Shard1:22001 Shard2:22002 Shard3:22003
基础配置操作
关闭防火墙&seliunx
执行对象{Master,slave1,slave2};所有节点都需要执行
systemctl stop firewalld
systemctl disable firewalld
查看seliunx状态
sestatus
下载&解压MongoDB
执行对象{Master};
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.4.tgz
解压文件
执行对象{Master};
tar -zxvf mongodb-linux-x86_64-rhel80-4.4.4.tgz -C /usr/
移动文件&修改文件名
执行对象{Master};
mv /usr/mongodb-linux-x86_64-rhel80-4.4.4 /usr/mongodb
配置变量 &变量生效
执行对象{Master,slave1,slave2};所有节点都需要执行
echo '#MongoDB' >> /etc/profile
echo 'export MONGODB_HOME=/usr/mongodb' >> /etc/profile
echo 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profile
source /etc/profile
创建日志和数据log&data目录
执行对象{Master,slave1,slave2};所有节点都需要执行
mkdir -p /data/mongodb/mongos/log
mkdir -p /data/mongodb/config/{data,log}
mkdir -p /data/mongodb/shard1/{data,log}
mkdir -p /data/mongodb/shard2/{data,log}
mkdir -p /data/mongodb/shard3/{data,log}
创建编辑配置文件
执行对象{Master};先在Master上配置,分发至slave1、slave2之后再修改bind_ip即可;
mkdir /usr/mongodb/etc/
cat > /usr/mongodb/etc/config.conf << EOF
pidfilepath=/usr/mongodb/configsrv.pid
dbpath=/data/mongodb/config/data
logpath=/data/mongodb/config/log/congigsrv.log
logappend=true
bind_ip=127.0.0.1,192.168.10.110
port=21000
fork=true
configsvr=true
#副本集名称
replSet=configs
#设置最大连接数
maxConns=20000
EOF
分发到两个Slave节点
执行对象{Master};
scp -r /usr/mongodb root@192.168.10.111:/usr/
scp -r /usr/mongodb root@192.168.10.112:/usr/
修改配置文件的IP地址
执行对象{slave1,slave2};
vi /usr/mongodb/etc/config.conf
pidfilepath=/usr/mongodb/configsrv.pid
dbpath=/data/mongodb/config/data
logpath=/data/mongodb/config/log/congigsrv.log
logappend=true
#bind_ip{master,slave1,slave2}:Change Your local IP Address!!!
bind_ip=127.0.0.1,192.168.10.111
#把192.168.10.111修改成{slave1,slave2}的IP地址
port=21000
fork=true
configsvr=true
replSet=configs #副本集名称
maxConns=20000 #设置最大连接数
检查节点配置
检查Master&slave1&slave2的节点配置
执行对象{Master,slave1,slave2};所有节点都需要执行
1.检查变量{Master,slave1,slave2}
cat /etc/profile
2.检查日志和数据log&data目录
ls /data/mongodb/
3.检查文件是否存在&分发成功
ls /usr/mongodb/
4.检查配置文件
cat /usr/mongodb/etc/config.conf
检查bind_ip中的IP是否为本地IP地址
启动MongoDB服务
执行对象{Master,slave1,slave2};所有节点都需要执行
mongod -f /usr/mongodb/etc/config.conf
配置副本集
登录MongoDB Shell
执行对象{Master};
mongo --port 21000
配置
config = { _id: "configs", members: [ {_id : 0, host : "192.168.10.110:21000"},{_id : 1, host : "192.168.10.111:21000"},{_id : 2, host : "192.168.10.112:21000"}] }
初始化
rs.initiate(config)
#初始化后命令行前缀先变为configs:SECONDARY(从),过一会儿就会自动变为configs:PRIMARY(主),在哪台机器配置副本集,哪台机器就优先变为主
配置分片
在三台机器上创建编辑以下的配置
执行对象{Master};先在Master上配置,再分发至slave1、slave2即可;
创建编辑shard1配置文件
mkdir /etc/mongod/
cat > /etc/mongod/shard1.conf << EOF
pidfilepath=/usr/mongodb/shard1.pid
dbpath=/data/mongodb/shard1/data
logpath=/data/mongodb/shard1/log/shard1.log
logappend=true
bind_ip=0.0.0.0
port=22001
fork=true
replSet=shard1
#副本集名称
shardsvr=true
#declare this is a shard db of a cluster;
maxConns=20000
#设置最大连接数
EOF
创建编辑shard2配置文件
cat > /etc/mongod/shard2.conf << EOF
pidfilepath=/usr/mongodb/shard2.pid
dbpath=/data/mongodb/shard2/data
logpath=/data/mongodb/shard2/log/shard2.log
logappend=true
bind_ip=0.0.0.0
port=22002
fork=true
replSet=shard2
#副本集名称
shardsvr=true
#declare this is a shard db of a cluster;
maxConns=20000
#设置最大连接数
EOF
创建编辑shard3配置文件
cat > /etc/mongod/shard3.conf << EOF
pidfilepath=/usr/mongodb/shard3.pid
dbpath=/data/mongodb/shard3/data
logpath=/data/mongodb/shard3/log/shard3.log
logappend=true
bind_ip=0.0.0.0
port=22003
fork=true
replSet=shard3
#副本集名称
shardsvr=true #declare this is a shard db of a cluster;
maxConns=20000
#设置最大连接数
EOF
分发到两个Slave节点
执行对象{Master};
scp -r /etc/mongod root@192.168.10.111:/etc/
scp -r /etc/mongod root@192.168.10.112:/etc/
启动shard1
分别在三台机器中启动shard1
执行对象{Master,slave1,slave2};所有节点都需要执行
mongod -f /etc/mongod/shard1.conf
登录Mongo Shell
执行对象{Master or Slave1};
mongo --port 22001
创建副本集
#只能够在192.168.10.110或者192.168.10.111登录MongoDB的22001端口进行配置,创建副本集,之所以不能够在192.168.10.112登录,是因为192.168.10.112是shard1的仲裁节点
use admin
config = { _id: "shard1", members: [ {_id : 0, host : "192.168.10.110:22001"}, {_id: 1,host : "192.168.10.111:22001"},{_id : 2, host : "192.168.10.112:22001",arbiterOnly:true}] }
初始化
rs.initiate(config)
启动shard2
分别在三台机器中启动shard2
执行对象{Master,slave1,slave2};所有节点都需要执行
mongod -f /etc/mongod/shard2.conf
登录Mongo Shell
执行对象{slave1 or slave2};
mongo --port 22002
创建副本集
#只能够在192.168.10.111或者192.168.10.112登录MongoDB的22002端口进行配置,创建副本集,之所以不能够在192.168.10.110登录,是因为192.168.10.110是shard2的仲裁节点
use admin
config = { _id: "shard2", members: [ {_id : 0, host : "192.168.10.110:22002" ,arbiterOnly:true},{_id : 1, host : "192.168.10.111:22002"},{_id : 2, host : "192.168.10.112:22002"}] }
初始化
rs.initiate(config)
启动shard3
分别在三台机器中启动shard2
执行对象{Master,slave1,slave2};所有节点都需要执行
mongod -f /etc/mongod/shard3.conf
登录Mongo Shell
执行对象{slave1 or slave2};
mongo --port 22003
创建副本集
#只能够在192.168.10.110或者192.168.10.112登录MongoDB的22003端口进行配置,创建副本集,之所以不能够在192.168.10.111登录,是因为192.168.10.111是shard3的仲裁节点
use admin
config = { _id: "shard3", members: [ {_id : 0, host : "192.168.10.110:22003"}, {_id : 1, host : "192.168.10.111:22003", arbiterOnly:true}, {_id : 2, host : "192.168.10.112:22003"}] }
初始化
rs.initiate(config)
配置Mongos路由服务器
编辑配置文件
执行对象{Master,slave1,slave2};所有节点都需要执行
cat > /etc/mongod/mongos.conf << EOF
pidfilepath=/usr/mongodb/mongos.pid
logpath=/data/mongodb/mongos/log/mongos.log
logappend=true
bind_ip=0.0.0.0
port=20000
fork=true
configdb=configs/192.168.10.110:21000,192.168.10.111:21000,192.168.10.112:21000
maxConns=20000
EOF
启动服务
分别在三台机器中启动Mongos服务 #注意命令,前面用的是mongod,现在用的是mongos!!!
执行对象{Master,slave1,slave2};所有节点都需要执行
mongos -f /etc/mongod/mongos.conf
创建副本集
登录Mongo Shell
执行对象{Master or slave1 or slave2};
mongo --port 20000
创建副本集 #只能够在192.168.10.110或者192.168.10.112登录MongoDB的22003端口进行配置,创建副本集,之所以不能够在192.168.10.111登录,是因为192.168.10.111是shard3的仲裁节点
sh.addShard("shard1/192.168.10.110:22001,192.168.10.111:22001,192.168.10.112:22001")
sh.addShard("shard2/192.168.10.110:22002,192.168.10.111:22002,192.168.10.112:22002")
sh.addShard("shard3/192.168.10.110:22003,192.168.10.111:22003,192.168.10.112:22003")
查看集群状态
sh.status()
测试MongoDB分片
登录任意机器连接MongoDB的20000端口
mongo --port 20000
指定要分片的库db1 #如果db1不存在会自动创建,指定分片的库的第二种方式:db.runCommand({ enablesharding : “db1”})
sh.enableSharding("db1")
在db1库中创建/指定分片的集合cl01 #第二种方式:db.runCommand( { shardcollection : “db1.cl01”,key : {id: 1} } )
sh.shardCollection("db1.cl01",{"id":1} )
查看状态sh.status()中databases项即可看到db1库与cl01集合
sh.status()
分别在三台机器中启动Mongos服务 #注意命令,前面用的是mongod,现在用的是mongos!!!
执行对象{Master,slave1,slave2};所有节点都需要执行
mongos -f /etc/mongod/mongos.conf
创建副本集
登录Mongo Shell
执行对象{Master or slave1 or slave2};
mongo --port 20000
创建副本集 #只能够在192.168.10.110或者192.168.10.112登录MongoDB的22003端口进行配置,创建副本集,之所以不能够在192.168.10.111登录,是因为192.168.10.111是shard3的仲裁节点
sh.addShard("shard1/192.168.10.110:22001,192.168.10.111:22001,192.168.10.112:22001")
sh.addShard("shard2/192.168.10.110:22002,192.168.10.111:22002,192.168.10.112:22002")
sh.addShard("shard3/192.168.10.110:22003,192.168.10.111:22003,192.168.10.112:22003")
查看集群状态
sh.status()
测试MongoDB分片
登录任意机器连接MongoDB的20000端口
mongo --port 20000
指定要分片的库db1 #如果db1不存在会自动创建,指定分片的库的第二种方式:db.runCommand({ enablesharding : “db1”})
sh.enableSharding("db1")
在db1库中创建/指定分片的集合cl01 #第二种方式:db.runCommand( { shardcollection : “db1.cl01”,key : {id: 1} } )
sh.shardCollection("db1.cl01",{"id":1} )
查看状态sh.status()中databases项即可看到db1库与cl01集合
sh.status()