部署脚本

#!/bin/bash
#复制集配置
IP='10.0.0.12' #主机ip
NA='rs3' #复制集名称 if [ "$1" = "reset" ]
then
kill -2 `ps -ef|grep -v grep |grep logpath|awk '{print $2}'`
sleep 2
rm -rf /mongodb/m{17,18,19,log}/*
exit
fi if [ "$1" = "install" ]
then
mkdir -p /mongodb/m{17,18,19,log}/
mongod --dbpath /mongodb/m17 --logpath /mongodb/mlog/m17.log --logappend --fork --port 27017 --replSet ${NA} --smallfiles
mongod --dbpath /mongodb/m18 --logpath /mongodb/mlog/m18.log --logappend --fork --port 27018 --replSet ${NA} --smallfiles
mongod --dbpath /mongodb/m19 --logpath /mongodb/mlog/m19.log --logappend --fork --port 27019 --replSet ${NA} --smallfiles
exit
fi if [ "$1" = "repl" ]
then
mongo --port 27017 <<EOF use admin;
var rsconf = {
_id:'${NA}',
members:[
{_id:0,host:'${IP}:27017'},
{_id:1,host:'${IP}:27018'},
{_id:2,host:'${IP}:27019'},
]
};
rs.initiate(rsconf);
<<
EOF
fi

部署情况

提前部署好两个复制集,部署脚本如上
现在部署情况如下
rs3:
10.0.0.12 27017
10.0.0.12 27018
10.0.0.12 27019 rs4:
10.0.0.13 27017
10.0.0.13 27018
10.0.0.13 27019 configsvr :
10.0.0.11 27020 mongos:
10.0.0.11 30000

部署configsvr和mongos

mongod --dbpath /mongodb/m20 --logpath /mongodb/mlog/m20.log --logappend --fork --port 27020 --configsvr
mongos --logpath /mongodb/mlog/m30.log --logappend --fork --port 30000 --configdb 10.0.0.11:27020 [mongod@mcw01 ~]$ mongod --dbpath /mongodb/m20 --logpath /mongodb/mlog/m20.log --logappend --fork --port 27020 --configsvr
about to fork child process, waiting until server is ready for connections.
forked process: 20138
child process started successfully, parent exiting
[mongod@mcw01 ~]$ mongos --logpath /mongodb/mlog/m30.log --logappend --fork --port 30000 --configdb 10.0.0.11:27020
2022-03-05T15:18:39.286+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
about to fork child process, waiting until server is ready for connections.
forked process: 20158
child process started successfully, parent exiting
[mongod@mcw01 ~]$

添加分片

复制集和分片结合的。配置上没太多区别。就是在添加分片的时候,一个加上复制集名称,一个不加。一个复制集就是一个整体,当成分片的一个单元。复制集里的每个副本都是一个备份,其中写入的时候写到主副本就行了吧,复制集会实现其它备副本的复制。复制集中的副本是不是也可以设置在不同的主机上呢,这里设置的是同一台主机上,备份的安全性上考虑,肯定备份不要在同一个主机才安全。
sh.addShard('rs3/10.0.0.12:27017'); 添加分片只需要添加复制集的主17就可以了,然后查看分片,可以看到主副本,以及其它副本的。
[mongod@mcw01 ~]$ mongo 10.0.0.11:30000
MongoDB shell version: 3.2.8
connecting to: 10.0.0.11:30000/test
mongos> sh.addShard('rs3/10.0.0.12:27017');
{ "shardAdded" : "rs3", "ok" : 1 }
mongos> sh.addShard('rs4/10.0.0.13:27017');
{ "shardAdded" : "rs4", "ok" : 1 }
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("62230ecfe5cc911b886d1023")
}
shards: #写数据,分片上的数据是独有的,而同一个副本集不同副本中的数据是相同的,是个复制的数据。当数据分配存储到rs3分片时,18,19两个副本会从17主上复制一份过来作为备份用
{ "_id" : "rs3", "host" : "rs3/10.0.0.12:27017,10.0.0.12:27018,10.0.0.12:27019" }
{ "_id" : "rs4", "host" : "rs4/10.0.0.13:27017,10.0.0.13:27018,10.0.0.13:27019" }
active mongoses:
"3.2.8" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases: mongos>

设置分片库表,分片规则,插入数据,手动预分片

给shop开启分片,给shop下的user分片,根据userid分片。当userid是1000的时候切割一下,2000的时候切割一下......
mongos> show dbs;
config 0.000GB
mongos> sh.enableSharding('shop')
{ "ok" : 1 }
mongos> sh.shardCollection('shop.user',{userid:1})
{ "collectionsharded" : "shop.user", "ok" : 1 }
mongos> sh.splitAt('shop.user',{userid:10000})
{ "ok" : 1 }
mongos> sh.splitAt('shop.user',{userid:1000})
{ "ok" : 1 }
mongos> sh.splitAt('shop.user',{userid:2000})
{ "ok" : 1 }
mongos> sh.splitAt('shop.user',{userid:3000})
{ "ok" : 1 }
mongos> sh.splitAt('shop.user',{userid:4000})
{ "ok" : 1 }
mongos> 查看已经是预分片了,并且res3复制集有,rs4复制集也有分片,各有三个,还是均衡的
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("62230ecfe5cc911b886d1023")
}
shards:
{ "_id" : "rs3", "host" : "rs3/10.0.0.12:27017,10.0.0.12:27018,10.0.0.12:27019" }
{ "_id" : "rs4", "host" : "rs4/10.0.0.13:27017,10.0.0.13:27018,10.0.0.13:27019" }
active mongoses:
"3.2.8" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
3 : Success
databases:
{ "_id" : "shop", "primary" : "rs4", "partitioned" : true }
shop.user
shard key: { "userid" : 1 }
unique: false
balancing: true
chunks:
rs3 3
rs4 3
{ "userid" : { "$minKey" : 1 } } -->> { "userid" : 1000 } on : rs4 Timestamp(3, 0)
{ "userid" : 1000 } -->> { "userid" : 2000 } on : rs4 Timestamp(4, 0)
{ "userid" : 2000 } -->> { "userid" : 3000 } on : rs3 Timestamp(4, 1)
{ "userid" : 3000 } -->> { "userid" : 4000 } on : rs3 Timestamp(3, 4)
{ "userid" : 4000 } -->> { "userid" : 10000 } on : rs3 Timestamp(3, 5)
{ "userid" : 10000 } -->> { "userid" : { "$maxKey" : 1 } } on : rs4 Timestamp(2, 1) mongos> 我们在mongos上进入shop库,插入数据
mongos> use shop
switched to db shop
mongos> for(var i=1;i<=4000;i++){db.user.insert({userid:i,intro:'i am mcw, from china'})}
WriteResult({ "nInserted" : 1 })
mongos>

查看插入数据的效果

首先看下rs3上的主副本:有两千到四千的数据
[mongod@mcw02 ~]$ mongo --port 27017
rs3:PRIMARY> show dbs;
local 0.000GB
shop 0.000GB
rs3:PRIMARY> use shop;
switched to db shop
rs3:PRIMARY> show tables;
user
rs3:PRIMARY> db.user.find().count();
2001
rs3:PRIMARY> db.user.find().skip(1999);
{ "_id" : ObjectId("622314a446d8d9b89fc9e710"), "userid" : 3999, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("622314a446d8d9b89fc9e711"), "userid" : 4000, "intro" : "i am mcw, from china" }
rs3:PRIMARY> db.user.find().limit(3);
{ "_id" : ObjectId("6223149d46d8d9b89fc9df41"), "userid" : 2000, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149d46d8d9b89fc9df42"), "userid" : 2001, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149d46d8d9b89fc9df43"), "userid" : 2002, "intro" : "i am mcw, from china" }
rs3:PRIMARY> 看下rs3上的备副本:数据跟主副本时一致的
[mongod@mcw02 ~]$ mongo --port 27018
rs3:SECONDARY> use shop
switched to db shop
rs3:SECONDARY> db.user.find().count();
2001
rs3:SECONDARY> db.user.find().skip(1999);
{ "_id" : ObjectId("622314a446d8d9b89fc9e710"), "userid" : 3999, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("622314a446d8d9b89fc9e711"), "userid" : 4000, "intro" : "i am mcw, from china" }
rs3:SECONDARY> db.user.find().limit(3);
{ "_id" : ObjectId("6223149d46d8d9b89fc9df41"), "userid" : 2000, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149d46d8d9b89fc9df42"), "userid" : 2001, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149d46d8d9b89fc9df43"), "userid" : 2002, "intro" : "i am mcw, from china" }
rs3:SECONDARY> 查看rs4上主副本:发现数据跟rs.status()是一样的。从1-1999都在rs4副本上
[mongod@mcw03 ~]$ mongo --port 27017
rs4:PRIMARY> use shop
switched to db shop
rs4:PRIMARY> db.user.find().count();
1999
rs4:PRIMARY> db.user.find().skip(1997);
{ "_id" : ObjectId("6223149d46d8d9b89fc9df3f"), "userid" : 1998, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149d46d8d9b89fc9df40"), "userid" : 1999, "intro" : "i am mcw, from china" }
rs4:PRIMARY> db.user.find().limit(3);
{ "_id" : ObjectId("6223149446d8d9b89fc9d772"), "userid" : 1, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149446d8d9b89fc9d773"), "userid" : 2, "intro" : "i am mcw, from china" }
{ "_id" : ObjectId("6223149446d8d9b89fc9d774"), "userid" : 3, "intro" : "i am mcw, from china" }
rs4:PRIMARY>

mongodb的replication与shard分片结合使用详解的更多相关文章

  1. Ubuntu14.04下Mongodb官网卸载部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 前期博客 Ubuntu14.04下Mongodb官网安装部署步骤(图文详解)(博主推荐) https://docs.mongodb.com/manual/tutorial/ins ...

  2. Ubuntu16.04下Mongodb官网卸载部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 前期博客 Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐) https://docs.mongodb.com/manual/tutorial/ins ...

  3. mongodb 学习笔记 09 -- shard分片

    概述 shard 分片 就是 把不同的数据分在不同的server 模型 当中:     用户对mongodb的操作都是向mongs请求的     configsvr 用于保存,某条数据保存在哪个sha ...

  4. Ubuntu14.04下Mongodb官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 在这篇博客里,我采用了非官网的安装步骤,来进行安装.走了弯路,同时,也是不建议.因为在大数据领域和实际生产里,还是要走正规的为好. Ubuntu14.04下Mongodb(离线安 ...

  5. Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 在这篇博客里,我采用了非官网的安装步骤,来进行安装.走了弯路,同时,也是不建议.因为在大数据领域和实际生产里,还是要走正规的为好. Ubuntu16.04下Mongodb(离线安 ...

  6. 云数据库MongoDB版清理oplog日志和compact命令详解

    1.问题描述: 今天看到公司mongodb的oplog有点大,看到云数据库MongoDB版日志清理策略. MongoDB数据库在长期频繁地删除/写入数据或批量删除了大量数据,将产生很多物理空间碎片. ...

  7. MongoDB创建数据库和集合命令db.createCollection详解(转)

    切换/创建数据库 use yourDB;  当创建一个集合(table)的时候会自动创建当前数据库 完整的命令如下:db.createCollection(name, {capped: <Boo ...

  8. redis主从架构,分片集群详解

    写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...

  9. IP分片与重组详解

    大家对IP数据包头,应该不陌生吧 分片便是与图中圈出来的两个地址有关,本文也是将主要围绕他们展开. 那我们先来了解他们的概念. 标志一个三比特字段遵循与用于控制或识别片段.他们是(按顺序,从高分以低位 ...

  10. mongodb对数组中的元素进行查询详解

    原文链接:http://blog.csdn.net/renfufei/article/details/78320176 MongoDB中根据数组子元素进行匹配,有两种方式. 使用 “[数组名].[子元 ...

随机推荐

  1. Matplotlib绘图设置---文字和标签

    文字和文字位置 通过plt.text()或ax.text()命令可在图形上添加文字. Signature: ax.text(x, y, s, fontdict=None, withdash=<d ...

  2. Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一.用git --version命令检查是否已经安装 二.下载git源码并解压 wget https://github.com/git/ ...

  3. C++调用Python-3:调用Python函数,返回字符串

    # mytest.pydef hello1(): print("this is test python print hello world 1") return "456 ...

  4. django admin后台自定义数据保存方式

    故事背景是这样的: 为了方便工作中数据的整理,需要开发一个 管理系统,用于记录一些事情. 该系统不需要精美的前端的页面,只需要使用django的admin后台管理就可以了. 我需要在添加数据的时候,把 ...

  5. OOM异常类型总结

    OOM是什么?英文全称为 OutOfMemoryError(内存溢出错误).当程序发生OOM时,如何去定位导致异常的代码还是挺麻烦的. 要检查OOM发生的原因,首先需要了解各种OOM情况下会报的异常信 ...

  6. 开发案例:使用canvas实现图表系列之折线图

      一.功能结构 实现一个公共组件的时候,首先分析一下大概的实现结构以及开发思路,方便我们少走弯路,也可以使组件更加容易拓展,维护性更强.然后我会把功能逐个拆开来讲,这样大家才能学习到更详细的内容.下 ...

  7. JackSon反序列化通杀

    前言 Springboot一般都会自带JackSon这个依赖包,JackSon跟Fastjson有相同的功效 简单复现 package com.example.jakeson.demo; import ...

  8. CentOS GNOME桌面下安装截图工具gnome-screenshot

    CentOS GNOME桌面下安装截图工具gnome-screenshot 1.光盘安装 (1).把镜像光盘放进电脑 (2).切换到 Packages (3).[root@localhost Pack ...

  9. mysql 必知必会整理—触发器[十五]

    前言 现在很多都是程序用于触发的,而不是触发器了. 正文 需要MySQL 5 对触发器的支持是在MySQL 5中增加的.因此,本章内容适用于MySQL 5或之后的版本. MySQL语句在需要时被执行, ...

  10. keystore 生成密钥

    前言 在安卓中,我们需要生存keystore来处理我们的证书: 我们很幸运在keystore中,在java中的bin下,已经有了keytool工具了,感谢java社区工作者. 正文 在命令窗口中使用k ...