暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mongo-分片安装手册

上官吕布 2020-04-15
158

MongoDB 主要分层

-1- 访问入口层 mongos

-2- 配置服务器层 mongo-configserver

-3- 分片层(副本) mongo-replica

三层之间的关系是:mongos 通过 config 查找数据所在的分片,从而获取数据

配置 mongos 层需要第一时间指定 config 层,所以这里部署流程是:2,1,3 ,分片层可提前安装好,最后安装也行,所以也可以是: 3, 2, 1

-4- 启用访问数据库的 【权限管理】

-5- 在所有层增加 【集群的权限管控】 也就是启动 security - keyfile 配置参数

部署按照 3, 2,1,4

特别想吐槽的:[

不知道为什么,全世界这么多系统软件,
搞个什么乱七八糟的安装流程干甚,
没有一键两键解决不了的问题,
所以那些彭吹--人性化--高可用--
都是假的.
所以我经常 恼火 一些事情

比如:
既然拿出来的东西,搞那么复杂干嘛,不能点一下就直接用??。
还有,那些餐厅做的饭菜,本来就应该是新鲜、美味、好吃、安全的。。。。。
就不要搞什么噱头了吧(比如:我家的菜是新鲜的,肉是刚宰的。我家的是全世界最安全的。
我家的肉不是冲水的。。。养的鸡不是假饲料养的。。)
拿出来卖的东西,不应该就是好吃又安全,质量就应该好的么。。。。

再比如:爱奇艺,已经是VIP了,它还搞个超前点播,再收一层费。套路得人心?。。

我的老铁呀。。。。

复制

]

好吧,回到正题:

拉取 3.6 版本

#创建自定义网络(我自己笔记本,所以想固定下IP)

docker network create --subnet=172.19.0.0/16


docker pull mongo:3.6

mkdir -p /Users/yuandeqiao/docker/mongo/mongo36/conf
mdir='/Users/yuandeqiao/docker/mongo/mongo36/conf'
cd $mdir
touch configs.cnf mongod.cnf mongos.cnf mongodb-keyfile

#must be between 6 and 1024 chars
echo 'abcdcba' > mongodb-keyfile
chmod 600 mongodb-keyfile

#查看 mongod.cnf 配置文件
$ cat mongod.cnf
profile=2
slowms=100
smallfiles = true
directoryperdb = true
storageEngine = wiredTiger

keyFile=/etc/mongodb-keyfile

serviceExecutor = adaptive

syncdelay=10



#查看 configs.cnf 配置文件
$ cat configs.cnf
dbpath=/data/db/
logpath=/tmp/configs.log
logappend = true
port=27017
bind_ip = 0.0.0.0
journal = true
quiet = true
storageEngine = wiredTiger
smallfiles = true

keyFile=/etc/mongodb-keyfile

serviceExecutor = adaptive


#查看 mongos.cnf 配置文件
$ cat mongos.cnf

keyFile=/etc/mongodb-keyfile

serviceExecutor = adaptive


#查看 mongodb-keyfile
$ cat mongodb-keyfile

abcdcba



# 开始安装:我只安装两个分片,也可以安装多个分片,

那么下面可以复制 “第N个分片”,修改一下名字什么的。

-3- 分片层(副本)

# 第一个分片
docker run --name shard10 \
--privileged \
--hostname shard10 \
--net extnetwork \
-v $mdir/mongod.cnf:/etc/mongod.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.31 \
-d mongo:3.6 --shardsvr --replSet "shard1" --port 27017 \
-f /etc/mongod.cnf

docker run --name shard11 \
--privileged \
--hostname shard10 \
--net extnetwork \
-v $mdir/mongod.cnf:/etc/mongod.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.32 \
-d mongo:3.6 --shardsvr --replSet "shard1" --port 27017 \
-f /etc/mongod.cnf

docker run --name shard12 \
--privileged \
--hostname shard10 \
--net extnetwork \
-v $mdir/mongod.cnf:/etc/mongod.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.33 \
-d mongo:3.6 --shardsvr --replSet "shard1" --port 27017 \
-f /etc/mongod.cnf

# 第二个分片
docker run --name shard20 \
--privileged \
--hostname shard20 \
--net extnetwork \
-v $mdir/mongod.cnf:/etc/mongod.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.34 \
-d mongo:3.6 --shardsvr --replSet "shard2" --port 27017 \
-f /etc/mongod.cnf

docker run --name shard21 \
--privileged \
--hostname shard21 \
--net extnetwork \
-v $mdir/mongod.cnf:/etc/mongod.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.35 \
-d mongo:3.6 --shardsvr --replSet "shard2" --port 27017 \
-f /etc/mongod.cnf

docker run --name shard22 \
--privileged \
--hostname shard22 \
--net extnetwork \
-v $mdir/mongod.cnf:/etc/mongod.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.36 \
-d mongo:3.6 --shardsvr --replSet "shard2" --port 27017 \
-f /etc/mongod.cnf

#初始化一分片
docker exec -it shard10 mongo

> rs.initiate(
{
_id : "shard1",
members: [
{ _id : 0, host : "172.19.0.31:27017" },
{ _id : 1, host : "172.19.0.32:27017" },
{ _id : 2, host : "172.19.0.33:27017", arbiterOnly:true}
]
}
)


#初始化二分片
docker exec -it shard20 mongo

> rs.initiate(
{
_id : "shard2",
members: [
{ _id : 0, host : "172.19.0.34:27017" },
{ _id : 1, host : "172.19.0.35:27017" },
{ _id : 2, host : "172.19.0.36:27017", arbiterOnly:true}
]
}
)

