上图选自于mongoDB官方网站
由上图可知:搭建一个高可用.可水平扩展的mongodb分片集群包含三个方面:
1.router路由服务器 用来接收用户请求,并且做分发处理.本次使用3台机器搭建路由服务集群;
2.config servers配置服务器 存储所有分片集群的配置信息,本次使用3台机器搭建配置服务集群
3.shard分片服务器 存储实际数据, 这里每个分片都可以搭建副本集群,本次搭建策略是一主一从一仲裁, 3台机器组成一个分片副本集,本次搭建了两个分片副本集;
Linux下mongoDB 4.2.2版本安装包下载(本文采用版本)
mongoDB 其它环境或版本安装包下载(读者自行选择)
服务器 | ip | port |
---|---|---|
route1 | xxx.xxx.xxx.243 | 27017 |
route2 | xxx.xxx.xxx.244 | 27017 |
route3 | xxx.xxx.xxx.245 | 27017 |
conf1 | xxx.xxx.xxx.246 | 27019 |
conf2 | xxx.xxx.xxx.247 | 27019 |
conf3 | xxx.xxx.xxx.248 | 27019 |
shard1_primary | xxx.xxx.xxx.249 | 27018 |
shard1_secondary | xxx.xxx.xxx.250 | 27018 |
shard1_arbiter | xxx.xxx.xxx.251 | 27018 |
shard2_primary | xxx.xxx.xxx.28 | 27018 |
shard2_secondary | xxx.xxx.xxx.29 | 27018 |
shard2_arbiter | xxx.xxx.xxx.30 | 27018 |
本次搭建模仿生产环境,使用12台服务器,读者可以根据实际资源情况对服务器做适当增减;
解压:
tar -zxvf mongodb-linux-x86_64-rhel70-4.2.2.tgz
剪切到:/opt/mongodb目录下
mv mongodb-linux-x86_64-rhel70-4.2.2 /opt/mongodb
目录结构如下:
这里读者可以根据个人喜好 或者实际服务器目录大小决定实际存放目录
vim /etc/profile
追加:
export PATH=$PATH:/opt/mongodb/bin
使其立即生效:
source /etc/profile
在任意一台机器上执行以下命令生产秘钥文件::
openssl rand -base64 741 > /opt/mongodb/keyfile/mongodb-keyfile
修改文件权限,默认权限太高,启动会报错:
chmod 400 /opt/mongodb/keyfile/mongodb-keyfile
把生成好的秘钥文件复制到其余服务器上,修改权限;
至此准备工作完成
/opt/mongodb/config/conf/config.yaml
/opt/mongodb/config/db
/opt/mongodb/config/log
其中config.yaml配置文件如下:
sharding:
clusterRole: configsvr #配置集群角色
replication:
replSetName: config #配置集群副本集名称 可以随意取
net:
port: 27019 #启动端口 configsvr默认启动端口为 27019
bindIp: 0.0.0.0 #允许被任意ip访问
systemLog:
destination: file #和path配合使用 如果指定此值 则必须指定日志文件路径
logAppend: true #重启时 日志策略 true 追加 false 创建新的日志文件
path: /opt/mongodb/config/log/config.log #日志路径
storage:
dbPath: /opt/mongodb/config/db #数据库路径
journal:
enabled: true #保证数据文件的有效性和可恢复性
processManagement:
fork: true #后台启动
pidFilePath: /opt/mongodb/config/log/config.pid #mongodb进程日志文件
timeZoneInfo: /usr/share/zoneinfo #时区有关 可以不做配置
#security:
#keyFile: /opt/mongodb/keyfile/mongodb-keyfile #秘钥文件 用于集群内部认证
mongod -f /opt/mongodb/config/conf/config.yaml
可以使用ps -ef|grep mongod 查看服务有没有启动成功;
mongo --port 27019
注意 _id:副本集名称要和config.yaml中的replSetName配置相同;
只需初始化一次即可
rs.initiate(
{
_id: "config",
configsvr: true,
members: [
{ _id : 0, host : "xxx.xxx.xxx.246:27019" },
{ _id : 1, host : "xxx.xxx.xxx.247:27019" },
{ _id : 2, host : "xxx.xxx.xxx.248:27019" }
]
}
)
查看集群状态:
rs.status();
注意:1.这里必须要连接到primary节点下创建用户,在secondary节点上创建用户会报错(笔者亲测);
2.连接上primary节点后,一定要切换到admin数据库下创建root用户:
use admin;
db.createUser(
{
user: "root",
pwd: "root",
roles: [ { role: "root", db: "admin" } ]
}
);
连接时登录:
mongo 127.0.0.1:27019/admin -u root -p root
连接后登录
mongo --port 27019 #连接到mongod服务器
use admin #切换到admin数据库
db.auth('root','root') #登录 返回1说明登录成功
登录后可以使用:show dbs; rs.status()等验证;
至此conf配置服务器集群搭建完成;
/opt/mongodb/shard1/conf/shard1.yaml
/opt/mongodb/shard1/db
/opt/mongodb/shard1/log
其中shard1.yaml配置文件如下:
sharding:
clusterRole: shardsvr
replication:
replSetName: shard1
net:
port: 27018
bindIp: 0.0.0.0
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/shard1/log/shard1.log
storage:
dbPath: /opt/mongodb/shard1/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/mongodb/shard1/log/shard1.pid
timeZoneInfo: /usr/share/zoneinfo
#security:
#keyFile: /opt/mongodb/keyfile/mongodb-keyfile
mongod -f /opt/mongodb/shard1/conf/shard1.yaml
可以使用ps -ef|grep mongod 查看服务有没有启动成功;
mongo --port 27018
注意 _id:副本集名称要和shard1.yaml中的replSetName配置相同;
这里只能连接到primary或secondary节点上初始化,连接到仲裁节点初始化会报错(笔者亲测),只需初始化一次即可
rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "xxx.xxx.xxx.249:27018" ,priority : 2 },
{ _id : 1, host : "xxx.xxx.xxx.250:27018" ,priority : 1 },
{ _id : 2, host : "xxx.xxx.xxx.251:27018" ,arbiterOnly :true }
]
}
)
注意:此种初始化方式是指定3台shard1节点分别为一主一从一仲裁(本次搭建采用);
其中arbiterOnly :true配置意思是指定该机器为仲裁机器,此机器不存业务数据,故此不需要太好的配置;priority 参数越高 越有可能成为primary节点;
拓展:这里还有另外一种初始化的方式 :即一主两从,不指定仲裁机器,每个分片只有两台服务器可采用此种策略:
rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "xxx.xxx.xxx.249:27018" },
{ _id : 1, host : "xxx.xxx.xxx.249:27018" },
{ _id : 2, host : "xxx.xxx.xxx.249:27018" }
]
}
)
查看集群状态:
rs.status();
注意:1.这里必须要连接到primary节点下创建用户,在secondary节点上创建用户会报错(笔者亲测);
2.连接上primary节点后,一定要切换到admin数据库下创建root用户:
use admin;
db.createUser(
{
user: "root",
pwd: "root",
roles: [ { role: "root", db: "admin" } ]
}
);
连接时登录:
mongo 127.0.0.1:27018/admin -u root -p root
连接后登录
mongo --port 27018 #连接到mongod服务器
use admin #切换到admin数据库
db.auth('root','root') #登录 返回1说明登录成功
登录后可以使用:show dbs; rs.status()等验证;
至此shard1分片集群搭建完成;
shard2分片集群搭建通shard1基本相同 注意配置文件中副本集名称改动,及相应启动项改动即可;
至此shard1 shard2 由6台机器组成的两个分片集群搭建完成;
/opt/mongodb/route/conf/route.yaml
/opt/mongodb/route/log
此集群只做请求分发,不存储具体数据,故此不需要db目录,
其中route.yaml配置文件如下:
sharding:
configDB: config/xxx.xxx.xx.246:27019,xxx.xxx.xx.247:27019,xxx.xxx.xx.248:27019
net:
port: 27017
bindIp: 0.0.0.0
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/route/log/route.log
processManagement:
fork: true
pidFilePath: /opt/mongodb/route/log/route.pid
timeZoneInfo: /usr/share/zoneinfo
security:
keyFile: /opt/mongodb/keyfile/mongodb-keyfile
mongos -f /opt/mongodb/route/conf/route.yaml
注意:这里启动的时候和config集群shard集群不同,这里的security认证要打开,不然会报错(笔者踩过的坑),
这里的登录密码就是config集群配置的用户名和密码;上面介绍的两种登录方式在这里也适用;这里用mongo连接的时候 端口可以不指定 因为mongo默认的启动端口就是27017 和我们这边设置的相同;
这里使用root用户登录:
mongo;
use admin;
db.auth('root','root');
把shard1 shard2分片集群都添加进去,每个分片添加一个节点即可,主 从都可以;
use admin;
sh.addShard( "shard1/xxx.xxx.xxx.249:27018");
sh.addShard( "shard2/xxx.xxx.xxx.29:27018");
至此一个带有权限控制的 可水平扩容的分片mongodb4.2.2版本集群搭建完成;
登录到任意一台route服务器,已root用户登录,并创建新用户;
mongo;
use admin;
db.auth('root','root');
use database01;
db.createUser(
{
user: "readWrite",
pwd: "readWrite",
roles: [ { role: "readWrite", db: "database01" } ]
}
)
以上命令意思是先已root角色登录到服务器,再切换到 database01数据库下 创建一个角色为: readWrite的用户;这里在哪个数据库创建用户,登录的时候就在哪个数据库认证;