1.NoSQL-lesson14-MongoDB核心技术-运维篇
逻辑结构
Mongodb 逻辑结构 MySQL逻辑结构
库database 库
集合(collection) 表
文档(document) 数据行
选择之所以称为为选择,肯定是痛苦的!
------>oldguo
安装部署
1.系统准备
(1)redhat或centos6.x以上系统 (2)系统开发报完整 (3)IP地址和hosts文件解析正常 (5)关闭大页内存机制 ############################################## root用户下 在 /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 cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag
2.mongodb安装
创建用户和组
useradd mongod
passwd mongod
创建mongodb目录
mkdir -p /mongodb/{conf,log,data}
上传或者下载mongodb,下载地址:http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.7.tgz
tar xf mongodb-linux-x86_64-rhel70-4.2.7.tgz cp -r mongodb-linux-x86_64-rhel70-4.2.7/bin/ /mongodb # 设置目录结构权限 chown -R mongod. /mongodb
设置环境变量
su - mongod vi .bash_profile export PATH=/mongodb/bin:$PATH source .bash_profile
启动mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
登录mongodb
mongo
使用配置文件
YAML模式 NOTE: YAML does not support tab characters for indentation: use spaces instead. --系统日志有关 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: 192.169.0.11,127.0.0.1 EOF 重启mongodb mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf
mongodb使用system管理:需要在root用户下创建
[root@db01 ~]# 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
3、mongodb常用基本操作
mongodb默认存在的库:
test:登录时默认存在的库 管理MongoDB有关的系统库 admin库:系统预留库,MongoDB系统管理库 local库:本地预留库,存储关键日志 config库:MongoDB配置信息库 show database/show dbs show tables/show collection use admin db/select database()
命令种类:
db 对象相关命令 oldboy是一个库,当次库不存在时会自动创建
db.[TAB][TAB]
db.oldboy.[TAB][TAB]
db.oldboy.help()
rs 复制集相关(replication set):
rs.[TAB][TAB]
rs.help()
sh 分片集群(sharding cluster):
sh.[TAB][TAB]
sh.help()
4、mongodb对象操作
mongo | mysql |
库 | 库 |
集合 | 表 |
文档 | 数据行 |
库的操作:
进入test表并且丢弃(删除) >use test >db.dropDatabase() { "dropped" : "test", "ok" : 1 }
集合的操作:
>use app >db.createCollection('a') { "ok" : 1 } app> db.createCollection('b') 方法2:当插入一个文档的时候,一个集合就会自动创建。 在oldboy库中添加(增加/创建)数据 use oldboy db.test.insert({name:"shenzhen"}) db.stu.insert({id:100,name:"luohu",age:20,gender:"it"}) 查看库中的文档 show tables; 继续创建 db.stu.insert({id:102,name:"list"}) db.stu.insert({a:"b",c:"d"}) db.stu.insert({a:1,c:2}) 查看stu文档中的数据 > db.stu.find() { "_id" : ObjectId("5ed10863d6b2b3443565354e"), "id" : 101, "name" : "guanzhou", "age" : 20, "genber" : "m" }
文档的操作:
数据录入: #for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})} for (i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})} 查询数据行数: >db.log.count() 全表查询 log: >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") } 删除集合中所有记录: >use app app> db.log.remove({}) 查看 集合存储信息: app> db.log.totalSize() //集合中索引+数据压缩存储之后的大小
用户管理
5、用户权限管理
注意:
验证库: 建立用户时use到的库,在使用用户时,要加上验证库才能登录。
对于管理员用户,必须在admin库下创建
1.建立用户时,use到的库,就是此用户的验证库
2.登录时,必须明确指定验证库才能登录
3.通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4.如果直接登录到数据库,不进行use,默认的验证是test,部署我们生成建议的
5.从3.6版本开始,不添加bindIp参数,只能本地管理员登录
用户创建语法
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 192.168.0.10/oldboy
用户管理例子:
创建超级管理员: 管理所有数据库(必须use admin再去创建) $ mongo use admin db.createUser( { user: "root", pwd: "root123", roles: [ { role: "root", db: "admin" } ] } ) 验证用户: > db.auth('root','root123') 1
在配置文件中,最后面加入以下配置代码:/mongodb/conf/mongo.conf
security:
authorization: enabled
重启mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf
登录验证
mongo -uroot -proot123 admin mongo -uroot -proot123 192.168.0.10/admin mongo -uroot -proot123 192.168.0.10/oldboy 或者 mongo use admin db.auth('root','root123')
查看用户
use admin
db.system.users.find().pretty()
创建普通用户
在oldbiy库下创建 use oldboy db.createUser( { user: "app01", pwd: "app01", roles: [ { role: "readWrite" , db: "oldboy" }] } ) 验证: mongo -uapp1 -papp1 app
查询mongodb中的用户信息
mongo -uroot -proot123 192.168.0.10/admin
db.system.users.find().pretty()
删除用户(root身份登录,use到验证库)
删除用户 db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]}) mongo -uroot -proot123 10.0.0.53/admin use oldboy1 db.dropUser("app02")
用户管理注意事项
1.建用户要有验证库,管理员admin,普通用户是要管理的库 2.登录时,注意验证库 mongo -uapp01 -papp01 192.168.0.10:27017/oldboy 3.重点参数 net: port: 27017 bindIp: 192.168.0.10.127.0.0.1 security: authorization: enabled
集群管理
6、MongoDB复制集RS(ReplicayionSet)
基本原理
基本改成是1主2从的结构,自带互相监控投票机制(Raft (MongoDB) Paxos (mysql MGR 用的是变种) )
如果发生主库宕机,复制机内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序,主库已经发生切换了。 应用就会连接到新的主库。
Replication Set配置过程详解
规划:三个以上的mongodb节点 (或多实例)
环境准备,基于多个端口
28017、28018、28019、28020
创建多个目录
su - mongod mkdir -p /mongodb/28017/{conf,log,data} mkdir -p /mongodb/28018/{conf,log,data} mkdir -p /mongodb/28019/{conf,log,data} mkdir -p /mongodb/28020/{conf,log,data}
创建多个配置文件
touch /mongodb/28017/conf/mongo.conf touch /mongodb/28018/conf/mongo.conf touch /mongodb/28019/conf/mongo.conf touch /mongodb/28020/conf/mongo.conf
配置文件详细内容
cat > /mongodb/28017/conf/mongo.conf <<EOF systemLog: destination: file path: /mongodb/28017/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/28017/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true net: bindIp: 192.168.0.10,127.0.0.1 port: 28017 replication: oplogSizeMB: 2048 replSetName: my_repl EOF 拷贝文件,并修改端口: \cp /mongodb/28017/conf/mongo.conf /mongodb/28018/conf/ \cp /mongodb/28017/conf/mongo.conf /mongodb/28019/conf/ \cp /mongodb/28017/conf/mongo.conf /mongodb/28020/conf/ sed 's#28017#28018#g' /mongodb/28018/conf/mongo.conf -i sed 's#28017#28019#g' /mongodb/28019/conf/mongo.conf -i sed 's#28017#28020#g' /mongodb/28020/conf/mongo.conf -i
启动多个实例备用
mongod -f /mongodb/28017/conf/mongo.conf mongod -f /mongodb/28018/conf/mongo.conf mongod -f /mongodb/28019/conf/mongo.conf mongod -f /mongodb/28020/conf/mongo.conf netstat -nutlp|grep 280 ps -ef|grep mongo
配置普通复制集:(1主2从,1主1从1arbiter: 2选1)
1主2从,从库普通从库 登录到28017实例,也将这个实例作为主节点 mongo --port 28017 admin 定义个变量名(config)可以自定义, 组名"my_repl"需要和配置文件中一致, 成员有3个实例 > config = {_id: 'my_repl', members: [ {_id: 0, host: '192.168.0.10:28017'}, {_id: 1, host: '192.168.0.10:28018'}, {_id: 2, host: '192.168.0.10:28019'}] } 构建集群(初始化) > rs.initiate(config) 查询复制集状态 > rs.status();
1主1从1个arbiter:
mongo -port 28017 admin config = {_id: 'my_repl', members: [ {_id: 0, host: '192.168.0.10:28017'}, {_id: 1, host: '192.168.0.10:28018'}, {_id: 2, host: '192.168.0.10:28019',"arbiterOnly":true}] } rs.initiate(config)
复制集群管理操作
查看复制集状态 rs.status(); //查看整体复制集状态 rs.isMaster(); //查看当前是否主节点 rs.conf(); //查看复制集配置信息
添加删除节点
rs.remove("ip:port"); // 删除一个节点 rs.add("ip:port"); // 新增从节点 rs.addArb("ip:port"); // 新增仲裁节点 例子: 添加 arbiter节点 1、连接到主节点 [mongod@db03 ~]$ mongo --port 28018 admin 2、添加仲裁节点 > rs.addArb("192.168.0.10:28020") 3、查看节点状态 > rs.isMaster() { "hosts" : [ "192.168.0.10:28017", "192.168.0.10:28018", "192.168.0.10:28019" ], "arbiters" : [ "192.168.0.10:28020" ], rs.remove("ip:port"); // 删除一个节点 例子: > rs.remove("192.168.0.10:28019"); { "ok" : 1 } > rs.isMaster() rs.add("ip:port"); // 新增从节点 例子: > rs.add("192.168.0.10:28019") { "ok" : 1 } > rs.isMaster()
特殊从节点
arbiter节点: 主要负责选主过程中的投票,但是不存储任何数据,页不提供任何服务
hidden节点: 隐藏节点,不参与选主,也不对外提供服务
delay节点: 延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下将delay+hidden一起配置使用
配置延时节点(一般延时节点也配置成hidden)
rs.conf(); 可以查看集群配置信息包括节点id cfg=rs.conf() cfg.members[4].priority=0 cfg.members[4].hidden=true cfg.members[4].slaveDelay=120 rs.reconfig(cfg) 取消以上配置 cfg=rs.conf() cfg.members[4].priority=1 cfg.members[4].hidden=false cfg.members[4].slaveDelay=0 rs.reconfig(cfg) 配置成功后,通过以下命令查询配置后的属性 rs.conf();
副本集其他操作命令:
查看副本集的配置信息 admin> rs.conf() 查看副本集各成员的状态 admin> rs.status() ++++++++++++++++++++++++++++++++++++++++++++++++ --副本集角色切换(不要人为随便操作) admin> rs.stepDown() 注: admin> rs.freeze(300) //锁定从,使其不会转变成主库 freeze()和stepDown单位都是秒。 +++++++++++++++++++++++++++++++++++++++++++++ 设置副本节点可读:在副本节点执行 admin> rs.slaveOk() eg: admin> use app switched to db app app> db.createCollection('a') { "ok" : 0, "errmsg" : "not master", "code" : 10107 } 查看副本节点(监控主从延时) admin> rs.printSlaveReplicationInfo() source: 192.168.1.22:27017 syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST) 0 secs (0 hrs) behind the primary OPlog日志(备份恢复章节)