副本集+分片部署-仲裁
服务器
172.23.143.207 39.108.195.15 172.23.143.208 47.107.99.166 172.23.143.209 39.108.17.53
| 服务器一 | 服务器二 | 服务器三 | 端口 | |
|---|---|---|---|---|
| 外网 | 39.108.195.15 | 47.107.99.166 | 39.108.17.53 | |
| 内网 | 172.23.143.207 | 172.23.143.208 | 172.23.143.209 | |
| 路由服务器:寻址 | mongos | mongos | mongos | 27011 |
| 配置服务器:保存配置 | config | config | config | 27012 |
| 分片1:保存数据 | shard1(主) | shard1(从) | shard1(仲裁) | 27001 |
| 分片2:保存数据 | shard2(仲裁) | shard2(主) | shard2(从) | 27002 |
| 分片3:保存数据 | shard3(从) | shard3(仲裁) | shard3(主) | 27003 |
备注:
1、副本集是为了备份数据,可以配置读写分离(主负责写,从负责同步数据和读)
2、先做好全局的服务安排,为后续的开启服务和编辑配置文件做好准备。
源码包安装
cd /usr/local/src/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.13.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.13.tgz
mv mongodb-linux-x86_64-rhel70-4.4.13 /usr/local/mongodb
#查看版本
/usr/local/mongodb/bin/mongo --version
管理用户
#创建用户,专门启动MongoDB服务
groupadd umongo
useradd -s /sbin/nologin -M -g umongo umongo
#
chown -R umongo:umongo /usr/local/mongodb/ && \
chmod -R 755 /usr/local/mongodb/etc && \
chmod 400 /usr/local/mongodb/etc/energy-rc.key
#创建MongoDB相关目录,因为/www 目录是磁盘的挂载点,所以相关的服务都放在该目录下
mkdir -p /www/datamongodb/mongos/{log,data,run} && \
mkdir -p /www/datamongodb/config/{log,data,run} && \
mkdir -p /www/datamongodb/shard1/{log,data,run} && \
mkdir -p /www/datamongodb/shard2/{log,data,run} && \
mkdir -p /www/datamongodb/shard3/{log,data,run} && \
chown -R umongo:umongo /www/datamongodb/
启动服务
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/config.conf
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/shard1.conf
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/shard2.conf
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/shard3.conf
#上面的config、shard 服务都启动并且配置好副本集后再启动mongos服务,否则启动失败。
sudo -u umongo /usr/local/mongodb/bin/mongos -f /usr/local/mongodb/etc/mongos.conf
停止服务
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/config.conf --shutdown
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/shard1.conf --shutdown
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/shard2.conf --shutdown
sudo -u umongo /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/shard3.conf --shutdown
#停止mongos,因为mongos是无状态的,直接使用kill方式
ps -ef | grep mongos | grep -v grep | awk '{print $2}' | xargs kill -9
登录mongos
#超级管理员
/usr/local/mongodb/bin/mongo --host 127.0.0.1 --port 27011 -u useradmin --authenticationDatabase "admin" -p '12345678'
#公网登录,测试新加坡服务是否能连接深圳
/usr/local/mongodb/bin/mongo --host 39.108.195.15 --port 27011 -u useradmin --authenticationDatabase "admin" -p '12345678'
/usr/local/mongodb/bin/mongo --host 47.107.99.166 --port 27011 -u useradmin --authenticationDatabase "admin" -p '12345678'
/usr/local/mongodb/bin/mongo --host 39.108.17.53 --port 27011 -u useradmin --authenticationDatabase "admin" -p '12345678'
#超级管理员-交互模式下登录
mongos> db.auth("useradmin", "12345678")
#数据库用户
/usr/local/mongodb/bin/mongo --host 127.0.0.1 --port 27011 -u ukline --authenticationDatabase "admin" -p '12345678'
/usr/local/mongodb/bin/mongo --host 39.108.17.53 --port 27011 -u ukline --authenticationDatabase "admin" -p '12345678'
#MongoDB Compass工具登录
mongodb://useradmin:12345678@47.107.99.166:27011/admin
mongodb://useradmin:12345678@39.108.195.15:27011/admin
mongodb://useradmin:12345678@39.108.17.53:27011/admin

