NoSQL 4大家族
列存储: Hbase
键值存储:Redis
图像存储:Neo4J
文档存储:MongoDB ,ES
NoSQL 的优势:
高可扩展性
分布式计算
没有复杂的关系
低成本
架构灵活
半结构化数据
++++++++++++
NoSQL-Mongodb核心技术(运维篇)
第一章:逻辑结构
Mongodb 逻辑结构 MySQL逻辑结构
库 database 库
集合(collection) 表
文档(document) 数据行
======================================================
第二章:安装部署
1、系统准备
(1)3.0版本以上的mangodb,需要redhat或cnetos6.2以上系统,mangodb 4.0,要求centos7.2 以上
(2)系统开发包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墙&SElinux关闭
(5)关闭大页内存机制(从centos 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
保存退出
chmod +x /etc/rc.local
临时关闭,大内存页。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
--------------------------------------------------------------
2、mongodb安装
(1)创建所需用户和组
useradd mongod
passwd mongod
(2)创建mongodb所需目录结构
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data
mkdir -p /mongodb/bin
(3)上传并解压软件到指定位置
上传到:/opt
cd /opt/
解压:
tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz
拷贝目录下bin程序到/mongodb/bin
cp -r /opt/mongodb-linux-x86_64-rhel70-3.6.12/bin/* /mongodb/bin/
(4)设置目录结构权限
chown -R mongod:mongod /mongodb
(5)设置用户环境变量,需要切换到mongod用户。
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
保存,退出。
source .bash_profile
(6)启动mongodb,在mongod用户下面。
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
(7)登录mongodb
[mongod@c7605 ~]$ mongo
(8)配置文件说明
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模式:)在3.0以后是yaml 格式的配置文件,不支持tab键,使用空格代替。每级缩进2个空格
+++++++++++++++++++++++++++++++++++++
--系统日志有关
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式记录
--数据存储有关
storage:
journal:
enabled: true ## 是否开启日志,就是redo
dbPath: "/mongodb/data" --数据路径的位置
-- 进程控制
processManagement:
fork: true --后台守护进程
pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
--网络配置有关
net:
bindIp: <ip> -- 监听地址,如果不配置这行是监听在0.0.0.0
port: <port> -- 端口号,默认不配置端口号,是27017
-- 安全验证有关配置(默认没有开启)
需要在配置文件中,添加如下两行。
security:
authorization: enabled
--是否打开用户名密码验证
++++++++++++++++++++++
mangodb 配置文件YAML例子(在mongod用户环境下操作)
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: 192.168.68.190,127.0.0.1
EOF
mongod -f /mongodb/conf/mongo.conf ##启动
mongod -f /mongodb/conf/mongo.conf --shutdown ##关闭
++++++++++++++++++++++
(9)mongodb的关闭方式
mongod -f mongodb.conf --shutdown
(10) systemd 管理 mongodb (root用户,操作)
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
关闭,普通用户mongod启动的mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown ##mongod用户界面
systemctl restart mongod
systemctl start mongod
systemctl enable mongod
---------------------------------------
3、mongodb常用基本操作
先在root用户下,启动mogod,然后再切换到mongod用户:
3.0 mongodb 默认存在的库
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
show dbs ##查看有那些数据库,
是 mongo 里面自带的,命令结尾,可以不加分号。
3.1 命令种类
数据库对象(库(database),表(collection),行(document))
库、表 都可以不提前创建,直接use
比如说:use abc
这时的库只是临时库,如果你不创建 表(集合),show dbs就不会这个库。
db.命令: -----> 相当于 pwd
DB级别命令,库级别命令
db 显示当前在的库
db.[TAB] 类似于linux中的tab功能
show collections; ##查看当前库有那些表,功能和show tables相同。
db.help() db级别的命令使用帮助
+++++++++++
mongo xyz ##登录到指定库
mongo ##默认,登录到的是 test 库
collection级别操作:
db.createCollection("xyz") ##创建表(集合)
db.xyz.drop() ##删除表
document级别操作:(增、册、改、查[find])
db.xyz.insert({name:"郭靖"}) ##插入数据
复制集有关(replication set): 命令
rs.xxx
分片集群(sharding cluster):命令
sh.xxx
3.2、常用功能------帮助
help
命令.help()
命令.[TAB] 可以按tab键,补全。
show
use
db.help()
db.a.help()
rs.help()
sh.help()
3.3 、常用操作
--查看当前db版本
test> db.version() ##--显示当前数据库
test> db #查询现在在那个库下面
> db.getName()
test> show dbs --查询所有数据库
> use local -- 切换数据库
- 查看所有的collection
show tables;
test> use local
switched to db local
local> db.stats()
– 查看当前数据库的连接机器地址
> db.getMongo()
connection to 127.0.0.1
指定数据库进行连接
默认连接本机test数据库
------------------------------------------------
4、mongodb对象操作:
mongo mysql
库 -----> 库
集合 -----> 表
文档 -----> 数据行
4.1 库的操作:
– 创建数据库:
当use的时候,系统就会自动创建一个数据库。
如果use之后没有创建任何集合。
系统就会删除这个数据库。
– 删除数据库
如果没有选择任何数据库,会删除默认的test数据库
//删除test数据库
test> use test
test> db.dropDatabase() ##删除库
{ "dropped" : "test", "ok" : 1 }
集合的操作:
创建集合
方法1
admin> use app
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')
{ "ok" : 1 }
> show collections //查看当前数据下的所有集合
a b 或
> db.getCollectionNames()
[ "a", "b" ]
方法2:当插入一个文档的时候,一个集合就会自动创建。
db.oldguo.insert({id : "101" ,name : "zhangsan" ,age : "18" ,gender : "male"})
json格式:
{键值对} 多个键值用逗号,
use oldboy
db.oldguo.insert({id : "1021" ,name : "zhssn" ,age : "22" ,gender : "female",address : "sz"})
> db.oldguo.find({id:"101"}) ##查询单个
{ "_id" : ObjectId("5d36b8b6e62adeeaf0de00dc"), "id" : "101", "name" : "zhangsan", "age" : "18", "gender" : "male" }
查询数据:
> db.oldguo.find({id:"101"}).pretty() ##显示为,真正的json格式,类似于mysql \G
> db.oldguo.find().pretty() ## 全表的所有数据行,显示为真正的json格式。
删除集合
> use app
> db.log.drop() //删除集合
– 重命名集合
//把log改名为log1
app> db.log.renameCollection("log1")
批量插入数据:
在mongodb中可以用for循环,直接插入数据
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}
Mongodb数据查询语句:
– 查询集合中的记录数
> db.log.find() //查询所有记录
注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
设置每页显示数据的大小:
> DBQuery.shellBatchSize=50;
//每页显示50条记录
> db.log.findOne() //查看第1条记录
db.log.count() //查询总的记录数
– 删除集合中的记录数
> db.log.remove({}) //删除集合中所有记录
> db.log.distinct("name") //查询去掉当前集合中某列的重复数据
– 查看集合存储信息
> db.log.stats()
> db.log.dataSize() //集合中数据的原始大小
> db.log.totalIndexSize() //集合中索引数据的原始大小
> db.log.totalSize() //集合中索引+数据压缩存储之后的大小 (字节单位) *****
> db.log.storageSize() //集合中数据压缩存储的大小
5、用户管理 *****
注意:
验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库(创建普通用户,要管理那个就use 到那个库,再创建)
2. 登录时,必须明确指定验证库才能登录
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库。
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.
登录到mongodb ##(都在mongod 用户下操作)
use admin
db.createUser
{
user: "<name>",
pwd: "<cleartext password>",
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
基本语法说明:
user:用户名
pwd:密码
roles:
role:角色名
db:作用对象
role:root(本地管理员), readWrite(读写),read(读)
用户管理例子:
-- 1. 创建超级管理员:管理所有数据库(必须use admin再去创建) *****
$ mongo
use admin
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
验证用户
db.auth('root','root123')
1 表示,验证成功。
验证数据库:
配置文件中,加入以下配置
security:
authorization: enabled
重启mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf
登录验证
mongo -uroot -proot123 192.168.68.190/admin
或者
mongo
use admin
db.auth('root','root123')
查看用户:
use admin
db.system.users.find().pretty()
==================
-- 2、创建库管理用户
mongo -uroot -proot123 admin
use app
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app" } ]
}
)
dbAdmin 只能对库进行操作,不能对表进行操作。
db.auth('admin','admin')
登录测试
mongo -uadmin -padmin 192.168.68.190/app
-- 3、创建对app数据库,读、写权限的用户app01 *****
(1)超级管理员用户登陆
mongo -uroot -proot123 admin ##本地登录
(2)选择一个验证库
use app
(3)创建用户
db.createUser(
{
user: "app01",
pwd: "app01",
roles: [ { role: "readWrite" , db: "app" } ]
}
)
mongo -uapp01 -papp01 192.168.68.190/app
删除创建的用户,在那个库下面创建的用户,删除的时候,需要先use 到那个库
use admin
db.dropUser("app01")
-- 4、创建app数据库读写权限的用户并对test数据库具有读权限:
mongo -uroot -proot123 192.168.68.190/admin
use app
db.createUser(
{
user: "app03",
pwd: "app03",
roles: [ { role: "readWrite", db: "app" },
{ role: "read", db: "test" }]}
)
-- 5、查询mongodb中的用户信息
mongo -uroot -proot123 192.168.68.190/admin
db.system.users.find().pretty() ##查询所有mongodb中的所有用户
{
"_id" : "admin.root", ## 验证库为admin ,root用户
"user" : "root",
"db" : "admin", ##所管理的库,是那个
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "HsSHIKBQyMnFEzA/PSURYA==",
"storedKey" : "dbOoQserGa/fB+JQyLqr1yXQZBM=",
"serverKey" : "h+b/vARfWp6cmDquUN6bJo4whdc="
}
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
-- 6、删除用户(root身份登录,use到验证库)
一定要以管理员用户登录,再use到库,再删除用户。
删除用户
# mongo -uroot -proot123 192.168.68.190/admin
use app
db.dropUser("app01")
---------------------------------