文章标题 原创 翻译 转载 文章内容 # 目标 在3台CentOS 6服务器上部署mongodb分片集群,其中副本集(replica set)部署在不同的服务器上,每个服务器有一个配置(config)副本集,两个分片(sharding)副本集,以及一个mongos服务。所以3台服务器总共需要部署12个服务。3台服务器IP分别是:172.16.66.113,172.16.66.114,172.16.66.115,下面以113,114,115来代表某台服务器。 ![mongodb_server](//images.ningto.com/o_1bssqdbg4a7678ndg5timnmea.png) # 准备工作 首先要保证各个服务器之间是连通的,并且防火墙策略中能访问到下面的端口,简单方式关闭各服务器防火墙,如:service iptables stop 保证下面使用的端口号没有被占用 保证个目录整洁干净,如果有历史数据先清空历史数据,主要是dbs目录 ## 主目录 /usr/local/mongodb ``` mongodb --bin ----mongd ----mongo ----mongos ----... --deploy ----dbs ------config ------shard1 ------shard2 ----etc ------configsvr.conf ------shardsvr1.conf ------shardsvr2.conf ------mongos.conf ----logs ----pids ``` ## bin目录 所有mongodb可执行程序,如:mongod,mongo, mongos... /usr/local/mongodb/bin ## deploy目录 所有部署操作统一在这个目录下进行 /usr/local/mongodb/deploy ## dbs目录 存放所有数据库数据 /usr/local/mongodb/deploy/dbs 包含三个子目录,分别是:配置服务,分片1服务,分片2服务 * /usr/local/mongodb/deploy/dbs/config * /usr/local/mongodb/deploy/dbs/shard1 * /usr/local/mongodb/deploy/dbs/shard2 ## logs目录 存放所有日志 /usr/local/mongodb/deploy/logs ## pids目录 存放各个服务的进程ID /usr/local/mongodb/deploy/pids ## etc目录 存放各个服务启动的配置信息 /usr/local/mongodb/deploy/etc 有三个配置文件,分别是:配置服务,分片1服务,分片2服务,mongos服务的启动配置 * /usr/local/mongodb/deploy/etc/configsvr.conf ``` #bind_ip=127.0.0.1 port=27020 auth=false configsvr=true replSet=cfgset dbpath=/usr/local/mongodb/deploy/dbs/config logpath=/usr/local/mongodb/deploy/logs/config.log pidfilepath=/usr/local/mongodb/deploy/pids/config.pid fork=true ``` * /usr/local/mongodb/deploy/etc/shardsvr1.conf ``` #bind_ip=127.0.0.1 port=27031 auth=false shardsvr=true replSet=shardset1 dbpath=/usr/local/mongodb/deploy/dbs/shard1 logpath=/usr/local/mongodb/deploy/logs/shard1.log pidfilepath=/usr/local/mongodb/deploy/pids/shard1.pid fork=true ``` * /usr/local/mongodb/deploy/etc/shardsvr2.conf ``` #bind_ip=127.0.0.1 port=27032 auth=false shardsvr=true replSet=shardset2 dbpath=/usr/local/mongodb/deploy/dbs/shard2 logpath=/usr/local/mongodb/deploy/logs/shard2.log pidfilepath=/usr/local/mongodb/deploy/pids/shard2.pid fork=true ``` * /usr/local/mongodb/deploy/etc/mongos.conf ``` #bind_ip=127.0.0.1 port=27017 configdb=cfgset/172.16.66.113:27020,172.16.66.114:27020,172.16.66.114:27020 logpath=/usr/local/mongodb/deploy/logs/mongos.log pidfilepath=/usr/local/mongodb/deploy/pids/mongos.pid fork=true ``` > port:服务启动的端口号 auth:需不需要授权 configsvr:配置服务 shardsvr:分片服务 replSet:所属副本集的名字 dbpath:数据存放路径 logpath:日志存放路径 pidfilepath:进程ID存放路径 fork:daemon方式启动 configdb:mongos指定分片集群的配置服务 ## 文件准备 ### 每个服务器都将mongodb安装在/usr/local目录下 下载mongodb版本为:mongodb-linux-x86_64-rhel62-3.4.9.tgz 解压到/usr/local目录下,更名为mongodb,此时它只有一个bin目录 ### 每台服务器上准备deploy目录 [点击下载上面的deploy目录结构](/upload/o_1bs7jftq0bh1ovm1kfj20u1niba.rar)放到mongodb目录下 # 部署分片集群 注意,所有的操作都在deploy目录下进行,按下面的顺序执行。 ## 创建配置服务副本集 每台服务器上启动一个配置服务 * 113机器上执行:../bin/mongod -f etc/configsvr.conf * 114机器上执行:../bin/mongod -f etc/configsvr.conf * 115机器上执行:../bin/mongod -f etc/configsvr.conf ## 初始化配置服务副本集 在113机器上操作,连接到配置服务(其中一个都可以) 每个服务的端口号请看etc目录下面的配置文件 ../bin/mongo --port 27020 初始化配置服务副本集,注意initiate要在primary副本集中操作,某个副本集开始可能不是primary,用rs.status()多查看几次 ``` rs.initiate({_id: "cfgset", configsvr: true, members: [{_id: 0, host: "172.16.66.113:27020"}, {_id: 1, host: "172.16.66.114:27020"}, {_id: 2, host: "172.16.66.115:27020"}]}) ``` ## 创建分片1服务副本集 * 113机器上执行:../bin/mongod -f etc/shardsvr1.conf * 114机器上执行:../bin/mongod -f etc/shardsvr1.conf * 115机器上执行:../bin/mongod -f etc/shardsvr1.conf ## 初始化分片1服务副本集 在113机器上操作,连接到分片1服务(其中一个都可以) ../bin/mongo --port 27031 ``` rs.initiate({_id: "shardset1", members: [{_id: 0, host: "172.16.66.113:27031"}, {_id: 1, host: "172.16.66.114:27031"}, {_id: 2, host: "172.16.66.115:27031"}]}) ``` ## 创建分片2服务副本集 * 113机器上执行:../bin/mongod -f etc/shardsvr2.conf * 114机器上执行:../bin/mongod -f etc/shardsvr2.conf * 115机器上执行:../bin/mongod -f etc/shardsvr2.conf ## 初始化分片2副本集 在113机器上操作,连接到分片2服务(其中一个都可以) ../bin/mongo --port 27032 ``` rs.initiate({_id: "shardset2", members: [{_id: 0, host: "172.16.66.113:27032"}, {_id: 1, host: "172.16.66.114:27032"}, {_id: 2, host: "172.16.66.115:27032"}]}) ``` > 每台服务器上的副本集都是对等的,我们只需要在其中一台服务器上进行初始化就可以了,其他的副本集会将配置信息自动同步过去,所以上面我们只在113机器上进行副本集的初始化。 ## 启动mongos服务 在每台服务器上启动mongos服务 * 113机器上执行:../bin/mongos -f etc/mongos.conf * 114机器上执行:../bin/mongos -f etc/mongos.conf * 115机器上执行:../bin/mongos -f etc/mongos.conf ## 连接到mongos 在113机器上操作 mongos使用的是默认端口27017,所以后面可以不加--port参数 ../bin/mongo * 添加所有分片到集群,目前只有两个分片 ``` sh.addShard("shardset1/172.16.66.113:27031,172.16.66.114:27031,172.16.66.115:27031") sh.addShard("shardset2/172.16.66.113:27032,172.16.66.114:27032,172.16.66.115:27032") ``` * 为数据库启用分片(test数据库) ``` sh.enableSharding("test") ``` * 使用hash分片某个集合(test数据库中的users集合,username是文档中的key) ``` sh.shardCollection("test.users", {username: "hashed"}) ``` > 如果数据库是空的shardCollection会自动创建索引,如果数据库不是空的执行shardCollection之前必须先创建索引 到这里就部署完成了。 # 集群简单验证 ## 连接到其中一个mongos服务 如:我在本机上连接,mongo --host 172.16.66.113 ## 使用test数据库 use test ## 往test数据库的users集合中插入10000条数据 ``` for (var i = 1; i <= 10000; i++) { db.users.insert({username: "name" + i}) } ``` ## 查看users集合状态 db.users.stats() 可以看到sharded:true,count:10000,shardset1中的count为4963,shardset2中的count为5037 文章类别 Python Mobile Android Java Shell Life Database Bug Windows IOS Tools Boost Node.js Mac Product Tips C/C++ Golang Javascript React Qt MQ MongoDB Design Web Linux LLM ChatGPT RAG AI 提交