MongoDB-01-基础




mongodb逻辑结构

Mongodb 逻辑结构         MySQL逻辑结构
库  (database)         库
集合(collection)       表
文档(document)         数据行



安装部署

1 系统准备

1 这里用的mongodb版本是3.6.12
2 redhat或centos6.2以上系统
3 系统开发包完整
4 ip地址和hosts文件解析正常
5 iptables防火墙&SElinux关闭
6 关闭大页内存机制


root用户下
在vi /etc/rc.local最后添加如下代码(永久关闭,重启生效)
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi


临时关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled		
echo never > /sys/kernel/mm/transparent_hugepage/defrag	
cat  /sys/kernel/mm/transparent_hugepage/enabled        
cat /sys/kernel/mm/transparent_hugepage/defrag  

其他系统关闭参照官方文档:   
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

为什么要关闭?
You should disable THP on Linux machines to ensure best performance with MongoDB.

2 mongodb安装

创建所需用户和组
useradd mongod
passwd mongod


创建mongodb所需目录结构
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data


上传并解压软件到指定位置
cd /server/tools/
tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz 
cp -r /server/tools/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb


设置目录结构权限
chown -R mongod:mongod /mongodb


设置用户环境变量
[root@db01 mongodb]# su - mongod
[mongod@db01 ~]$ vi .bash_profile
export PATH=/mongodb/bin:$PATH
[mongod@db01 ~]$ source .bash_profile


启动mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork 


登录mongodb
[mongod@server2 ~]$ mongo
或者
[mongod@server2 ~]$ mongo 127.0.0.1:27017


注:连接之后会有warning,需要修改(使用root用户)
vim /etc/security/limits.conf 
#*       -       nofile       65535 
reboot重启生效


############################################################################################
使用配置文件
[mongod@db01 ~]$ vim /mongodb/conf/mongodb.conf
logpath=/mongodb/log/mongodb.log
dbpath=/mongodb/data 
port=27017
logappend=true
fork=true

使用配置文件启动mongodb
mongod -f /mongodb/conf/mongodb.conf
关闭mongodb
mongod -f /mongodb/conf/mongodb.conf --shutdown
############################################################################################


YAML模式
YAML does not support tab characters for indentation: use spaces instead.
YAML不支持缩进的制表符:请改用空格。

-- 系统日志有关  
systemLog:
   destination: file        
   path: "/mongodb/log/mongodb.log"    -- 日志位置
   logAppend: true                     -- 日志以追加模式记录
  
-- 数据存储有关   
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data"            -- 数据路径的位置

-- 进程控制  
processManagement:
   fork: true                         -- 后台守护进程
   pidFilePath: <string>              -- pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
    
-- 网络配置有关   
net:            
   bindIp: <ip>                       -- 监听地址
   port: <port>                       -- 端口号,默认不配置端口号,是27017
   
-- 安全验证有关配置      
security:
  authorization: enabled              -- 是否打开用户名密码验证
  

------------------以下是复制集与分片集群有关---------------------------- 
replication:
 oplogSizeMB: <NUM>
 replSetName: "<REPSETNAME>"
 secondaryIndexPrefetch: "all"
 
sharding:
   clusterRole: <string>
   archiveMovedChunks: <boolean>
      
---for mongos only
replication:
   localPingThresholdMs: <int>

sharding:
   configDB: <string>
--------------------------------------------------------------------


# YAML例子
cat >  /mongodb/conf/mongo.conf <<EOF
systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1
EOF


启动和停止mongodb
mongod -f /mongodb/conf/mongo.conf   
mongod -f /mongodb/conf/mongo.conf --shutdown


mongodb 使用systemd管理
cat > /etc/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb 
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true  
[Install]
WantedBy=multi-user.target
EOF

[root@db01 ~]# systemctl restart mongod
[root@db01 ~]# systemctl stop mongod
[root@db01 ~]# systemctl start mongod



mongodb常用操作

