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")
---------------------------------
>
> db.oldguo.find()
> db.log.
或者
删除创建的用户,在那个库下面创建的用户,
---------------------------------