副本集+分片部署-仲裁

服务器

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

image-20220331163312917

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({});