-2- 配置服务器层

#创建配置服务
docker run --name config1 \
--privileged \
--hostname config1 \
--net extnetwork \
--ip 172.19.0.10 \
-v $mdir:/data/configdb \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
-d mongo:3.6 --port 27017 --configsvr --replSet "configsvr" -f /data/configdb/configs.cnf

docker run --name config2 \
--privileged \
--hostname config2 \
--net extnetwork \
--ip 172.19.0.11 \
-v $mdir:/data/configdb \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
-d mongo:3.6 --port 27017 --configsvr --replSet "configsvr" -f /data/configdb/configs.cnf

docker run --name config3 \
--privileged \
--hostname config3 \
--net extnetwork \
--ip 172.19.0.12 \
-v $mdir:/data/configdb \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
-d mongo:3.6 --port 27017 --configsvr --replSet "configsvr" -f /data/configdb/configs.cnf

#初始化配置
docker exec -it config1 mongo

> rs.initiate(
{
_id: "configsvr",
configsvr: true,
members: [
{ _id : 0, host : "172.19.0.10:27017" },
{ _id : 1, host : "172.19.0.11:27017" },
{ _id : 2, host : "172.19.0.12:27017" }
]
}
)

-1- 访问入口层

docker run --name mongos \
--privileged \
--hostname mongos \
--net extnetwork \
-v $mdir/mongos.cnf:/etc/mongos.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.20 \
-p 27017:27017 \
-d --entrypoint "mongos" mongo:3.6 --port 27017 --configdb configsvr/172.19.0.10:27017,172.19.0.11:27017,172.19.0.12:27017 \
-f /etc/mongos.cnf

# 对外端口

docker run --name mongos1 \
--privileged \
--hostname mongos1 \
--net extnetwork \
-v $mdir/mongos.cnf:/etc/mongos.cnf \
-v $mdir/mongodb-keyfile:/etc/mongodb-keyfile \
--ip 172.19.0.21 \
-p 27018:27017 \
-d --entrypoint "mongos" mongo:3.6 --port 27017 --configdb configsvr/172.19.0.10:27017,172.19.0.11:27017,172.19.0.12:27017 --bind_ip_all \
-f /etc/mongos.cnf

-4- 集群的权限管控

docker exec -it mongos mongo --port 27017
#超级权限
use admin
db.createUser( { user: "dba", pwd: "dba", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } );

#管理权限(只能管理用户权限,不能查看权限)
> db.createUser({
user:'admin',
pwd:'xxxxxxx',
roles:[{role:'root',db:'admin'}],
})

> db.auth('admin','xxxxxxx')




### mydb1 是数据库名字,order 是集合()名字

#增加一分片到集群
db.runCommand({addshard:"shard1/172.19.0.31:27017,172.19.0.32:27017,172.19.0.33:27017"})
#增加二分片到集群
db.runCommand({addshard:"shard2/172.19.0.34:27017,172.19.0.35:27017,172.19.0.36:27017"})

#数据库启用分片
sh.enableSharding("mydb1")

#Collection 分片
#对 mydb1.order 的 _id 字段进行哈希分片

db.runCommand({ shardcollection: "mydb1.order", key: { _id:"hashed" }})、


#也可以添加其他组合 片键(也就是字段组合,能个很好具有数据唯一性区分的组合键) 如:

# use admin

# db.adminCommand({shardcollection:"mydb1.order",key:{"productType,appRequestId":1}})

创建 GUI 上可用用户名密码

#指定一个库,对该数据库授权访问(这里我不用已存在的库 mydb1 了)如:newnet

mongo newnet --host 192.168.101.7 --port 27018 -u dba --authenticationDatabase admin -p 'dba'

mongos> db.createUser({
user: "newnet",
pwd: "newnet@123",
roles: [
{ role: "read", db: "mydb1" },
{ role: "readWrite", db: "newnet" }
]
})

# 登录 验证库 要改成 --authenticationDatabase newnet
mongo newnet --host 192.168.101.7 --port 27018 -u newnet --authenticationDatabase newnet -p 'newnet@123'

权限授权格式

mongo>db.createUser(
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]}
)

user:用户名
pwd:密码
customData: 用于描述账户信息
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。

role里的角色可以选:
Built-InRoles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4.备份恢复角色:backup、restore;
5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6.超级用户角色:root
//这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner、userAdmin、userAdminAnyDatabase)
7.内部角色:__system


具体角色: 
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
backup,retore:在进行备份、恢复时可以单独指定的角色,在db.createUser()方法中roles里面的db必须写成是admin库,要不然会 报错
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限,
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

例如:
use admin
db.createRole(
{
role: "manageOpRole",
privileges:[
{resource: { anyResource: true},actions: ["anyAction"]}
],
roles: []
}
)

db.createUser( {
user: "super",
pwd: "xxxxxxxx",
roles: [
{role: "dbOwner", db: "admin" },
{role:"restore",db:"admin"},
{role:"backup",db:"admin"},
{role:"userAdmin",db:"admin"},
{role:"readWriteAnyDatabase",db:"admin"},
{role:"dbAdminAnyDatabase",db:"admin"},
{role:"userAdminAnyDatabase",db:"admin"} ,"manageOpRole"
]
} );
db.createUser( {
user: "super_evala",
pwd: "aaaaaaaaaa",
customData: {"desc":"存储过程专用" },
roles: ["manageOpRole"]
} );


复制



文章转载自上官吕布,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论