mongo分片集群的部署以及集群认证

创建带有认证的mongo分片集群

-_-之前可视化编辑器的太丑了,所以删了原来的,拿markdown重写了一遍

本文适合已经对mongo集群的理论知识已经有所了解的读者

本文着重讲述集群部署上的完整步骤和细节,以及如何在集群上使用用户认证功能

我给的示例的集群结构 :

1{ 2 1个路由mongos结点(本地,27017端口) 3 4 1个元配置config结点(本地,27018端口) 5 6 2个分片shard结点(本地,28001以及28002端口) 7}

环境版本 :

1{ 2 mongo版本 : 3.2.4 3 4 系统版本 : ubuntu15.04 5}

当然,生产环境下,建议多个mongos结点和多个config结点,
其中mongo推荐的config结点的数量是至少三个
而且生产环境下,每个分片shard结点可以是一个复制集的主结点

下面列出所有的步骤:

先来不带认证的

一. 第一个shard分片数据结点的配置文件 shard28001.conf

1 port=28001 2 3 shard1的端口 4 5 bind_ip=127.0.0.1 6 7 shard1的绑定地址 8 9 dbpath=/home/seven/program/mongodb/data/shard28001/ 10 11 shard1的数据目录(绝对路径) 12 13 logpath=/home/seven/program/mongodb/log/shard28001.log 14 15 shard1的日志目录(绝对路径) 16 17 pidfilepath=/home/seven/program/mongodb/data/shard28001/shard28001.pid 18 19 shard1的pid路径(绝对路径) 20 21 logappend=true 22 23 shard1的日志以追加方式 24 25 fork=true 26 27 shard1以后台方式运行 28 29 shardsvr=true 30 31 表明该mongo进程是一个分片结点 32 33 profile=1 34 35 只在操作时间超过slowms时,才记录慢日志 36 profile=0表示永不记录,profile=1表示只记录慢日志,profile=2表示所有日志都记录 37 38 slowms=100 39 40 慢日志的时间阀值是100ms 41 42 另外,这两项配置推荐在主结点和从结点上都进行配置 43 并且可以通过db.getProfilingStatus()这条命令来查看慢日志的配置信息 44 45 其实,不推荐通过配置文件的方式强制开启慢日志 46 相反,推荐使用db.setProfilingLevel(int)的方式动态调整profile的等级 47 因为,慢日志通常用在内测时候,真正上线后为了性能,是不会开启慢日志的,或者说是不会长期开着的 48 一般是每隔一段时间,动态地开启一段时间来获取线上测试情况

二. 第二个shard分片数据结点的配置文件 shard28002.conf

1 port=28002 2 3 shard2的端口 4 5 bind_ip=127.0.0.1 6 7 shard2的绑定地址 8 9 dbpath=/home/seven/program/mongodb/data/shard28002/ 10 11 shard2的数据目录(绝对路径) 12 13 logpath=/home/seven/program/mongodb/log/shard28002.log 14 15 shard2的日志目录(绝对路径) 16 17 pidfilepath=/home/seven/program/mongodb/data/shard28002/shard28002.pid 18 19 shard2的pid路径(绝对路径) 20 21 logappend=true 22 23 shard2的日志以追加方式 24 25 fork=true 26 27 shard2以后台方式运行 28 29 shardsvr=true 30 31 表明该mongo进程是一个分片结点 32 33 profile=1 34 35 slowms=100

三. config元数据结点的配置文件 config27018.conf

1 port=27018 2 3 config结点的端口 4 5 bind_ip=127.0.0.1 6 7 config结点的绑定地址 8 9 dbpath=/home/seven/program/mongodb/data/config27018/ 10 11 config结点的数据目录(绝对路径) 12 13 logpath=/home/seven/program/mongodb/log/config27018.log 14 15 config结点的日志路径(绝对路径) 16 17 pidfilepath=/home/seven/program/mongodb/data/config27018/config27018.pid 18 19 config结点的pid路径(绝对路径) 20 21 logappend=true 22 23 config结点的日志以追加方式 24 25 fork=true 26 27 config结点以后台方式运行 28 29 configsvr=true 30 31 表明该mongo进程是一个元数据结点 32 33 profile=1 34 35 slowms=100

