mongodb

authSchema

下载了最新mongodb3.03版本当使用--auth 参数命令行开启mongodb用户认证时遇到很多问题,现总结如下:
百度上搜到的基本都是老版本的看到db.addUser的就是请忽略
Windows下我做了一个bat文件用来启动mongodb命令行如下
mongod --dbpath db\data --port 27017 --directoryperdb --logpath db\logs\mongodb.log --logappend --auth
最后的参数就是开启和关闭认证如果是conf配置文件应该是auth=true或false
1首先关闭认证也就是不带--auth参数,启动mongodb
2使用命令行进入mongodb目录输入mongo命令默认进入test数据库
3use userdb  切换到自己的数据库输入db显示userdb
4创建用户角色为dbOwner数据库为userdb命令行应该是db.createUser({user:'myuser',pwd:'123456',roles:
[{role:'dbOwner',db:'userdb'}]})
5切换到admin数据库use admindb 显示admindb.shutdownServer()关闭服务器填上认证参数启动mongodb
以前的版本此时使用mongovue就可以使用myuser登录到userdb数据库上了但是3.0.3版本不行打开mongodb.log文件发现如下错误

authenticate db: userdb { authenticate: 1, nonce: "xxx", user: "myuser", key: "xxx" }
2015-06-02T09:57:18.877+0800 I ACCESS   [conn2] Failed to authenticate myuser@userdb with mechanism 
MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document


此1-5步骤针对是3.0.3以前版本已经ok如果是3.0.3mongodb加入了SCRAM-SHA-1校验方式需要第三方工具配合进行验证
下面给出具体解决办法
首先关闭认证修改system.version文档里面的authSchema版本为3初始安装时候应该是5命令行如下
> use admin
switched to db admin
>  var schema = db.system.version.findOne({"_id" : "authSchema"})
> schema.currentVersion = 3
3
> db.system.version.save(schema)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

不过如果你现在开启认证仍然会提示AuthenticationFailed MONGODB-CR credentials missing in the user document
原因是原来创建的用户已经使用了SCRAM-SHA-1认证方式
> use admin
switched to db admin
> db.system.users.find()
[...]
{ "_id" : "userdb.myuser", "user" : "myuser", "db" : "userdb", "credentials" : { "SCRAM-SHA-1" :
 { "iterationCount" : 10000, "salt" : "XXXXXXXXXXXXXXXXXXXXXXXX", "storedKey" : 
 "XXXXXXXXXXXXXXXXXXXXXXXXXXX", "serverKey" : "XXXXXXXXXXXXXXXXXXXXXXXXXXX" } }, 
 "roles" : [ { "role" : "dbOwner", "db" : "userdb" } ] }

解决方式就是删除刚刚创建的用户重新重建即可
> use userdb
switched to db userdb
> db.dropUser("myuser")
true
>db.createUser({user:'myuser',pwd:'123456',roles:[{role:'dbOwner',db:'userdb'}]})
然后关闭服务器开启认证重启服务器用mongovue连接一切OK

集群认证

mongodb3.2复制集和shard集群之后的用户认证登陆。
1:关于mongos登录权限认证配置

