一:环境
1.服务器操作系统:ubuntu16.04
2. mongodb版本:mongdb3.6.12 (注意:MongoDB版本可能跟配置文件有一些细节差异,需自行调节,下面会详细指明)
二:开始安装MongoDB。
第一步 - 安装公钥
Ubuntu软件包管理器apt(高级软件包工具)需要软件分销商的GPG密钥来确保软件包的一致性和真实性。 运行此命令将MongoDB密钥导入到您的服务器
sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
第二步 - 创建源列表文件MongoDB
使用以下命令在/etc/apt/sources.list.d/中添加一个MongoDB源:
echo “deb repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse” | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
第3步 – 更新存储库 使用apt命令更新存储库:
sudo apt-get update
第4步 – 安装MongoDB (环境搭建结束!)
sudo apt-get install -y mongodb-org
三:开始配置MongoDB集群
第1步 - 首先配置mongod.conf文件。我有三台服务器,因此每台服务器都需要配置3个mongod.conf文件。一共9个mongod.conf
安装完mongodb目录下默认就有一个mongod.conf文件,复制2份出来,命名mongod2.conf,mongod3.conf。一共(mongod.conf,mongod2.conf,mongod3.conf)第一台服务器。依次内推,每台服务器都需要如此。
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /opt/mongo/data/db
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /opt/mongo/logs/mongodb.log
# network interfaces
net:
port: 37017 (mongod.conf配置37017,mongod2.conf配置37018,mongod3.conf配置37019)
bindIp: (服务器机器:私有访问ip地址)(测试机:ip地址)
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
还有一种配置版本,是我参考的配置版本。但是根据服务器环境与mongodb版本不一样。在这里也把配置写出来。根据自身环境配置就好。 环境:服务器Centos --- mongodb:4.0.6 (此处一点要看仔细!这是不同的环境的配置。重要的事情说三遍!)
fork=true
#数据路径
dbpath=/opt/mongo/data/db ---根据自身路径
port=37017 (mongod.conf配置37017,mongod2.conf配置37018,mongod3.conf配置37019)
bind_ip=(服务器机器:私有访问ip地址)(测试机:ip地址)
#日志文件路径
logpath=/opt/mongo/logs/mongodb.log
logappend=true
#复制集名称
replSet=shardRep1 (mongod.conf配置shardRep1,mongod2.conf配置shardRep2,mongod3.conf配置shardRep3,三台服务都一样)
smallfiles=true
#分片集群必须要有的属性
shardsvr=true
第2步 - 启动副本集
此处是 ubuntu18.04 Mongodb3.6的环境,启动命令。(启动命令根据自己的配置路径去选择 用绝对路径还是相对路径启动)
mongod -f /etc/mongod.conf --shardsvr --replSet shardRep1 &
mongod -f /etc/mongod2.conf --shardsvr --replSet shardRep2 &
mongod -f /etc/mongod3.conf --shardsvr --replSet shardRep3 &
此处是 Centos --- mongodb:4.0.6 的环境,启动命令
mongod -f /etc/mongod.conf
mongod -f /etc/mongod2.conf
mongod -f /etc/mongod3.conf
看的仔细的可以发现,启动命令后面没有复制集名称和shardsvr参数,这是因为我在ubuntu18.04 Mongodb3.6的环境配置在mongod.conf文件中启动会报错,而我看别人的配置Centos --- mongodb:4.0.6中直接写在mongod.conf文件中启动则没有问题,推测应该与系统环境和Mongodb版本有关。各位配置时,可以先写入到配置文件中启动,会省很多事!
第3步 - 初始化副本集
1.初始化第一台服务器
(1)、在第一台服务器上执行以下操作:
1.登录mongo,根据自身配置路径启动。
mongo --port 37017 127.0.0.1(第一台ip写服务器的ip地址,不要用127.0.0.1,(Private-ip))
2.use admin
3.config = {
_id : "shardRep1",
members : [
{_id : 0, host : "127.0.0.1(第一台服务器的ip地址,不要用127.0.0.1,):37017" },
{_id : 1, host : "127.0.0.1(第二台服务器的ip地址,不要用127.0.0.1,):37017" },
{_id : 2, host : "127.0.0.1(第三台服务器的ip地址,不要用127.0.0.1,):37017" }
]
}
4.//初始化副本集配置
rs.initiate(config);
5.//查看副本集配置
rs.status();
2.初始化第二台服务器
(1)、在第二台服务器上执行以下操作:
1.mongo --port 37018 127.0.0.1 (第二台ip写服务器的ip地址,不要用127.0.0.1,(Private-ip))
2.use admin
3.config = {
_id : "shardRep2",
members : [
{_id : 0, host : "127.0.0.1(第一台服务器的ip地址,不要用127.0.0.1,):37018" },
{_id : 1, host : "127.0.0.1(第二台服务器的ip地址,不要用127.0.0.1,):37018" },
{_id : 2, host : "127.0.0.1(第三台服务器的ip地址,不要用127.0.0.1,):37018" }
]
}
4.//初始化副本集配置
rs.initiate(config);
5.//查看副本集配置
rs.status();
3.初始化第三台服务器
(3)、在第三台服务器上执行以下操作:
1.mongo --port 37019 127.0.0.1(第二台ip写服务器的ip地址,不要用127.0.0.1,(Private-ip))
2.use admin
3.config = {
_id : "shardRep3",
members : [
{_id : 0, host : "127.0.0.1(第一台服务器的ip地址,不要用127.0.0.1,):37019" },
{_id : 1, host : "127.0.0.1(第二台服务器的ip地址,不要用127.0.0.1,):37019" },
{_id : 2, host : "127.0.0.1(第三台服务器的ip地址,不要用127.0.0.1,):37019" }
]
}
4.//初始化副本集配置
rs.initiate(config);
5.//查看副本集配置
rs.status();
如果,每台副本集都初始化成功,并查看副本集配置 无错误信息,则第一步配置成功。
第4步 - 搭建config节点复制集
1.在三台服务器上分别创建config节点配置文件:mongo-cfg.conf (注意三台服务器都要有,但是只需要一个就够了。)
systemLog:
destination: file
#日志存储位置 注意检查此路径 此文件是否存在
path: /data/mongo/mongo-cfg/logs/mongodb.logs
logAppend: true
storage:
journal:
enabled:true
#数据存储位置 注意检查此路径 此文件是否存在
dbPath: /data/mongo/mongo-cfg/data
#是否一个库一个文件夹
directoryPerDB: true
wiredTiger:
engineConfig:
#最大使用cache(根据真实情况自行调节)
cacheSizeGB: 1
#是否将索引也按照数据库名单单独存出
directoryForIndexes: true
collectionConfig:
#表压缩配置
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
#IP地址
bindIp: 127.0.0.1 (第一台服务器IP)
#端口
port: 20001
replication:
oplogSizeMB: 2048
#配置节点的复制集名字 此处与mongd.conf配置名称一样,但是不会报错,也不会生效,还是需要加在命令行后面,centos mongodb 4.0.6可加在此处。
repliSetName: configRepl
sharding:
clusterRole: configsvr
processManagement:
fork: true
2.启动配置复制集
跟启动mongd.conf 类似。也有版本因素。分别启动三台服务器的mongo-cfg.conf
mongod -f /etc/mongo-cfg.conf --configsvr --replSet configRepl &
3.登录配置节点 (注意:登录配置节点只需要随便挑选一台服务器就好了,登录进去)
mongo -host 127.0.0.1(任意一台服务器) -port 20001
4.初始化命令, 初始化完成后,大概几秒后,三台服务器就会自动选择一台生成主从关系。
rs.initiate(
{
_id : "configRepl",
members : [
{ _id : 0, host : "127.0.0.1(第一台服务器ip):20001" },
{ _id : 1, host : "127.0.0.1(第一台服务器ip):20001" },
{ _id : 2, host : "127.0.0.1(第一台服务器ip):20001" }
]
}
)
第5步 -- 配置 mongos.conf文件,(在第一台服务器中配置,只需要配置一个即可,也可以配置多个但是一个服务器只能有一个)
destination: file
path: /data/mongos/log/mongos.log
logAppend: true
net:
bindIp: 127.0.0.1 (你选择配置mongos.conf的这台服务器的ip)
port: 27017
sharding:
configDB: configRepl/127.0.0.1:20001,127.0.0.1:20001,127.0.0.1:20001
# 举例:
#configDB: configRepl/192.168.0.23:20001,192.168.0.24:20001,192.168.0.25:20001
1.启动mongos
mongos -f /etc/mongos.conf &
2.登录mongos节点
mongo 127.0.0.1:27017 (ip为你选择配置mongos.conf的服务器ip)
3.在登录了mongos之后,需要切换admin:use admin
use admin
4.添加shard1、shard2、shard3复制集:
db.runCommand( {addshard : "shardRep1/192.168.0.23:37017,192.168.0.24:37017,192.168.0.25:37017",name:"shard1"} )
db.runCommand( {addshard : "shardRep2/192.168.0.23:37018,192.168.0.24:37018,192.168.0.25:37018",name:"shard2"} )
db.runCommand( {addshard : "shardRep3/192.168.0.23:37019,192.168.0.24:37019,192.168.0.25:37019",name:"shard3"} )
5.列举分片
db.runCommand( {listshards : 1 } )
6.查看分片状态
sh.status();
四:配置接近尾声,现在测试。
第1步 - 因为我们没有库,创建一个库。
db.runCommand( {enablesharding : "testdb" } )
第2步 - 数据库分片,必须设置一个字段,并且这个字段必须为索引。(空集合系统会自动创建,如果不是空集合,必须先创建索引)
db.runCommand( { shardcollection : "testdb.users", key : {id : 1} } )`
第3步 - 添加测试数据,
var arr = [];
for (var i = 0; i < 1000000; i++) {
var uid = i;
var name = "schweini" + i;
arr.push({"id":uid, "name":name});
}
db.users.insertMany(arr);
到这里就结束了。
分片均衡器开启时间:当其中有一个分片的数据大小超过了64M时,他就会自动负载均衡。
描述:shard1分片中的数据为1条,shard2分片中的数据为75W条,shard3分片中的数据为150W条,现在shard3中的数据超过了chunk的阀门值它就会自动为 shard1 shard2 shard3自动均衡数据。让他们平均。
不了解 mongodb集群工作原理,以及一些细节问题,查看上篇文章。