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}
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日志(备份恢复章节)

 

posted on 2021-03-07 17:06  蜂蜜log  阅读(101)  评论(0编辑  收藏  举报

导航