使用工具:Oracle VM VirtualBox
虚拟机系统:CentOS7
MongoDB版本:3.6
远程访问工具:SSH或XShell
MongoDB下载地址:https://www.mongodb.com/download-center/community
虚拟机网络设置
- 宿主机无线网卡上网,虚拟机之间能相互访问,宿主机与虚拟机能相互访问,虚拟机无法上internet网
设置2个网卡
启动虚拟机
# 关闭防火墙
systemctl stop firewalld
# 开机不启用防火墙
systemctl disable firewalld
设置静态IP
cd /etc/sysconfig/network-scripts/
vi ifcfg-enp0s3
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
NM_CONTROLLED="no"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s3"
UUID="b5104b37-0c59-4559-8f8f-b70d3e215967"
DEVICE="enp0s3"
ONBOOT="yes"
# 每个虚拟机设置自己的IP地址
IPADDR=192.168.56.104
GATEWAY=192.168.56.1
2、宿主机无线网卡上网,虚拟机之间能相互访问,宿主机与虚拟机能相互访问,虚拟机能上internet网
虚拟机IP是动态分配的
推荐第一种网络配置,我们需要静态配置各个虚拟机的IP
MongoDB安装及配置
如何安装就不介绍了,用tar命令解压即可。
安装好(解压)MongoDB后,设置环境变量,推荐以下方法。
在 /etc/profile.d/ 目录下新建对应的 sh 文件即可,比如新建 mongodb.sh
vi /etc/profile.d/mongodb.sh
export MONGODB_HOME=/root/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
立即刷新使变量可用
source /etc/profile
集群场景介绍
本人电脑受性能所限,目前最多带4个虚拟机,所以是伪集群,不影响效果演示。
4个虚拟机,IP分别是192.168.56.101、102、103、104
1个路由服务:在虚拟机192.168.56.101上(路由没有做集群)。
2个配置服务:在虚拟机192.168.56.102上,用两个端口号启动两个mongo服务,模拟两个配置服务器。
2个副本集:分别在103和104上,分别用3个端口号启动3个mongo服务,模拟3个MongoDB数据服务器。
启动服务前准备工作
在启动各个mongo服务前做如下操作:
在101上新建文件夹
mkdir -p /usr/mongo-router/node01/logs
在102上新建文件夹
mkdir -p /usr/mongo-conf/node01/data
mkdir -p /usr/mongo-conf/node01/logs
mkdir -p /usr/mongo-conf/node02/data
mkdir -p /usr/mongo-conf/node02/logs
在103上新建文件夹
mkdir -p /usr/mongo-rs/node01/data
mkdir -p /usr/mongo-rs/node01/logs
mkdir -p /usr/mongo-rs/node02/data
mkdir -p /usr/mongo-rs/node02/logs
mkdir -p /usr/mongo-rs/node03/data
mkdir -p /usr/mongo-rs/node03/logs
在104上新建文件夹
mkdir -p /usr/mongo-rs/node01/data
mkdir -p /usr/mongo-rs/node01/logs
mkdir -p /usr/mongo-rs/node02/data
mkdir -p /usr/mongo-rs/node02/logs
mkdir -p /usr/mongo-rs/node03/data
mkdir -p /usr/mongo-rs/node03/logs
添加配置文件
在102虚拟机中的文件夹/usr/mongo-conf/node01下添加配置文件mongodb.cfg,内容如下:
# 数据文件位置
dbpath=/usr/mongo-conf/node01/data
# 日志文件位置
logpath=/usr/mongo-conf/node01/logs/mongodb.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
# 绑定IP
bind_ip=192.168.56.102
# 端口号
port=28001
# 标识此服务是一个配置服务
configsvr=true
# 配置服务器的副本集名字
replSet=configsvr
在102虚拟机中的文件夹/usr/mongo-conf/node02下添加配置文件mongodb.cfg,内容跟以上不同之处用红色粗体标出:
# 数据文件位置
dbpath=/usr/mongo-conf/node02/data
# 日志文件位置
logpath=/usr/mongo-conf/node02/logs/mongodb.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
# 绑定IP
bind_ip=192.168.56.102
# 端口号
port=28002
# 标识此服务是一个配置服务
configsvr=true
# 配置服务器的副本集名字(跟上面要一致)
replSet=configsvr
在103虚拟机中的文件夹/usr/mongo-rs/node01下添加配置文件mongodb.cfg,内容如下:
# 数据库文件位置
dbpath=/usr/mongo-rs/node01/data
# 日志文件位置
logpath=/usr/mongo-rs/node01/logs/mongodb.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
bind_ip=192.168.56.103
port=27003
# 副本集名字
replSet=rs001
# 有此配置,要先启动配置服务
shardsvr=true
同理,在虚拟机103下的node02、node03下也添加配置文件,不同之处就是配置文件里的路径和端口号。
在104虚拟机中的文件夹/usr/mongo-rs/node01下添加配置文件mongodb.cfg,内容如下:
# 数据库文件位置
dbpath=/usr/mongo-rs/node01/data
# 日志文件位置
logpath=/usr/mongo-rs/node01/logs/mongodb.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
bind_ip=192.168.56.104
port=27006
# 副本集名字
replSet=rs002
# 有此配置,要先启动配置服务
shardsvr=true
同理,在虚拟机104下的node02、node03下也添加配置文件
启动虚拟机102、103、104下的mongo服务
先启动102配置服务器的服务
再启动103和104上的服务
104上的启动截图跟103一样
然后登录任一个配置服务,命令如下:
mongo 192.168.56.102:28001
use admin
cfg={_id:"configsvr",members: [{_id:0,host:"192.168.56.102:28001"},{_id:1,host:"192.168.56.102:28002"}]}
rs.initiate(cfg)
再登录103下的rs001的任一服务
mongo 192.168.56.103:27003
执行:
config={_id:'rs001', members: [{_id:0, host: '192.168.56.103:27003'},{_id: 1, host: '192.168.56.103:27004'},{_id: 2, host:'192.168.56.103:27005'}]}
rs.initiate(config)
同理,登录104上的rs002的任意服务
执行:
config={_id:'rs002', members: [{_id:0, host: '192.168.56.104:27006'},{_id: 1, host: '192.168.56.104:27007'},{_id: 2, host:'192.168.56.104:27008'}]}
rs.initiate(config)
配置路由服务器
在101虚拟机中的文件夹/usr/mongo-router/node01下添加配置文件mongodb.cfg,内容如下:
# 配置服务器副本集名字和地址
configdb=configsvr/192.168.56.102:28001,192.168.56.102:28002
# 日志文件位置
logpath=/usr/mongo-router/node01/logs/mongodb.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork=true
bind_ip=192.168.56.101
port=30000
然后启动路由服务
注意,此处不用mongod,而是用mongos
然后登录到路由服务器
mongo 192.168.56.101:30000
然后添加数据副本集
sh.addShard("rs001/192.168.56.103:27003")
sh.addShard("rs002/192.168.56.104:27006")
验证
再接着执行如下命令:
use testdb
sh.enableSharding("testdb")
sh.shardCollection("testdb.goods",{name:"hashed"})
for(var i=1;i<=1000;i++) db.goods.insert({name:"name"+i,seq:i})
会在虚拟机103、104下的主库下创建testdb,创建goods这个Collection,还有1000条数据,平均分布在rs001和rs002
db.goods.count()的值为1000
可以登录rs001和rs002里任一个库去验证一下
注意,登录rs001和rs002里的主库是没问题的
mongo 192.168.56.103:27003
use testdb
db.goods.count()
结果516条
mongo 192.168.56.104:27006
use testdb
db.goods.count()
结果484条
如果是从库,登录后,先执行如下命令:
db.getMongo().setSlaveOk()
再查数据数量
use testdb
db.goods.count()
结果显示跟主库一致
-----------------------------------------------------------------------------------------------------------
有错误请指正,3Q~