[mongodb@node1 keyfile]$ openssl rand -base64 741 > /data/keyfile/zxl
[mongodb@node1 keyfile]$ chmod 600 /data/keyfile/zxl
2:把/data/keyfile/zxl文件拷贝到各个机器/data/keyfile/目录下即可
切记属主和组以及文件权限600
3:创建用户
[mongodb@node1 config]$ mongo --port 10005
MongoDB shell version: 3.2.3
connecting to: 127.0.0.1:10005/test
mongos> use admin
switched to db admin
db.createUser(
  {
    user: "zxl",
    pwd: "123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
db.createUser( {
    user: "zxl",
    pwd: "123",
    roles: [ { role: "root", db: "admin" } ]
});
mongos> db.auth('zxl','123')
注:userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限,root:
只在admin数据库中可用。超级账号,超级权限,其实 创建一个userAdminAnyDatabase角色就可以,然后可以创建N个用户角色。。。
4:关闭三台机器上的mongodconfigsvr以及mongos服务
[mongodb@node1 keyfile]$ netstat -ntpl|grep mongo|awk '{print $NF}'|awk -F'/' '{print $1}'|xargs kill
5:修改三台机器上的shard1.confshard2.confshard3.confconfigsvr.confmongos.conf配置文件中的内容,
分别去掉注释内容即可
#security:
#  keyFile: "/data/keyfile/zxl"
#  clusterAuthMode: "keyFile"
去掉注释
security:
  keyFile: "/data/keyfile/zxl"
  clusterAuthMode: "keyFile"
启动三台机器上的shard1shard2shard3以及configsvrmongos节点
[mongodb@node1 ~]$ mongod -f /data/config/shard1.conf
[mongodb@node1 ~]$ mongod -f /data/config/shard2.conf
[mongodb@node1 ~]$ mongod -f /data/config/shard3.conf
[mongodb@node1 logs]$ mongod -f /data/config/configsvr.conf
[mongodb@node1 logs]$ mongos -f /data/config/mongos.conf
登录mongos
[mongodb@node1 config]$ mongo --port 10005
MongoDB shell version: 3.2.3
connecting to: 127.0.0.1:10005/test
mongos> use admin
switched to db admin
mongos> db.auth('zxl','123')
mongos> sh.enableSharding("av")//启用shard分片
{ "ok" : 1 }
mongos> sh.shardCollection("av.xxoo",{name:1})//设置集合的名字以及字段,默认自动建立索引,av库,xxoo集合
{ "collectionsharded" : "av.xxoo", "ok" : 1 }


总结内容如下:
系统时间和防火墙,切记
#security.keyFile: 格式与security.authorization相同,功能与--keyFile相同。
--keyFile <file>: 主要用于分片集群与副本集相互之间的授权使用,在单机情况下只要用到auth,
如果是在集群(分片+副本集)环境下,就必须要用到该参数;
因为之前我就创建了一个userAdminAnyDatabase角色,所以创建一个root角色的账户。如下
[mongodb@node1 config]$ mongo 192.168.75.128:10005/admin -u zxl -p 123 --authenticationDatabase admin
MongoDB shell version: 3.2.3
connecting to: 192.168.75.128:10005/admin
mongos> show dbs
ad      0.000GB
admin   0.000GB
config  0.001GB
mongos> db.createUser({user: "root",pwd: "123456",roles: [ "root" ]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
mongos> db.auth("root","123456")
mongos>
bye
认证登陆
[mongodb@node1 config]$ mongo 192.168.75.128:10005/admin -u root -p 123456 --authenticationDatabase
MongoDB shell version: 3.2.3
connecting to: 192.168.75.128:10005/admin
mongos> show dbs
ad      0.000GB
admin   0.000GB
av      0.000GB
config  0.001GB

集群安装

https://www.mongodb.com/download-center#community

下载后解压 三台服务器都配置

mkdir conf data log pid

cat conf/shard11.conf
dbpath=/usr/local/mongodb/data/shard11
logpath=/usr/local/mongodb/log/shard11.log
pidfilepath=/usr/local/mongodb/pid/shard11.pid
directoryperdb=true
logappend=true
replSet=shard1
port=10011
fork=true
shardsvr=true
journal=true


cat conf/shard21.conf
dbpath=/usr/local/mongodb/data/shard21
logpath=/usr/local/mongodb/log/shard21.log
pidfilepath=/usr/local/mongodb/pid/shard21.pid
directoryperdb=true
logappend=true
replSet=shard2
port=10021
fork=true
shardsvr=true
journal=true

cat conf/config.conf
dbpath=/usr/local/mongodb/data/config
logpath=/usr/local/mongodb/log/config.log
pidfilepath=/usr/local/mongodb/pid/config.pid
directoryperdb=true
logappend=true
port=10031
fork=true
configsvr=true
replSet=configRS
journal=true

cat conf/route.conf
configdb=configRS/192.168.1.5:10031,192.168.1.6:10031,192.168.1.2:10031
pidfilepath=/usr/local/mongodb/pid/route.pid
port=10040
logpath=/usr/local/mongodb/log/route.log
logappend=true
fork=true

在每一台服务器分别启动配置服务器
./bin/mongod -f conf/config.conf

连接到任意一台配置服务器上
./bin/mongo --port 10031 --host 127.0.0.1
创建配置服务器副本集    host为其他服务器的 config角色
rs.initiate({_id:"configRS",configsvr:true,members:[{_id:0,host:"192.168.1.5:10031"},
{_id:1,host:"192.168.1.6:10031"},{_id:2,host:"192.168.1.2:10031"}]})

在每一台服务器分别启动分片及副本集   可以有多个shard分片
./bin/mongod -f conf/shard11.conf 
./bin/mongod -f conf/shard21.conf

连接任意一台分片服务器
shard1
./bin/mongo --port 10011 --host 127.0.0.1
运行  rs.initiate({_id:"shard1",members:[{_id:0,host:"192.168.1.5:10011"},{_id:1,host:"192.168.1.6:10011"},
{_id:2,host:"192.168.1.2:10011"}]})    arbiterOnly:true 参数为角色是仲裁节点

shard2
./bin/mongo --port 10021 --host 127.0.0.1
运行 rs.initiate({_id:"shard2",members:[{_id:0,host:"192.168.1.5:10021"},{_id:1,host:"192.168.1.6:10021"},
{_id:2,host:"192.168.1.2:10021"}]})


在每一台服务器分别启动路由服务 
./bin/mongos -f conf/route.conf
./bin/mongos  --host 127.0.0.1--port 10040
use admin
db.runCommand({addshard:"shard1/192.168.1.5:10011,192.168.1.6:10011,192.168.1.2:10011"})
db.runCommand({addshard:"shard2/192.168.1.5:10021,192.168.1.6:10021,192.168.1.2:10021"})
db.runCommand({ listshards:1 })  查看配置是否生效(仲裁不被列出 )
db.runCommand({enablesharding:"friends"});   # friends 库开启shard
db.runCommand( { shardcollection : "friends.user",key : {id: 1},unique : true } )  # user 表来做分片,
片键为 id 且唯一  #1个分片 保存了1条,另一个分片保存了剩下的所有记录
db.runCommand( { shardcollection : "friends.user",key : {id: "hashed"} } )        #保证数据分布均衡

插入数据测试
use runoob  建立库
db.runoob.insert({"name":"菜鸟教程"})
show dbs
db.runoob.find();  列出数据

rs.status()  shard config 执行
db.status()  route执行

mongo命令

以下实例我们创建了数据库 runoob:
> use runoob
switched to db runoob
> db
runoob
>
如果你想查看所有数据库,可以使用 show dbs 命令:
> show dbs
local  0.078GB
test   0.078GB
>
可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 runoob 数据库插入一些数据。
> db.collection.insert({"name":"菜鸟教程"})       collection集合插入数据
WriteResult({ "nInserted" : 1 })
> show dbs
local   0.078GB
runoob  0.078GB
test    0.078GB
>
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。


导入导出
dos2unix e_client_order.json
sed 's/},/}\n/g' e_client_order.json  > 1.json
./bin/mongoimport --db weituofang --collection lecture --file 1.json --port 10040


./bin/mongoexport -d weituofang -c yinghui1 -o yinghui1.json --port 10040

缩减shard集群

MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片
关键字MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片

对MongoDB的Shard集群来说添加一个分片很简单AddShard就可以了

但是缩减集群(删除分片)这种一般很少用到由于某服务器挂了所以想送修之前必须把它上面的数据自动迁移到其他Shard上

以下内容翻译自http://docs.mongodb.org/manual/tutorial/remove-shards-from-cluster/

1执行RemoveShard命令
db.runCommand( { removeshard: "your_shard_name" } ) 
{ msg : "draining started successfully" , state: "started" , shard :"mongodb0" , ok : 1 } 
注意该命令至少执行两次才能成功删除执行到state为completed才真正删除否则就是没用删除成功
该分片处于"draining" : true状态该状态下不但该分片没用删除成功而且还影响接下来删除其他分片操作
遇到该状态再执行一次removeshard即可最好就是删除分片时一直重复执行删除命令直到state为completed

还有一个需要注意的地方就是被成功删除的分片如果想要再加入集群时必须将data数据目录清理干净才可以再加入集群
否则即使能加入成功也不会存储数据集合都不会被创建

另外在删除分片的时有可能整个过程出现无限"draining" : true状态等多久还是这样而且分片上面的块一个
都没有移动到别的分片解决办法是在config的config数据库的shard集合中找到该分片的信息并将draining字段
由True改为False,再继续试着删除操作

上面这句会立即返回实际在后台执行

2查看迁移状态
我们可以反复执行上面语句查看执行结果
db.runCommand( { removeshard: "your_shard_name" } ) { msg: "draining ongoing" , 
state: "ongoing" , remaining: { chunks: 42, dbs : 1 }, ok: 1 }
从上面可以看到正在迁移还剩下42块没迁移完
当remain为0之后这一步就结束了

3移出非Shard数据如果开始就知道是primary可以直接执行 步骤3和4即可1和2不需要执行
如果你要删除的Shard分片恰好是primary那么执行这一步否则请跳过
db.runCommand( { movePrimary: "数据库名称", to: "分片名称" })

这次就不是立即返回了需要很久然后会返回如下
{ "primary" : "mongodb1", "ok" : 1 }

4最后的清理
上面步骤都完成后还需要再执行一次RemoveShard清理残余数据
db.runCommand( { removeshard: "mongodb0" } )
执行成功后会如下结果
{ msg: "remove shard completed succesfully" , stage: "completed", host: "mongodb0", ok : 1 }

显示completed后就可以安心的关闭mongod的进程了
来源 http://www.myexception.cn/go/1862417.html

web管理mongo

https://github.com/iwind/rockmongo

安装lamp
  yum install php-pecl-mongo
cd /var/ww/html
下载解压  https://github.com/iwind/rockmongo/archive/master.zip

vim rockmongo-master/config.php  修改连接的mongo

访问 http://ip/rockmongo-master/index.php