mongodb:// 前缀,代表这是一个ConnectionStringURI连接地址。
username:password@ 连接MongoDB实例的用户名和密码,使用英文号(:)分隔。
hostXportX: 实例的连接地址和端口号。
/database: 鉴权数据库名,即数据库账号所属的数据库。
?options: 指定额外的连接选项。
MongoDB shell 执行
/usr/local/mongodb/bin/mongo --host 127.0.0.1 --port 27011 -u useradmin --authenticationDatabase "admin" -p '12345678' --eval "printjson(db.users.findOne())"
/usr/local/mongodb/bin/mongo --host 127.0.0.1 --port 27011 -u useradmin --authenticationDatabase "admin" -p '12345678' ./aa.js
MongoDB副本集+分片搭建
config 副本集配置
#登录任意一台服务器,初始化配置副本集
/usr/local/mongodb/bin/mongo --port 27012
#创建配置
var conf={
"_id": "config",
"members" : [
{"_id" : 0, "host" : "172.23.143.207:27012"},
{"_id" : 1, "host" : "172.23.143.208:27012"},
{"_id" : 2, "host" : "172.23.143.209:27012"}
]
};
#初始化副本集
rs.initiate(conf);
#查看副本集状态
rs.status();
重新配置现有副本集,覆盖现有副本集配置 rs.reconfig(conf, {force:true});
注意:其中“_id”: “config” 应与配置文件中配置的 replicaction.replSetName 一致,“members” 中的 “host” 为三个节点的 ip 和 port
shard1 副本集配置
#在172.23.143.207服务器登录
/usr/local/mongodb/bin/mongo --port 27001
#创建配置
var conf={
"_id": "shard1",
"members" : [
{"_id" : 0, "host" : "172.23.143.207:27001", "priority": 2},
{"_id" : 1, "host" : "172.23.143.208:27001", "priority": 1},
{"_id" : 2, "host" : "172.23.143.209:27001", "arbiterOnly": true}
]
}
#初始化副本集
rs.initiate(conf);
shard2 副本集配置
#在172.23.143.208服务器登录
/usr/local/mongodb/bin/mongo --port 27002
#创建配置
var conf={
"_id": "shard2",
"members" : [
{"_id" : 0, "host" : "172.23.143.208:27002", "priority": 2},
{"_id" : 1, "host" : "172.23.143.209:27002", "priority": 1},
{"_id" : 2, "host" : "172.23.143.207:27002", "arbiterOnly": true}
]
}
#初始化副本集
rs.initiate(conf);
shard3 副本集配置
#在172.23.143.209服务器登录
/usr/local/mongodb/bin/mongo --port 27003
#创建配置
var conf={
"_id": "shard3",
"members" : [
{"_id" : 0, "host" : "172.23.143.209:27003", "priority": 2},
{"_id" : 1, "host" : "172.23.143.207:27003", "priority": 1},
{"_id" : 2, "host" : "172.23.143.208:27003", "arbiterOnly": true}
]
}
#初始化副本集
rs.initiate(conf);
添加分片到mongos
#启动mongos
sudo -u umongo /usr/local/mongodb/bin/mongos -f /usr/local/mongodb/etc/mongos.conf
#登录mongos
/usr/local/mongodb/bin/mongo --port 27011
mongos> sh.getBalancerState() #首先确认balancer已经开启
mongos> sh.setBalancerState(true) #如果没有开启则开启balance
mongos> sh.addShard("shard1/172.23.143.207:27001,172.23.143.208:27001,172.23.143.209:27001")
mongos> sh.addShard("shard2/172.23.143.208:27002,172.23.143.209:27002,172.23.143.207:27002")
mongos> sh.addShard("shard3/172.23.143.209:27003,172.23.143.207:27003,172.23.143.208:27003")
#扩展:移除分片操作
mongos> use admin
mongos> db.runCommand({removeShard: "shard2"})
mongos> db.runCommand({removeShard: "shard3"})
开启登录验证和内部验证
创建用户
MongoDB的权限框架中,用户可使用的角色有
- **read: ** 允许用户读取指定的数据库。
- readWrite: 授予用户对指定数据库的读写权限。
- dbAdmin: 允许用户在指定的数据库中执行管理功能,例如创建或删除索引、查看计或访问 system.profile 集合。
- userAdmin: 允许用户向system.users集合中写入内容。具有该权限的用户可在该数据库创建、删除和管理用户。
- dbOwner: readWrite dbAdmin 和userAdmin 角色的组合。
- clusterManager: 只在admin 数据库中可用。为用户赋予针对整个集群的管理功能,不能访问数据功能。
- clusterMonitor: 只在admin 数据库中可用。访问统计信息和收集统计信息的命令。
- hostManager: 只在admin 数据库中可用。管理和监控主机级别的服务。
- clusterAdmin: 只在admin数据库中可用。为用户赋予所有分片和复制集相关函数的完全管理权限。也可以与clusterManager、clusterMonitor 和 hostManager 一起使用。
- backup: 只在admin 数据库中可用。授予备份整个系统所需的最低访问权限。
- restore: 只在admin数据库中可用。授予恢复整个系统所需的最低访问权限。
- readAnyDatabase: 只在admin 数据库中可用。为用户赋予所有数据库的读权限。
- readWriteAnyDatabase: 只在admin 数据库中可用。为用户赋予所有数据库的读写权限。
- userAdminAnyDatabase: 只在admin 数据库中可用为用户赋予所有数据库的userAdmin权限。
- dbAdminAnyDatabase: 只在 admin 数据库中可用。为用户赋予所有数据库的 dbAdmin权限。
#登录任意一个mongos服务器,执行创建用户操作
#创建管理用户
use admin;
db.createUser({ user:"useradmin", pwd:"12345678", roles:[{role: "root", db: "admin"}] });
db.grantRolesToUser("useradmin", ["clusterAdmin"]);
db.grantRolesToUser("useradmin", ["userAdminAnyDatabase"]);
db.grantRolesToUser("useradmin", ["readWriteAnyDatabase"]);
#创建数据库用户
use admin;
db.createUser({user:'userkline',pwd:'12345678',roles:['readWriteAnyDatabase']});
#查看MongoDB用户
use admin;
show users;
超级管理员创建成功后,即可停止所有mongo服务,命令详见:[ 停止服务 ]
创建Keyfiles
使用Keyfiles进行内部认证,在其中一台服务器上创建Keyfiles
openssl rand -base64 756 > /usr/local/mongodb/etc/energy-rc.key
chmod 400 /usr/local/mongodb/etc/energy-rc.key
把energy-rc.key文件copy到其它2台服务器上,并赋予 400 权限。
开启认证-config、shard1、shard2、shard3
/usr/local/mongodb/etc/config.conf
/usr/local/mongodb/etc/shard1.conf
/usr/local/mongodb/etc/shard2.conf
/usr/local/mongodb/etc/shard3.conf
分别在以上配置文件中开启认证
security:
authorization: "enabled"
clusterAuthMode: "keyFile"
keyFile: /usr/local/mongodb/etc/energy-rc.key
开启认证-mongos
/usr/local/mongodb/etc/mongos.conf 配置文件中开启认证
security:
clusterAuthMode: "keyFile"
keyFile: /usr/local/mongodb/etc/energy-rc.key
参考:https://www.cnblogs.com/sz-wenbin/p/11022563.html
配置文件处理后,启动所有服务,并使用账号密码登录试试。
使用示例
创建数据库 kline_hb kline_ba kline_okx
mongos> use kline_hb;
mongos> use kline_ba;
mongos> use kline_okx;
#对以上数据库开启分片功能
mongos> use admin;
mongos> db.runCommand({"enablesharding": "kline_hb"});
mongos> db.runCommand({"enablesharding": "kline_ba"});
mongos> db.runCommand({"enablesharding": "kline_okx"});
#创建集合
db.createCollection("users") # users集合是测试用的
db.createCollection("h1min_2")
#创建索引
db.h1min_2.ensureIndex({sid: 1, t: -1}, {unique: true})
db.h1min_2.createIndex({sid: 1, t: -1}, {unique: true})
db.h1min_2.getIndexes()
#对users 集合的 _id 按hash进行分片
db.runCommand({"shardcollection":"kline_hb.users", "key":{_id: "hashed"}})
db.runCommand({"shardcollection":"kline_hb.h1min_2", "key":{sid: 1}})
插入数据试试
use kline_hb
db.users.insert({uid: 1, name: "aaa"});
db.users.insert({uid: 2, name: "bbb"});
db.users.insert({uid: 3, name: "ccc"});
db.users.insert({uid: 4, name: "ddd"});
db.users.insert({uid: 5, name: "eee"});
db.users.insert({uid: 6, name: "fff"});
db.users.insert({uid: 7, name: "ggg"});
db.users.insert({uid: 8, name: "hhh"});
db.users.insert({uid: 9, name: "iii"});
db.users.insert({uid: 10, name: "jjj"});
db.users.insert({uid: 11, name: "kkk"});
db.users.insert({uid: 12, name: "lll"});
db.users.insert({uid: 13, name: "mmm"});
db.users.insert({uid: 14, name: "nnn"});
db.users.find({});