二、Mongodb搭建及集群、库和集合的基本操作

1. 逻辑结构


Mongodb的存储格式为json格式,存储结构灵活,数据压缩比高。

{
  id:101,
  name:'john'
}

适用场景:对数据一致性要求不高,数据量级大,数据格式灵活
应用场景:银行流水系统,大数据平台

2. 安装MongoDB

2.1 安装依赖软件

yum install libcurl openssl xz-libs

2.2 关闭大叶内存(THP)

透明大页面(THP)是一种Linux内存管理系统,它通过使用较大的内存页面来减少具有大量内存的计算机上的转换后备缓冲区(TLB)查找的开销。但是,启用THP时,数据库工作负载通常表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。在Linux上运行MongoDB时,应禁用THP以获得最佳性能。

创建服务文件vim /etc/systemd/system/disable-transparent-huge-pages.service

[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'

[Install]
WantedBy=basic.target

重新加载systemd,并关闭大页内存

systemctl daemon-reload
systemctl start disable-transparent-huge-pages
systemctl enable disable-transparent-huge-pages

检查结果

cat /sys/kernel/mm/transparent_hugepage/enabled
#部分redhat系统需要执行下面的命令
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

2.3 下载安装MongoDB

下载tar包

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz

解包后制作软链接

mv <mongodb-install-directory> /usr/local/
ln -s /usr/local/<mongodb-install-directory> /usr/local/mongodb

配置环境变量vim /etc/profile

export PATH=/usr/local/mongodb/bin:$PATH

创建数据和日志目录

mkdir -p /var/lib/mongodb
mkdir -p /var/log/mongodb
mkdir -p /usr/local/mongodb/conf

创建mongod用户

useradd mongod -M -s /usr/sbin/nologin

更改目录权限

chown -R mongod:mongod /var/lib/mongodb
chown -R mongod:mongod /var/log/mongodb
chown -R mongod:mongod /usr/local/mongodb

2.4 编辑MongoDB配置文件

配置文件详解

--系统日志有关  
systemLog:
   destination: file        
   path: "/var/log/mongodb/mongodb.log"    --日志位置
   logAppend: true                     --日志以追加模式记录
  
--数据存储有关   
storage:
   journal:
      enabled: true
   dbPath: "/var/lib/mongodb"            --数据路径的位置

-- 进程控制  
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>
---

配置文件示例vim /usr/local/mongodb/conf/mongo.conf

systemLog:
   destination: file
   path: "/var/log/mongodb/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/var/lib/mongodb"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 127.0.0.1,10.0.0.51

2.5 手工启动mongodb

启动

mongod --dbpath=/var/lib/mongodb --logpath=/var/log/mongodb/mongodb.log --port=27017 --logappend --fork 

mongod -f /usr/local/mongodb/conf/mongo.conf

停止

mongod -f /usr/local/mongodb/conf/mongo.conf --shutdown

2.6 使用systemd管理Mongodb

vim /etc/systemd/system/mongod.service

[Unit]
Description=mongodb 
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf --shutdown
PrivateTmp=true  
[Install]
WantedBy=multi-user.target

2.7 登录Mongodb

本地登录

#没有开启认证
mongo

#开启认证
mongo -u 用户名 -p 密码

远程登录

mongo -u 用户名 -p 密码 IP:端口/认证库

2.8 日志切割

修改配置文件/etc/mongod.conf

...
systemLog:
...
  logAppend: true
  logRotate: reopen
...

配置logrotate

/var/log/mongodb/*log {
        create 0664 mongod mongod
        daily
        dateext
        rotate 10
        missingok
        notifempty
        nocompress
        sharedscripts
        postrotate
                /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid` 2>/dev/null || true
        endscript
}

3. MongoDB常用基本操作

3.1 MongoDB默认存在的库

系统库:

  • admin:系统预留库,MongoDB系统管理库
  • local库:本地预留库,存储关键日志
  • config库:MongoDB配置信息库

默认库:
test:登录时默认存在的库

3.2 常用操作

查询所有数据库

show databases/show dbs

查询库中的所有表

show tables/show collections

切换/创建数据库

use admin

查看当前使用的数据库,等于mysql中select database()

db

3.3 命令查看帮助

3.3.1 db对象相关

db.[TAB][TAB]:按两下TAB,显示db类的所有操作
db.help():查询db所有操作的用法
db.表1.[TAB][TAB]:按两下TAB,显示db下表1的所有操作,表1不用事先创建
db.表1.help():显示db下表1的所有操作的用法

3.3.2 rs(replication set)复制集相关

rs.[TAB][TAB]:按两下TAB,显示rs类的所有操作
rs.help():查询rs所有操作的用法

3.3.3 sh(sharding cluster)分片集群相关

sh.[TAB][TAB]:按两下TAB,显示sh类的所有操作
sh.help():查询sh所有操作的用法

3.4 MongoDB对象操作

3.4.1 库的操作

use 库1:切换/创建数据库
db.dropDatabase():删除当前库

3.4.2 集合的操作

对集合进行操作时,无需提前创建集合
db.集合名.insert({id:101,name:"wmz",age:18}):创建集合,并插入1行json格式数据
db.集合名.insert([{"id":1},{"id":2}]):创建集合,并插入多行json格式数据
db.集合名.find():查询集合的数据

> db.test.find()
{ "_id" : ObjectId("6093b26b23a521588011c703"), "id" : 101, "name" : "wmz", "age" : 18 }

db.集合名.find().pretty():查询集合的数据,并优雅显示

> db.test.find().pretty()
{
    "_id" : ObjectId("6093b26b23a521588011c703"),
    "id" : 101,
    "name" : "wmz",
    "age" : 18
}

db.集合名.find({id:100}):条件查询,查询id=100的数据
db.集合名.count():查询集合中有多少行数据
for(i=0;i<10000;i++){db.集合名.insert({"uid":i})}:利用for函数,循环插入10000行数据
db.集合名.drop():删除集合
db.集合名.remove({}):删除集合中的所有记录
db.集合名.totalSize():集合中索引+数据压缩存储之后的大小
db.getCollectionInfos({"name":"集合名"}):显示集合或视图的配置信息,不配置{"name":"集合名"}则显示全部的配置信息

4. 用户及权限管理

4.1 验证库

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

注意事项:

  1. 对于管理员用户,必须在admin下创建
  2. 登录时,必须明确指定验证库才能登录
  3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设为验证库
  4. 如果直接登录到数据库,不进行use,默认的验证库是test,生产中不建议
  5. 从3.6版本开始,不添加bindIp参数,默认不允许远程登录,只能本地管理员登录

4.2 创建用户语法

use admin
db.createUser(
{
  user:"<name>",
  pwd:"<cleartext password>",
  roles:[
    { role:"<role>",
    db:"database" } | "<role>",
  ...
  ]
}
)

语法说明:
user:用户名
pwd:密码
roles:

  • role:角色名,常用有3种root,readWrite,read
  • db:作用对象

4.3 管理员用户创建流程

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

use admin
db.createUser(
{
  user:"root",
  pwd:"123",
  roles:[ { role:"root",db:"admin" } ]
}
)

验证用户

> db.auth('root','123')
1

配置文件中加入以下配置vim /usr/local/mongodb/conf/mongo.conf

注意:一定要在创建完管理员用户后配置,否则会远程登录不上数据库

security:
  authorization: enabled

重启mongodb服务

4.4 应用用户创建

创建应用用户:use 到应用库再去创建

use bigsky
db.createUser(
{
  user:"app",
  pwd:"123",
  roles:[ { role:"readWrite",db:"bigsky" } ]
}
)

4.5 登录命令

mongo -u 用户名 -p 密码 IP地址/验证库

mongo -u bigsky -p 123 10.0.0.51/school

4.6 MongoDB中的用户信息查询

use admin
db.system.users.find().pretty()

4.7 删除用户

需要管理员用户进入用户的验证库删除

#登录
mongo -uroot -p123 10.0.0.51/admin
#删除
use bigsky
db.dropUser("app2")

5 MongoDB复制集RS(Replication Set)

基础架构
演变架构

5.1 基本原理

基本结构是1主2从结构,自带相互监控投票机制(Raft协议,Mysql的MGR使用的是变种的Paxos协议),具有如下特点:

  1. 不需要额外的中间件,能够保证数据实时复制及一致性
  2. 如果主库宕机,复制集内部会进行投票选举,选出新的主库带外服务
  3. 主库宕机发生切换,会自动通知客户端连接新的主库

演变架构,1主1从1仲裁者,仲裁者不参与数据的同步,只有仲裁投票的功能。

默认登录到Secondary节点不能进行读写操作,需要在Secondary节点上运行rs.slaveOK(),从而开启当前登录会话在从节点上的读权限

5.2 Replication Set配置

5.2.1 环境准备

创建多实例目录

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:
    port: 28017
    bindIp: 127.0.0.1,接口IP地址
replication:
    oplogSizeMB: 2048
    replSetName: my_repl
EOF
cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/mongod.conf
cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/mongod.conf
cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/mongod.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

5.2.1.1 配置文件参数解释

#使用wiredTiger存储引擎
    wiredTiger:
        engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
        collectionConfig:
            blockCompressor: zlib
        indexConfig:
            prefixCompression: true


#复制集相关参数
replication:
    #类似于mysql的binlog,日志大小设置
    oplogSizeMB: 2048
    #复制集的名字
    replSetName: my_repl

5.2.2 配置普通复制集

1主2从,从库普通从库

连接mongodb

mongo 127.0.0.1:28017/admin

添加复制集配置,_id必须和配置文件中的replSetName字段的值一致,本例是my_repl

config = {_id: "my_repl", members: [
            {_id: 0, host: '127.0.0.1:28017'},
            {_id: 1, host: '127.0.0.1:28018'},
            {_id: 2, host: '127.0.0.1:28019'}
            ]
        }

rs.initiate(config)

查询复制集状态

rs.status()

此时登录的节点已经能够显示所在的复制集和主从状态


5.2.3 配置扩展复制集

1主1从1个arbiter,与普通复制集配置config稍有变化,其余步骤一样

config = {_id: "my_repl", members: [
            {_id: 0, host: '127.0.0.1:28017'},
            {_id: 1, host: '127.0.0.1:28018'},
            {_id: 2, host: '127.0.0.1:28019',"arbiterOnly":true}
            ]
        }

rs.initiate(config)

5.3 Replication Set管理操作

5.3.1 查看复制集状态

rs.status()查看整个复制集的状态
rs.isMaster()查看当前是否是主节点

rs.conf()查看当前复制集的配置信息

5.3.2 添加删除节点

只能在primary节点上操作,将现有节点变更为arbiter,需要先删除节点,再添加为arbiter
rs.remove("ip:port")删除一个节点
rs.add("ip:port")新增从节点
rs.addArb("ip:port")新增仲裁节点

5.4 特殊从节点

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

一般情况下会将delay+hidden一起配置使用

5.4.1 配置延时节点

一般延时节点也配置成hidden

cfg=rs.conf()
cfg.members[节点索引].priority=0
cfg.members[节点索引].hidden=true
cfg.members[节点索引].slaveDelay=120
rs.reconfig(cfg)

#用members的节点索引来确定更改的是哪个节点

配置成功后,通过以下命令查询配置后的属性

rs.conf()

5.4.2 恢复普通节点

cfg=rs.conf()
cfg.members[节点索引].priority=1
cfg.members[节点索引].hidden=false
cfg.members[节点索引].slaveDelay=0
rs.reconfig(cfg)

6 MongoDB Sharding Cluster 分片集群


节点功能:

  • shard: 存储数据的节点,需要复制集部署
  • mongos: 承接用户请求的路由节点,负责将用户的请求分发到后端的shard节点,无需存储数据,需要向Config Server请求Shard集群信息
  • config servers: 存储节点元数据和整个集群的配置,路由分片的规则也在整个节点上,需要复制集部署

规划:
10个实例:38017-38026

  1. configserver:3台构成的复制集(1主2从,不支持arbiter)38018-38020,复制集名字configsvr
  2. shard节点:
    • sh1:38021-23,1主2从,其中一个节点为arbiter,复制集名字sh1
    • sh2:38024-26,1主2从,其中一个节点为arbiter,复制集名字sh2

configserver可以是一个节点,官方建议复制集。configserver不能有arbiter。
3.4版本之后,虽然要求config server为replica set,但是不支持arbiter

  1. mongos节点

6.1 sh复制集

6.1.1 环境准备

创建多实例目录

mkdir -p /mongodb/38021/conf /mongodb/38021/data /mongodb/38021/log
mkdir -p /mongodb/38022/conf /mongodb/38022/data /mongodb/38022/log
mkdir -p /mongodb/38023/conf /mongodb/38023/data /mongodb/38023/log
mkdir -p /mongodb/38024/conf /mongodb/38024/data /mongodb/38024/log
mkdir -p /mongodb/38025/conf /mongodb/38025/data /mongodb/38025/log
mkdir -p /mongodb/38026/conf /mongodb/38026/data /mongodb/38026/log

编写sh1节点组配置文件

cat > /mongodb/38021/conf/mongod.conf <<EOF
systemLog:
    destination: file
    path: "/mongodb/38021/log/mongodb.log"
    logAppend: true
storage:
    journal:
        enabled: true
    dbPath: "/mongodb/38021/data"
    directoryPerDB: true
    #engine: wiredTiger
    wiredTiger:
        engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
        collectionConfig:
            blockCompressor: zlib
        indexConfig:
            prefixCompression: true
net:
    port: 38021
    bindIp: 127.0.0.1
replication:
    oplogSizeMB: 2048
    replSetName: sh1
sharding:
    clusterRole: shardsvr
processManagement:
    fork: true
EOF


cp /mongodb/38021/conf/mongod.conf /mongodb/38022/conf/mongod.conf
cp /mongodb/38021/conf/mongod.conf /mongodb/38023/conf/mongod.conf

sed -i 's/38021/38022/g' /mongodb/38022/conf/mongod.conf
sed -i 's/38021/38023/g' /mongodb/38023/conf/mongod.conf

编写sh2节点组配置文件

cat > /mongodb/38024/conf/mongod.conf <<EOF
systemLog:
    destination: file
    path: "/mongodb/38024/log/mongodb.log"
    logAppend: true
storage:
    journal:
        enabled: true
    dbPath: "/mongodb/38024/data"
    directoryPerDB: true
    #engine: wiredTiger
    wiredTiger:
        engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
        collectionConfig:
            blockCompressor: zlib
        indexConfig:
            prefixCompression: true
net:
    port: 38024
    bindIp: 127.0.0.1
replication:
    oplogSizeMB: 2048
    replSetName: sh2
sharding:
    clusterRole: shardsvr
processManagement:
    fork: true
EOF


cp /mongodb/38024/conf/mongod.conf /mongodb/38025/conf/mongod.conf
cp /mongodb/38024/conf/mongod.conf /mongodb/38026/conf/mongod.conf

sed -i 's/38024/38025/g' /mongodb/38025/conf/mongod.conf
sed -i 's/38024/38026/g' /mongodb/38026/conf/mongod.conf

启动所有节点

mongod -f /mongodb/38021/conf/mongod.conf
mongod -f /mongodb/38022/conf/mongod.conf
mongod -f /mongodb/38023/conf/mongod.conf
mongod -f /mongodb/38024/conf/mongod.conf
mongod -f /mongodb/38025/conf/mongod.conf
mongod -f /mongodb/38026/conf/mongod.conf

6.1.2 复制集创建

复制集sh1

mongo 127.0.0.1:38021

config = {_id: "sh1", members: [
            {_id: 0, host: '127.0.0.1:38021'},
            {_id: 1, host: '127.0.0.1:38022'},
            {_id: 2, host: '127.0.0.1:38023',"arbiterOnly":true}
            ]
        }

rs.initiate(config)

复制集sh2

mongo 127.0.0.1:38024

config = {_id: "sh2", members: [
            {_id: 0, host: '127.0.0.1:38024'},
            {_id: 1, host: '127.0.0.1:38025'},
            {_id: 2, host: '127.0.0.1:38026',"arbiterOnly":true}
            ]
        }

rs.initiate(config)

6.2 config复制集

6.2.1 环境准备

创建多实例目录

mkdir -p /mongodb/38018/conf /mongodb/38018/data /mongodb/38018/log
mkdir -p /mongodb/38019/conf /mongodb/38019/data /mongodb/38019/log
mkdir -p /mongodb/38020/conf /mongodb/38020/data /mongodb/38020/log

编写配置文件

cat > /mongodb/38018/conf/mongod.conf <<EOF
systemLog:
    destination: file
    path: "/mongodb/38018/log/mongodb.log"
    logAppend: true
storage:
    journal:
        enabled: true
    dbPath: "/mongodb/38018/data"
    directoryPerDB: true
    #engine: wiredTiger
    wiredTiger:
        engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
        collectionConfig:
            blockCompressor: zlib
        indexConfig:
            prefixCompression: true
net:
    port: 38018
    bindIp: 127.0.0.1
replication:
    oplogSizeMB: 2048
    replSetName: configReplSet
sharding:
    clusterRole: configsvr
processManagement:
    fork: true
EOF


cp /mongodb/38018/conf/mongod.conf /mongodb/38019/conf/mongod.conf
cp /mongodb/38018/conf/mongod.conf /mongodb/38020/conf/mongod.conf

sed -i 's/38018/38019/g' /mongodb/38019/conf/mongod.conf
sed -i 's/38018/38020/g' /mongodb/38020/conf/mongod.conf

启动节点

mongod -f /mongodb/38018/conf/mongod.conf
mongod -f /mongodb/38019/conf/mongod.conf
mongod -f /mongodb/38020/conf/mongod.conf

6.2.2 复制集创建

mongo 127.0.0.1:38018

config = {_id: "configReplSet", members: [
            {_id: 0, host: '127.0.0.1:38018'},
            {_id: 1, host: '127.0.0.1:38019'},
            {_id: 2, host: '127.0.0.1:38020'}
            ]
        }

rs.initiate(config)

6.3 mongos节点

6.3.1 环境装备

创建目录

mkdir -p /mongodb/38017/conf /mongodb/38017/data /mongodb/38017/log

编写配置文件

cat > /mongodb/38017/conf/mongos.conf <<EOF
systemLog:
    destination: file
    path: "/mongodb/38017/log/mongos.log"
    logAppend: true
net:
    port: 38017
    bindIp: 127.0.0.1
sharding:
    configDB: configReplSet/127.0.0.1:38018,127.0.0.1:38019,127.0.0.1:38020
processManagement:
    fork: true
EOF

启动节点

mongos -f /mongodb/38017/conf/mongos.conf

6.4 将sh添加到集群

连接到一个mongos(127.0.0.1:38017),做以下配置
(1)连接到mongos的admin数据库

mongo 127.0.0.1:38017/admin

(2)添加分片

db.runCommand({addshard : "sh1/127.0.0.1:38021,127.0.0.1:38022,127.0.0.1:38023",name:"shard1"})
db.runCommand({addshard : "sh2/127.0.0.1:38024,127.0.0.1:38025,127.0.0.1:38026",name:"shard2"})

(3)列出分片

db.runCommand( { listshards : 1 } )

(4)整体状态查看

sh.status()

7 Shard规则

7.1 Shard功能


chunk:MongoDB存储数据的基本单位是chunk,缺省chunk的大小是64MB,MongoDB会自动拆分&迁移chunk。
chunk拆分:

数据初始会向第1个chunk中存储,当存储量达到64MB时,会分裂为2个32MB的chunk。chunk分裂只在一个shard中进行。
chunk迁移:

Mongos中的balancer进程会自动监控chunk在shard中的分布情况,并进行chunk到其他shard的迁移。
shard key:

collection的分片键,基于一个或多个列(类似一个索引),可以按照分片键进行Range和Hash分片。

  • 分片键不可变
  • 分片键必须有索引
  • 分片键大小限制512bytes
  • 分片键由于路由查询
  • MongoDB不接受已进行collection级分片的collection上插入无分片键的文档(也不支持空值插入)

7.2 使用Shard功能

7.2.1 Range分片配置及测试

7.2.1.1 激活数据库分片功能

登录mongosadmin

mongo --port 38017 admin

开启数据库的分片功能db.runCommand( { enablesharding : "数据库名称" } )

db.runCommand( { enablesharding : "test" } )

7.2.1.2 指定分片键

vast集合创建id键索引

use test
db.vast.ensureIndex( { id : 1 } )

#参数{ id : 1 }表示索引是升序的,如果为{ id : -1 }表示索引是降序的

开启集合的分片功能

use admin
db.runCommand( { shardcollection : "test.vast",key : { id : 1 } } )

7.2.1.3 集合分片验证

vast集合插入数据

use test
for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()})}

查看shard中的计数
shard1

mongo --port 38021 test
db.vast.count()

shard2

mongo --port 38024 test
db.vast.count()

7.2.2 Hash分片配置及测试

7.2.2.1 激活数据库分片功能

登录mongosadmin

mongo --port 38017 admin

开启数据库的分片功能db.runCommand( { enablesharding : "数据库名称" } )

db.runCommand( { enablesharding : "bigsky" } )

7.2.2.2 指定分片键

vast集合创建id键索引

use bigsky
db.vast.ensureIndex( { id : "hashed" } )

开启集合的分片功能

use admin
sh.shardCollection("bigsky.vast",{id:"hashed"})

7.2.2.3 集合分片验证

vast集合插入数据

use bigsky
for(i=1;i<1000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()})}

查看shard中的计数
shard1

mongo --port 38021 bigsky
db.vast.count()

shard2

mongo --port 38024 bigsky
db.vast.count()

7.3 分片集群信息的查询操作

7.3.1 判断是否Shard集群

use admin
db.runCommand({isdbgrid:1})

7.3.2 列出所有分片信息

use admin
db.runCommand({listshards:1})

7.3.3 列出开启分片功能的库

use config
db.databases.find({"partitioned":true})

7.3.4 查看分片的片键

use config
db.collections.find().pretty()

7.3.5 查看分片的详细信息

sh.status()

7.3.6 删除分片节点(谨慎)

(1)确认balancer是否工作

sh.getBalancerState()
true

(2)删除shard2节点
注意:删除操作一定会立即触发balance

db.runCommand( {removeShard: "shard2"} )

8 Balancer操作

mongos的一个重要功能,自动巡查所有shard节点上的chunk情况,自动做chunk迁移

什么时候工作?

  1. 自动运行,会检测系统不繁忙的时候做迁移
  2. 在做节点删除的时候,立即开始迁移工作
  3. balancer只能在预设定的时间窗口内运行

8.1 开启、关闭Balancer

#关闭
sh.stopBalancer()
#开启
sh.startBalancer()

8.2 自定义Balancer开启的时间段

登录mongos

mongo --port 38017 

设置在3:00到5:00开启Balancer

use config
sh.setBalancerState(true)
db.settings.update({_id: "balancer"},{ $set : { activeWindow : {start : "3:00", stop : "5:00"}}},true)

sh.status()查看结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容