mongodb 默认存在的库
test   :登录时默认存在的库
admin  :系统预留库,MongoDB系统管理库
local  :本地预留库,存储关键日志
config :MongoDB配置信息库

show databases/show dbs
show tables/show collections
use admin 
db/select database()


db 对象相关命令
db.[TAB][TAB]
db.help()
db.oldboy.[TAB][TAB]
db.oldboy.help()


rs 复制集有关(replication set)
rs.[TAB][TAB]
rs.help()


sh 分片集群(sharding cluster)
sh.[TAB][TAB]
sh.help()



库的操作
> use test
>db.dropDatabase()   删库跑路
{ "dropped" : "test", "ok" : 1 }



集合的操作
方法1
admin> use app
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')

方法2:当插入一个文档的时候,一个集合就会自动创建。
use oldboy
db.test.insert({name:"zhangsan"})
db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"})
show tables;
db.stu.insert({id:102,name:"lisi"})
db.stu.insert({a:"b",c:"d"})
db.stu.insert({a:1,c:2})



文档操作
数据录入:
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}

查询数据行数:
> db.log.count()

全表查询:
> db.log.find()

每页显示50条记录:
> DBQuery.shellBatchSize=50; 

按照条件查询
> db.log.find({uid:999})

以标准的json格式显示数据
> db.log.find({uid:999}).pretty()
{
    "_id" : ObjectId("5cc516e60d13144c89dead33"),
    "uid" : 999,
    "name" : "mongodb",
    "age" : 6,
    "date" : ISODate("2019-04-28T02:58:46.109Z")
}

删除集合中所有记录
app> db.log.remove({})

查看集合存储信息
app> db.log.totalSize() //集合中索引+数据压缩存储之后的大小    

重命名集合
//把log改名为log1
app> db.log.renameCollection("log1")
{ "ok" : 1 }
app> show collections
a b c
log1
app



用户和权限管理

1 注意
验证库: 建立用户时use到的库,在使用用户时,要加上验证库才能登陆
对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库
2. 登录时,必须明确指定验证库才能登录
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.
5. 从3.6版本开始,不添加bindIp参数,默认不让远程登录,只能本地管理员登录



2 用户创建语法
use admin 
db.createUser
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>",
     db: "<database>" } | "<role>",
    ...
    ]
}

基本语法说明:
user:用户名
pwd:密码
roles:
    role:角色名
    db:作用对象 
role:root, readWrite,read   
验证数据库:
mongo -u oldboy -p 123 10.0.0.53/oldboy



3 用户管理例子
创建超级管理员:管理所有数据库(必须use admin再去创建)
$ mongo
use admin
db.createUser(
{
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
}
)

验证用户
db.auth('root','123')

配置文件中,加入以下配置
security:
  authorization: enabled

重启mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown 
mongod -f /mongodb/conf/mongo.conf 

登录验证
mongo -uroot -p123	# 注意这个登录是未验证成功的,需要去验证
mongo -uroot -p123  10.0.0.51/admin

或者 
mongo
use admin
db.auth('root','root123')

查看用户
use admin
db.system.users.find().pretty()

创建应用用户
use oldboy
db.createUser(
    {
        user: "app01",
        pwd: "app01",
        roles: [ { role: "readWrite" , db: "oldboy" } ]
    }
)

mongo  -uapp01 -papp01 10.0.0.51/oldboy

查询mongodb中的用户信息
mongo -uroot -p123 10.0.0.51/admin
db.system.users.find().pretty()



4 删除用户(root身份登录,use到验证库)
# 在root用户下进行
# 创建用户
use  oldboy1
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})

# 查询用户
use admin
db.system.users.find().pretty()

# 删除用户
use oldboy1
db.dropUser("app02")



5 用户管理注意事项
1. 建用户要有验证库,管理员admin,普通用户是要管理的库
2. 登录时,注意验证库
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
3. 重点参数
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1
security:
   authorization: enabled

posted @ 2021-07-30 14:58  李成果  阅读(38)  评论(0编辑  收藏  举报