逻辑结构

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

安装部署

系统准备

  • redhat或cnetos6.2以上系统
  • 系统开发包完整
  • ip地址和hosts文件解析正常
  • iptables防火墙&SElinux关闭
  • 关闭大页内存机制
  • 二进制包下载地址

root用户下执行以下操作

#执行命令
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

#设置开机执行命令
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

为什么要关闭大页内存机制

  • 其他系统关闭参照官方文档
  • Transparent Huge Pages (THP) is a Linux memory management system that reduces the overhead of Translation Lookaside Buffer (TLB) lookups on machines with large amounts of memory by using larger memory pages.However, database workloads often perform poorly with THP, because they tend to have sparse rather than contiguous memory access patterns. You should disable THP on Linux machines to ensure best performance with MongoDB.

加大文件描述

#添加该配置
echo '*               -       nofile          65536' >>/etc/security/limits.conf
#查看配置是否成功
tail -1 /etc/security/limits.conf
#重新登录后可以使用改命令查看open files的数量
ulimit -a

mongodb安装

#创建所需用户和组
useradd mongod;echo mongod|passwd --stdin mongod

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

#解压压缩包
tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz

#解压后复制到指定目录下
cp -a ./mongodb-linux-x86_64-rhel70-3.2.16/bin/* /mongodb/bin

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

#设置用户环境变量
#需要切换到mongod用户
su - mongod
echo 'export PATH=/mongodb/bin:$PATH' >> .bash_profile
source .bash_profile

#启动mongodb
#需要切换到mongod用户
su - mongod
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork

#登录mongodb
su - mongod
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>                       -- 监听地址,如果不配置这行是监听在0.0.0.0
   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>
  • 使用以下配置文件内容(在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: 10.0.0.51,127.0.0.1
EOF

重启应用新的配置文件

#关闭
mongod -f /mongodb/conf/mongo.conf --shutdown
#启动
mongod -f /mongodb/conf/mongo.conf

配置systemd管理

  • 配置以后可以systemctl命令控制mongodb
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

mongodb常用基本操作

数据库对象(库(database),表(collection),行(document))

  • mongo : 默认登录数据库
  • mongo admin : 默认登录到admin库

库表相关命令

  • show databases; : 查看库
  • show dbs : 查看库
  • use 1997sty : 切换到1997sty库
  • show tables : 查看当前库下所有表
  • show collections : 查看当前库下所有表

db对象相关命令

  • db : 查看当前所在的库
  • db.sty1.insert({test:132}) : 在当前库的sty1表插入一条数据,如果表不存在则创建表
  • db.test.find() : 查看test表的数据
  • db.help() : 查看db命令使用帮助
  • db.version() : 查看当前db版本
  • db.getMongo() : 查看当前数据库的连接机器地址

rs 复制集有关(replication set)

  • rs.help() : 查看rs命令使用帮助

sh 分片集群(sharding cluster)

  • sh.help() : 查看sh命令使用帮助

库的操作

  • db.dropDatabase() : 删除当前所在的库,删除之前可以用db命令确认

集合的操作

  • db.createCollection('zxc') : 在当前库下创建zxc表(当插入一个文档的时候,一个集合就会自动创建)
  • db.zxc.drop() : 删除zxc表

查询操作

#进入到1997sty库
use 1997sty
#创建一条sty1集合的数据,如果没有该集合就自动创建
db.sty1.insert({id : "1021" ,name : "zhssn" ,age : "22" ,gender : "female",address : "sz"})
db.sty1.insert({id : "101" ,name : "zhangsan" ,age : "18" ,gender : "male"})
#查询sty1集合的数据
db.sty1.find()
#查询sty1集合的数据条件为{id:"101"}
db.sty1.find({id:"101"})
#查询sty1集合的数据,格式化显示
db.sty1.find().pretty()
#删除sty1集合
db.sty1.drop()
#把sty1改名为sty2
db.sty1.renameCollection("sty2")
#批量插入数据
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}
#查询命令每页显示30条数据
DBQuery.shellBatchSize=30
#查询log集合第一条记录
db.log.findOne()
#查询log集合总的记录数
db.log.count()
#删除log集合中所有记录
db.log.remove({})
#针对name列进行去重查询
db.log.distinct("name")
#集合中数据的原始大小
db.log.dataSize()
#集合中索引数据的原始大小
db.log.totalIndexSize()
#集合中索引+数据压缩存储之后的大小
db.log.totalSize()
#集合中数据压缩存储的大小
db.log.storageSize()

用户管理

对于验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登录

  • 例如,创建该用户时,之前use 1997sty,在远程登录时需要在登录时加上1997sty的库信息,比如这样,mongo -u 1997sty -p 123 10.0.0.51/1997sty.对于管理员用户,必须在admin下创建
  1. 建用户时,use到的库,就是此用户的验证库
  2. 登录时,必须明确指定验证库才能登录
  3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
  4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.

创建超级管理员

超级管理员,可以管理所有数据库,必须use admin后再去创建

#切换到admin
use admin
#创建用户
db.createUser({user: "root",pwd: "123456",roles: [{ role: "root", db: "admin" }]})
#创建完成后可以用以下命令确认
db.auth('root','123456')
#查看用户
use admin
db.system.users.find().pretty()

#远程登录该用户命令
mongo -u root -p 123456 10.0.0.51/admin

创建用户语法

#db.createUser
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>", db: "<database>" } | "<role>",
    ...
    ]
}
  • user : 用户名
  • pwd : 密码
  • roles : 权限列表
  • role : 角色名,有三种选择(root,readWrite,read)
  • db : 作用对象

开启库验证

#配置文件修改完成后重启
vi /mongodb/conf/mongo.conf

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
-- 以下参数开启登录验证,修改后重启生效
security:
   authorization: enabled

登录测试

mongo -uroot -p123456  admin
mongo -uroot -p123456  10.0.0.51/admin

创建库管理用户

库管理用户,可以管理指定数据库

#切换到app
use app
#创建用户
db.createUser({user: "app01",pwd: "app01",roles: [ { role: "readWrite" , db: "app" } ]})
#创建完成后可以用以下命令确认
db.auth('app01','app01')

#远程登录该用户命令
mongo -u app01-p app01 10.0.0.51/app

创建用户语法

#db.createUser
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>", db: "<database>" } | "<role>",
    ...
    ]
}
  • user : 用户名
  • pwd : 密码
  • roles : 权限列表
  • role : 角色名,有三种选择(root,readWrite,read)
  • db : 作用对象

创建app数据库读写权限的用户并对test数据库具有读权限

use app
db.createUser({user: "app03",pwd: "app03",roles: [ { role: "readWrite", db: "app" },{ role: "read", db: "test" }]})

删除用户(root身份登录,use到验证库)

#root身份登录,use到验证库
#mongo -uroot -p123456 10.0.0.51/admin

use app
db.dropUser("app01")

MongoDB复制集RS(ReplicationSet)

  • 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
  • 如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务.同时复制集会自动通知
  • 客户端程序,主库已经发生切换了.应用就会连接到新的主库

QQ截图20200504122843.png

QQ截图20200504122903.png

QQ截图20200504122921.png

QQ截图20200504122930.png

Replication Set配置1主2从

规划

  • 三个以上的mongodb节点(或多实例)

环境准备

  • 多个端口:28017,28018,28019,28020

准备目录

su - mongod
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

准备配置文件

cat > /mongodb/28017/conf/mongod.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: 10.0.0.51,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF

#复制后批量替换
cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/

sed -i 's#28017#28018#g' /mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /mongodb/28019/conf/mongod.conf
sed -i 's#28017#28020#g' /mongodb/28020/conf/mongod.conf

启动多实例后查看

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf

netstat -lnp|grep 280

配置普通复制集

  • 1主2从,普通从库
-- 登录任意一个节点
mongo --port 28017 admin

-- 配置信息
config = {_id: 'my_repl', members: [
  {_id: 0, host: '10.0.0.51:28017'},
  {_id: 1, host: '10.0.0.51:28018'},
  {_id: 2, host: '10.0.0.51:28019'}]
}

-- 初始化复制集
rs.initiate(config)

-- 查询复制集状态
rs.status()

Replication Set配置1主1从1arbiter

规划

  • 三个以上的mongodb节点(或多实例)

环境准备

  • 多个端口:28017,28018,28019,28020

准备目录

su - mongod
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

准备配置文件

cat > /mongodb/28017/conf/mongod.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: 10.0.0.51,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF

#复制后批量替换
cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/

sed -i 's#28017#28018#g' /mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /mongodb/28019/conf/mongod.conf
sed -i 's#28017#28020#g' /mongodb/28020/conf/mongod.conf

启动多实例后查看

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf

netstat -lnp|grep 280

配置普通复制集

  • 1主2从,普通从库
-- 登录任意一个节点
mongo --port 28017 admin

-- 配置信息
config = {_id: 'my_repl', members: [
  {_id: 0, host: '10.0.0.51:28017'},
  {_id: 1, host: '10.0.0.51:28018'},
  {_id: 2, host: '10.0.0.51:28019',"arbiterOnly":true}]
}

-- 初始化复制集
rs.initiate(config)

-- 查询复制集状态
rs.status()

复制集管理操作

  • rs.status() : 查看整体复制集状态
  • rs.isMaster() : 查看当前是否是主节点
  • rs.conf() : 查看复制集配置信息
  • rs.remove("ip:port") : 删除一个节点
  • rs.add("ip:port") : 新增从节点
  • rs.addArb("ip:port") : 新增仲裁节点

修改当前节点为arbiter节点

-- 先删除,在添加arbiter节点
rs.remove("10.0.0.51:28019")
rs.addArb("10.0.0.51:28019")

-- 查看结果
rs.conf()

特殊从节点

  • arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
  • hidden节点:隐藏节点,不参与选主,也不对外提供服务
  • delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
  • 一般情况下会将delay+hidden一起配置使用

配置延时节点(一般延时节点也配置成hidden)

  • rs.conf()内容查看
{
        "_id" : "my_repl",
        "version" : 3,
        "protocolVersion" : NumberLong(1),
        "members" : [
                {
                        "_id" : 0,
                        "host" : "192.168.50.254:28017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 1,
                        "host" : "192.168.50.254:28018",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 2,
                        "host" : "192.168.50.254:28019",
                        "arbiterOnly" : true,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 0,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "catchUpTimeoutMillis" : -1,
                "catchUpTakeoverDelayMillis" : 30000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("5eaf9de936f0ac659c74339f")
        }
}
  • 设置延时从节点
-- 添加到变量
cfg=rs.conf()

-- 修改第二节点的信息
cfg.members[2].priority=0
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120

-- 修改配置
rs.reconfig(cfg)

-- 查看结果
rs.conf()
  • 取消以上配置
-- 添加到变量
cfg=rs.conf()

-- 修改第二节点的信息
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0

-- 修改配置
rs.reconfig(cfg)

-- 查看结果
rs.conf()

副本集其他操作命令

  • rs.conf() : 查看副本集的配置信息
  • rs.status() : 查看副本集各成员的状态
  • rs.stepDown() : 副本集角色切换(不要人为随便操作)
  • rs.freeze(300) : 锁定从,使其不会转变成主库,freezestepDown单位都是秒
  • rs.slaveOk() : 设置副本节点可读:在副本节点执行
  • rs.printSlaveReplicationInfo() : 查看副本节点(监控主从延时)