热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库高可用集群方案设计

环境:CentOS6.0x64md01:10.0.0.11md02:10.0.0.12md03:10.0.0.14md04:10.0.0.15md05:10.0.0.16md06:10.0.0.17设计思路:md01、md02、md03做一组复制集md04、md05、md06做一组复制集再把这两组复制集用分片做成sha

环境:

CentOS 6.0 x64

md01: 10.0.0.11

md02: 10.0.0.12

md03: 10.0.0.14

md04: 10.0.0.15

md05: 10.0.0.16

md06: 10.0.0.17

设计思路:

md01、md02、md03 做一组复制集

md04、md05、md06 做一组复制集

再把这两组复制集用分片做成 shard1、shard2 用LVS 调用

下载安装mongodb

cd /root/tools wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.0.tgz tar zxvf mongodb-linux-x86_64-2.0.0.tgz mv mongodb-linux-x86_64-2.0.0 /elain/apps/mongodb-linux-x86_64-2.0.0 ln -s /elain/apps/mongodb-linux-x86_64-2.0.0 /elain/apps/mongodb ln -s /elain/apps/mongodb/bin/* /bin/

#添加用户组

/usr/sbin/groupadd -g 690 mongodb /usr/sbin/useradd -g mongodb mongodb -u 690 -s /sbin/nologin

各节点hosts文件 添加:

true > /etc/hosts echo -ne " 10.0.0.11 md01 10.0.0.12 md02 10.0.0.14 md03 10.0.0.15 md04 10.0.0.16 md05 10.0.0.17 md06 " >>/etc/hosts

副本集配置:

启动各节点:

md01

mkdir -p /elain/logs/mongodb/ mkdir -p /elain/data/mongodb/db /elain/apps/mongodb/bin/mongod --rest --replSet elain/md01:27017 --fork --port 27017 --dbpath /elain/data/mongodb/db/ --logpath /elain/logs/mongodb/mongodb.log

md02

mkdir -p /elain/logs/mongodb/ mkdir -p /elain/data/mongodb/db /elain/apps/mongodb/bin/mongod --rest --replSet elain/md02:27017 --fork --port 27017 --dbpath /elain/data/mongodb/db/ --logpath /elain/logs/mongodb/mongodb.log

md03

mkdir -p /elain/logs/mongodb/ mkdir -p /elain/data/mongodb/db /elain/apps/mongodb/bin/mongod --rest --replSet elain/md03:27017 --fork --port 27017 --dbpath /elain/data/mongodb/db/ --logpath /elain/logs/mongodb/mongodb.log

#启动仲裁节点

在md02上

mkdir /elain/data/mongodb/arb /elain/apps/mongodb/bin/mongod --fork --rest --replSet elain --dbpath /elain/data/mongodb/arb --port 27015 --logpath /elain/logs/mongodb/mongodb.log

初始化节点:

md01:(登录其中任何一个节点操作皆可)

> rs.initiate({ _id : "elain", members : [ {_id : 1, host : "md01:27017"}, {_id : 2, host : "md02:27017"}, {_id : 3, host : "md03:27017"}, {_id : 4, host : "md02:27015", "arbiterOnly": true}, ] });

#验证

PRIMARY> rs.status()

也可浏览:http://10.0.0.11:28017/_replSet 查看状态

查看副本集状态

>rs.status() >user local; >rs.isMaster() >db.system.replset.find()

查看当前主库:

>db.$cmd.findOne({ismaster:1});

另一组副本集同理操作即可;这里为省篇幅就不再写出,但切记两复制集名称不可以重复

启动并配置三台Config Server

#md01,03,05上执行

mkdir -p /elain/data/mongodb/config/ /elain/apps/mongodb/bin/mongod --configsvr --dbpath /elain/data/mongodb/config/ --port 20000 --logpath /elain/logs/mongodb/config.log --logappend --fork

5、部署并配置三台Routing Server

指定所有的config sever地址参数,chunkSize是分割数据时每块(Chunk)的单位大小

#md02,md04,md06

/elain/apps/mongodb/bin/mongos --configdb md01:20000,md03:20000,md05:20000 --port 30000 --chunkSize 100 --logpath /elain/logs/mongodb/mongos.log --logappend --fork

6、命令行添加分片

连接到mongs服务器,并切换到admin

/elain/apps/mongodb/bin/mongo 10.0.0.11:30000/admin

db.runCommand( { addshard : "elain/md01:27017", name:"shard1", maxsize:2048, allowLocal:true } ); db.runCommand( { addshard : "chujq/md04:27017", name:"shard2", maxsize:2048, allowLocal:true } );

注:添加复制集elain,其中包含一个服务器md01:27017(还饿别的服务器,如md02、md03),如果md01挂了,mongos会知道它所连接的是一个复制集,并会使用新的主节点(md02或md03)

db.runCommand( { listshards : 1 } );

如果列出(sharding)了以上二个你加的shards,表示shards已经配置成功

导入数据:

mongoimport -d elain -c elain --type csv --headerline --file /root/bak/test.csv --host md02:30000

注:数据自备,我这里是从生产环境下MYSQL里导出的一些真实数据来做测试

#激活数据库分片

db.runCommand( { enablesharding : "elain" } ); mongos> db.runCommand( { enablesharding : "elain" } ); { "ok" : 1 } mongos> show dbs config 0.1875GB elain 0.453125GB test (empty)

#进入数据库,建立索引,为分片做准备

/elain/apps/mongodb/bin/mongo 10.0.0.12:30000/admin use elain; db.elain.ensureIndex({"client_userid":1});

查看索引:

mongos> db.elain.find({"client_userid" : 151512}).explain(); { "cursor" : "BtreeCursor client_userid_1", "nscanned" : 3, "nscannedObjects" : 3, "n" : 3, "millis" : 0, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : false, "indexOnly" : false, "indexBounds" : { "client_userid" : [ [ 151512, 151512 ] ] } }

#添加分片:

use admin; db.runCommand( { shardcollection : "elain.elain",key : {client_userid: 1} } ) mongos> db.runCommand( { shardcollection : "elain.elain",key : {client_userid: 1} } ) { "collectionsharded" : "elain.elain", "ok" : 1 }

#查看分片状态

use elain; db.elain.stats(); mongos> db.elain.stats(); { "sharded" : true, "flags" : 1, "ns" : "elain.elain", "count" : 507372, "numExtents" : 10, "size" : 84375328, "storageSize" : 97849344, "totalIndexSize" : 29253728, "indexSizes" : { "_id_" : 16474640, "client_userid_1" : 12779088 }, "avgObjSize" : 166.29874727024747, "nindexes" : 2, "nchunks" : 1, "shards" : { "shard2" : { "ns" : "elain.elain", "count" : 507372, "size" : 84375328, "avgObjSize" : 166.29874727024747, "storageSize" : 97849344, "numExtents" : 10, "nindexes" : 2, "lastExtentSize" : 26099712, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 29253728, "indexSizes" : { "_id_" : 16474640, "client_userid_1" : 12779088 }, "ok" : 1 } }, "ok" : 1 }

在分片后新写数据第一次:

mongos> db.elain.stats(); { "sharded" : true, "flags" : 1, "ns" : "elain.elain", "count" : 676496, "numExtents" : 12, "size" : 112500436, "storageSize" : 129179648, "totalIndexSize" : 47551616, "indexSizes" : { "_id_" : 21968912, "client_userid_1" : 25582704 }, "avgObjSize" : 166.29874529930703, "nindexes" : 2, "nchunks" : 8, "shards" : { "shard1" : { "ns" : "elain.elain", "count" : 0, "size" : 0, "storageSize" : 8192, "numExtents" : 1, "nindexes" : 2, "lastExtentSize" : 8192, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 16352, "indexSizes" : { "_id_" : 8176, "client_userid_1" : 8176 }, "ok" : 1 }, "shard2" : { "ns" : "elain.elain", "count" : 676496, "size" : 112500436, "avgObjSize" : 166.29874529930703, "storageSize" : 129171456, "numExtents" : 11, "nindexes" : 2, "lastExtentSize" : 31322112, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 47535264, "indexSizes" : { "_id_" : 21960736, "client_userid_1" : 25574528 }, "ok" : 1 } }, "ok" : 1 }

分片后新写数据第二次:

mongos> db.elain.stats(); { "sharded" : true, "flags" : 1, "ns" : "elain.elain", "count" : 1189194, "numExtents" : 23, "size" : 194533928, "storageSize" : 252874752, "totalIndexSize" : 87262448, "indexSizes" : { "_id_" : 43692544, "client_userid_1" : 43569904 }, "avgObjSize" : 163.58468677103988, "nindexes" : 2, "nchunks" : 8, "shards" : { "shard1" : { "ns" : "elain.elain", "count" : 396370, "size" : 62195348, "avgObjSize" : 156.91234957236924, "storageSize" : 86114304, "numExtents" : 11, "nindexes" : 2, "lastExtentSize" : 20881408, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 35949872, "indexSizes" : { "_id_" : 17954496, "client_userid_1" : 17995376 }, "ok" : 1 }, "shard2" : { "ns" : "elain.elain", "count" : 792824, "size" : 132338580, "avgObjSize" : 166.9205019020615, "storageSize" : 166760448, "numExtents" : 12, "nindexes" : 2, "lastExtentSize" : 37588992, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 51312576, "indexSizes" : { "_id_" : 25738048, "client_userid_1" : 25574528 }, "ok" : 1 } }, "ok" : 1 }

分片后新写数据第三次:

mongos> db.elain.stats(); { "sharded" : true, "flags" : 1, "ns" : "elain.elain", "count" : 1376876, "numExtents" : 23, "size" : 225576604, "storageSize" : 252874752, "totalIndexSize" : 100826432, "indexSizes" : { "_id_" : 50249696, "client_userid_1" : 50576736 }, "avgObjSize" : 163.83218532387812, "nindexes" : 2, "nchunks" : 10, "shards" : { "shard1" : { "ns" : "elain.elain", "count" : 494202, "size" : 77551984, "avgObjSize" : 156.92365469990003, "storageSize" : 86114304, "numExtents" : 11, "nindexes" : 2, "lastExtentSize" : 20881408, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 42057344, "indexSizes" : { "_id_" : 21600992, "client_userid_1" : 20456352 }, "ok" : 1 }, "shard2" : { "ns" : "elain.elain", "count" : 882674, "size" : 148024620, "avgObjSize" : 167.70021548159343, "storageSize" : 166760448, "numExtents" : 12, "nindexes" : 2, "lastExtentSize" : 37588992, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 58769088, "indexSizes" : { "_id_" : 28648704, "client_userid_1" : 30120384 }, "ok" : 1 } }, "ok" : 1 }

分片后新写数据第四次(DOWN 掉md04的mongo服务)

mongos> db.elain.stats(); { "sharded" : true, "flags" : 1, "ns" : "elain.elain", "count" : 1686310, "numExtents" : 26, "size" : 275761376, "storageSize" : 353116160, "totalIndexSize" : 129033632, "indexSizes" : { "_id_" : 63265888, "client_userid_1" : 65767744 }, "avgObjSize" : 163.52946729842083, "nindexes" : 2, "nchunks" : 10, "shards" : { "shard1" : { "ns" : "elain.elain", "count" : 740264, "size" : 116213588, "avgObjSize" : 156.98938216636228, "storageSize" : 141246464, "numExtents" : 13, "nindexes" : 2, "lastExtentSize" : 30072832, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 61810560, "indexSizes" : { "_id_" : 32556832, "client_userid_1" : 29253728 }, "ok" : 1 }, "shard2" : { "ns" : "elain.elain", "count" : 946046, "size" : 159547788, "avgObjSize" : 168.64696642657967, "storageSize" : 211869696, "numExtents" : 13, "nindexes" : 2, "lastExtentSize" : 45109248, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 67223072, "indexSizes" : { "_id_" : 30709056, "client_userid_1" : 36514016 }, "ok" : 1 } }, "ok" : 1 }

总结:通过以上四次的写数据测试,我们可以看到分片是成功的,每次写数据,shard1、shard2都有数据写入,且,在下面的复制集中DOWN 掉任意一台,不影响整个架构的正常服务。

删除片操作

mongos> db.runCommand({"removeshard" : "10.0.0.11:27011"}); { "msg" : "draining started successfully", "state" : "started", "shard" : "shard2", "ok" : 1 }

再执行,可看到removeshard的挪动进度

mongos> db.runCommand({"removeshard" : "10.0.0.11:27011"}); { "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : NumberLong(3), "dbs" : NumberLong(0) }, "ok" : 1 }


推荐阅读
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • 本文详细介绍了如何在 CentOS 7 及其衍生发行版(如 Red Hat, Oracle, Scientific Linux 7)上安装和完全卸载 GitLab。包括安装必要的依赖关系、配置防火墙、安装 GitLab 软件包以及常见问题的解决方法。 ... [详细]
  • CentOS 7 默认安装了 MariaDB,作为 MySQL 的一个分支。然而,出于特定需求,我们可能仍需在系统中安装 MySQL。本文将详细介绍如何通过 Yum 包管理器在 CentOS 7 上安装 MySQL,并提供一些常用的 MySQL 命令。 ... [详细]
  • Linux 防火墙与端口管理必备命令
    在使用 Linux 系统进行服务部署和问题排查时,防火墙和端口管理是不可或缺的操作。本文将详细介绍如何查看防火墙状态、端口占用情况,以及如何开放和关闭端口,帮助初学者更好地掌握这些技能。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
author-avatar
涅槃重生武哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有