四. mongos路由结点的配置文件 mongos27017.conf

1 port=27017 2 3 mongos结点的端口 4 5 bind_ip=127.0.0.1 6 7 mongos结点的绑定地址 8 9 logpath=/home/seven/program/mongodb/log/mongos27017.log 10 11 mongos结点的日志路径(绝对路径) 12 13 pidfilepath=/home/seven/program/mongodb/data/mongos27017/mongos27017.pid 14 15 mongos结点的pid路径(绝对路径) 16 17 logappend=true 18 19 mongos结点的日志以追加方式 20 21 fork=true 22 23 mongos结点以后台方式运行 24 25 configdb=127.0.0.1:27018 26 27 表明该mongo进程是一个路由结点,且它只有一个元数据结点并且地址为本地且端口为27018 28 29 注意mongos路由结点是不需要也不能定义dbpath的 30 注意路由结点上不需要配置profile和slowms,同样在路由结点上也无法查看这两项设置

五. 启动脚本

init.sh :

1 禁用hugepage,否则启动mongod进程的时候会有warning 2 另外这个脚本要以root方式运行,所以权限最好设置为700,所属组设置为root:root 3 4 echo never > /sys/kernel/mm/transparent_hugepage/enabled 5 6 echo never > /sys/kernel/mm/transparent_hugepage/defrag

shard28001.sh : 分片结点1的启动脚本,这个脚本最好不要以root身份运行

1 cd /home/seven/program/mongodb/bin 2 3 进入mongodb的bin目录 4 5 ./mongod -f ../conf/shard28001.conf 6 7 启动shard1结点(-f指定配置文件)

shard28002.sh : 分片结点2的启动脚本,这个脚本最好不要以root身份运行

1 cd /home/seven/program/mongodb/bin 2 3 进入mongodb的bin目录 4 5 ./mongod -f ../conf/shard28002.conf 6 7 启动shard2结点(-f指定配置文件)

config27018.sh : 元数据结点的启动脚本,这个脚本最好不要以root身份运行

1 cd /home/seven/program/mongodb/bin 2 3 进入mongodb的bin目录 4 5 ./mongod -f ../conf/config27018.conf 6 7 启动config结点(-f指定配置文件)

mongos27017.sh : 路由结点的启动脚本,这个脚本最好不要以root身份运行

1 cd /home/seven/program/mongodb/bin 2 3 进入mongodb的bin目录 4 5 ./mongos -f ../conf/mongos27017.conf 6 7 以mongos形式启动路由结点(-f指定配置文件)

六. 启动各实例

1 su root 2 3 切换为root身份,以便运行init.sh脚本来禁用hugepage 4 5 ./init.sh 6 7 禁用hugepage,(当然这里你需要进到你自己机子上存放该脚本的目录) 8 9 exit 10 11 退出root身份,以便启动mongod实例 12 13 ./shard28001.sh 14 15 启动第一个分片结点 16 17 ./shard28002.sh 18 19 启动第二个分片结点 20 21 ./config27018.sh 22 23 启动元数据结点 24 25 ./mongos27017.sh 26 27 启动路由结点 28 若你的config结点不满3个,它会提示你在生产环境下最好至少三个config结点

七. 添加分片成员

1 mongo 127.0.0.1:27017/admin 2 3 进入mongos(路由结点)的shell 4 5 db.runCommand({ "addShard" : "127.0.0.1:28001" }) 6 7 添加分片结点28001到集群中 8 如果不事先进入admin库,会报错,所以需要连接时指定admin库,或者use admin 9 10 db.runCommand({ "addShard" : "127.0.0.1:28002" }) 11 12 添加分片结点28002到集群中

八. 创建一个测试库和集合

