1.本次搭建使用三台centos7主机搭建伪集群,关闭防火墙和selinux服务
2.mongodb架构相当于9个分片节点,3个路由节点,3个配置节点,主机信息如下图所示
主机名称 | 主机ip地址 | 端口 | 服务 |
A | 10.1.60.114 | 20001,21001,22001,22002,22003 | shard1,shard2,shard3,config servers,mongos |
B | 10.1.60.115 | 20001,21001,22001,22002,22003 | shard1,shard2,shard3,config servers,mongos |
C | 10.1.60.118 | 20001,21001,22001,22002,22003 | shard1,shard2,shard3,config servers,mongos |
3.从官网下载mongodb安装包(我这里下载的是6.0.5版本的tgz包)
Install MongoDB Community Kubernetes Operator | MongoDB
4.创建mongodb目录并将安装包放到目录下解压(以下所有操作没有特殊标明的都要在三台主机上执行)
mkdir /etc/mongodb
tar -zxvf /etc/mongodb/mongodb-linux-x86_64-rhel70-6.0.5.tgz /etc/mongodb/
mv /etc/mongodb/mongodb-linux-x86_64-rhel70-6.0.5 /etc/mongodb/mongodb
ls /etc/mongodb
5.创建mongodb各项服务所需的目录
cd /etc/mongodb/mongodb
创建存放配置文件的目录
mkdir conf
创建存放config servers服务数据的目录
mkdir -p config/log
mkdir config/data
创建存放分片节点数据的目录(每台主机三个分片副本集节点)
mkdir -p shard1/data
mkdir shard1/log
mkdir -p shard2/data
mkdir shard2/log
mkdir -p shard3/data
mkdir shard3/log
创建存放mongos路由服务数据的目录
mkdir -p mongos/log
6. 创建mongodb各项服务的配置文件
编辑config servers服务配置文件
vi conf/config.conf
pidfilepath=/etc/mongodb/mongodb/config/config_server.pid #记录config服务的pid
dbpath=/etc/mongodb/mongodb/config/data/ #存放config服务数据的目录
logpath=/etc/mongodb/mongodb/config/log/config_server.log #记录config服务日志
logappend=true #以追加写入的形式写入日志
bind_ip=0.0.0.0 #绑定ip地址
port=21001 #config服务使用的端口
fork=true #后台启动服务
configsvr=true #configsvr选项设置为true时,当前MongoDB实例将被配置为配置服务器,可以用于存储和管理分片集群的元数据信息,在这种情况下,MongoDB实例将会监听默认端口27019,并使用默认的数据目录/data/configdb存储配置服务器的数据文件
replSet=config_server #副本集名称
maxConns=20000 #最大连接数
编辑shard1服务配置文件
vi conf/shard1.conf
pidfilepath=/etc/mongodb/mongodb/shard1/shard1.pid
dbpath=/etc/mongodb/mongodb/shard1/data
logpath=/etc/mongodb/mongodb/shard1/log/shard1.log
logappend=true
bind_ip=0.0.0.0
port=22001
fork=true
directoryperdb=true #用于指定MongoDB实例是否使用独立的数据目录来存储每个数据库。当directoryperdb选项设置为true时,MongoDB实例将为每个数据库创建一个独立的数据目录,这样可以更好地管理和维护不同数据库之间的数据。如果directoryperdb选项设置为false,则MongoDB实例将使用单个数据目录来存储所有的数据库文件
replSet=shard1 #配置副本集名称
shardsvr=true #用于指定MongoDB实例是否用作分片集群的分片节点。当shardsvr选项设置为true时,MongoDB实例将被配置为分片集群的分片节点,可以用于存储和管理分片集群的数据。在这种情况下,MongoDB实例将会监听默认端口27018,并使用默认的数据目录/data/db存储数据文件
maxConns=20000
编辑shard2服务配置文件
vi conf/shard2.conf
pidfilepath=/etc/mongodb/mongodb/shard2/shard2.pid
dbpath=/etc/mongodb/mongodb/shard2/data
logpath=/etc/mongodb/mongodb/shard2/log/shard2.log
logappend=true
bind_ip=0.0.0.0
port=22002
fork=true
directoryperdb=true
replSet=shard2
shardsvr=true
maxConns=20000
编辑shard3服务配置文件
vi conf/shard3.conf
pidfilepath=/etc/mongodb/mongodb/shard3/shard3.pid
dbpath=/etc/mongodb/mongodb/shard3/data
logpath=/etc/mongodb/mongodb/shard3/log/shard3.log
logappend=true
bind_ip=0.0.0.0
port=22003
fork=true
directoryperdb=true
replSet=shard3
shardsvr=true
maxConns=20000
编辑mongos服务配置文件
vi conf/mongos.conf
pidfilepath=/etc/mongodb/mongodb/mongos/mongos.pid
logpath=/etc/mongodb/mongodb/mongos/log/mongos.log
logappend=true
bind_ip=0.0.0.0
port=20001
fork=true
configdb=config_server/10.1.60.114:21001,10.1.60.115:21001,10.1.60.118:21001 #配置config服务副本集的所有节点,config_server之前在config配置文件中配置的副本集的名称
maxConns=20000
7.启用mongodb各项服务
cd /etc/mongodb/mongodb/
启动config servers服务
bin/mongod --config conf/config.conf
启动shard服务
bin/mongod --conf conf/shard1.conf
bin/mongod --config conf/shard2.conf
bin/mongod --config conf/shard3.conf
启动mongos服务
bin/mongos --config conf/mongos.conf
8.安装mongosh服务(mongodb的6.0.5版本没有自带的客户端)
参考:安装mongodb客户端_Apex Predator的博客-CSDN博客
9.初始化各项服务副本集(此步骤在副本集中的任意一个节点主机上配置即可)
以下配置去掉注释后在一行一行的输入到mongodb的命令行中执行
使用mongosh服务登录config服务初始化config servers服务副本集
mongosh --port 21001
rs.initiate({ #初始化副本集
_id:"config_server", #此处需要填写config配置文件中设置的副本集名称
members:[ #副本集成员信息
{_id:0,host:"10.1.60.114:21001"},
{_id:1,host:"10.1.60.115:21001"},
{_id:2,host:"10.1.60.118:21001"}
]
});
使用mongosh服务登录shard服务初始化shard服务副本集
mogosh --port 22001
rs.initiate({
_id:"shard1", #此处需要填写shard1配置文件中设置的副本集名称
members:[
{_id:0,host:"10.1.60.114:22001"},
{_id:1,host:"10.1.60.115:22001"},
{_id:2,host:"10.1.60.118:22001",arbiterOnly:true} #配置此节点为副本集的仲裁节点
]
});
mogosh --port 22002
rs.initiate({
_id:"shard2", #此处需要填写shard2配置文件中设置的副本集名称
members:[
{_id:0,host:"10.1.60.114:22002"},
{_id:1,host:"10.1.60.115:22002"},
{_id:2,host:"10.1.60.118:22002",arbiterOnly:true} #配置此节点为副本集的仲裁节点
]
});
mogosh --port 22003
rs.initiate({
_id:"shard3", #此处需要填写shard3配置文件中设置的副本集名称
members:[
{_id:0,host:"10.1.60.114:22003"},
{_id:1,host:"10.1.60.115:22003"},
{_id:2,host:"10.1.60.118:22003",arbiterOnly:true} #配置此节点为副本集的仲裁节点
]
});
使用mongosh服务登录mongos服务添加分片信息
mogosh --port 20001
注意MongoDB6以后直接在路由中加入分片信息会报错,需要先进行以下配置
use admin #使用admin库,以下操作需要在admin库下执行
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : 2 #其实设置为2不太严谨,建议使用更高的写关注级别,例如
w: "majority"
,以确保写操作在大多数节点上都已成功复制。这样可以提高数据的可用性和容错能力,以防止数据丢失或损坏}
});
添加分片副本集信息
db.runCommand({'addshard':'shard1/10.1.60.114:22001,10.1.60.115:22001.10.1.60.118:22001'});
db.runCommand({'addshard':'shard2/10.1.60.114:22002,10.1.60.115:22002.10.1.60.118:22002'});
db.runCommand({'addshard':'shard3/10.1.60.114:22003,10.1.60.115:22003.10.1.60.118:22003'});
查看集群状态
sh.status()
可以看到已经是识别到了分片信息,仲裁节点是不显示的,所以shard副本集里就只显示两个节点
10.测试mongodb集群分片存储
使用客户端连接mongos服务
mogosh --port 20001
创建测试库
use db
开启测试库分片,需要在admin库下执行命令
use admin
db.runCommand({enablesharding:'sj'})
创建collection并开启分片
use sj
db.user.ensureIndex({'id':'hashed'}); #在 user
集合中创建一个基于 id
字段的哈希索引,也可以不用执行创建索引命令
use admin
db.runCommand({shardcollection:'sj.user',key:{'id':'hashed'}}) #将 sj
数据库中的 user
集合分片,并使用 id
字段的哈希值作为分片键
查看user集合是否开启分片
use sj
db.user.stats().sharded
写入数据测试查看分片情况
use sj
for(i=1;i<=20000;i++)db.user.insert({id:i,name:'linlin',sex:'boy'})
sh.status()
查看数据分片情况
db.user.getShardDistribution()