MongoDB分片式安装部署 OpenEuler/Centos

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()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NNTCloud

谢谢大牛的打赏,我接着继续肝!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值