1 use 新库名 2 3 创建一个新的库(当然是在路由结点,即mongos的shell中进行) 4 5 db.新表名.insert({...}) 6 7 插入若干条数据 8 9 db.新表名.ensureIndex({...}) 10 11 为这个表建一个索引吧 12 例如我是db.usertable.ensureIndex({ userid : 1 },{ unique : true }) 13 14 db.runCommand({ enablesharding : 新库名 }) 15 16 使刚才创建的库能够被分片 17 (发现报错,提示必须在admin环境下,所以use admin,再执行这条命令) 18 19 db.runCommand({ shardcollection : "库名.表名", key : {...} }) 20 21 为某个库中的某个表添加分片片键,例如我是 : 22 db.runCommand( 23 { 24 shardcollection : "weshare.usertable", 25 key : { "userid" : 1 }, 26 unique : true 27 } 28 ) 29 注意,强烈推荐片键是索引的一部分前缀,有利于达到查询的局部化

九. 查看集群状态

1 use config 2 3 进入config库,即元数据库 4 (当然这里还是在路由结点的mongos的shell里执行命令) 5 6 db.shards.find() 7 8 查看当前集群中有哪些shard结点 9 10 use 新库名 11 12 进入你刚才创建的那个库 13 14 db.表名.stats() 15 16 查看该库中的该表的集群状态 17 若发现里面最开始的sharded字段是true,则表示你的集群创建成功了 18 19 db.printShardingStatus() 20 21 查看分片状态

再来加入认证的配置

十. 生成密钥文件

1 openssl rand -base64 64 > keyfile.dat 2 3 生成64字节的密钥文件 4 5 chmod 600 keyfile.dat 6 7 建议把密钥文件的权限设置为600(针对启动mongo实例的那个用户) 8 接着需要把这个密钥文件拷贝到集群中每一个结点上(路由结点,元配置结点,分片结点上都要有这个密钥文件)

十一. 创建集群用户

1 mongo 127.0.0.1:27017/admin 2 3 进入mongos路由结点(我这里是本地的27017端口,请根据自身的地址和端口来进行) 4 5 db.createUser( 6 { 7 user : yourusername, 8 pwd : yourpassword, 9 roles : 10 [ 11 { role : "root", db : "admin" }, 12 { role : "clusterAdmin", db : "admin" } 13 ] 14 } 15 ) 16 17 创建针对admin库的管理员用户 18 19 use 新库 20 21 进入你之前创建的新库 22 23 db.createUser( 24 { 25 user : yourusername, 26 pwd : yourpassword, 27 roles : 28 [ 29 { role : "dbOwner", db : yourdb }, 30 { role : "clusterAdmin", db : "admin" } 31 ] 32 } 33 ) 34 35 创建针对某个这个新库的用户 36 37 注意,上述的两个用户,需要在每个结点(每个分片结点,每个路由结点)上都要创建

十二. 开启集群认证

1 keyFile=path/keyfile.dat 2 3 在每个结点(路由结点,元配置结点,分片结点)的配置文件中加入keyFile的配置项 4 5 auth=true 6 7 在每个元配置结点和分片结点(即除了mongos结点)的配置文件中加入auth=true的配置项 8 9 db.shutdownServer() 10 11 关闭原先的集群 12 注意,需要按照 路由结点 -> 配置结点 -> 分片结点 的顺序,依次关闭各结点的进程 13 在关闭某个进程时,需要先进入admin库,然后执行这条命令 14 15 重新启动集群,命令同第六步

十三. 验证集群的认证

1 mongo 127.0.0.1:27017/admin 2 3 进入路由结点(地址和端口请按照你的实际情况) 4 5 db.auth(yourusername,yourpassword) 6 7 admin库的认证 8 9 use 新库 10 11 进入之前你创建的新库 12 13 db.新表.insert({...}) 14 15 往这个新库的新表里插入一条数据 16 发现报错没有权限,因为你需要进行auth,先执行db.auth(yourusr,yourpwd) 17 然后再执行这条命令 18 19 db.新表名.ensureIndex({...}) 20 21 为这个新表添加索引 22 23 db.runCommand({ shardcollection : "库名.表名", key : {...} }) 24 25 为这个新表添加片键。注意,强烈推荐片键是索引的一部分前缀,这样能够达到查询的局部化 26 注意,要先进入admin库,否则这条命令不会成功 27 28 db.表名.stats() 29 30 查看该库中的该表的集群状态 31 若发现里面最开始的sharded字段是true,则表示添加认证功能后的集群没有出现异常 32 33 db.printShardingStatus() 34 35 查看分片状态
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )