MongoDB 分片集群组件
一个 MongoDB 分片集群由以下三个组件构成:
- shard:每个分片是整体数据的一部分子集,每个分片都可以部署为副本集。
-
mongos:充当查询路由器,提供客户端应用程序和分片集群之间的接口。应用程序直接连接 mongos 即可,可以部署一个或多个。
-
config servers:配置服务器存储集群的元数据和配置(包括权限认证相关),必须将配置服务器部署为副本集(CSRS,全称是 Config Servers Replica Set)。
MongoDB 官网文档中有一张经典的图片为我们展示了分片集群的架构图:
因为MongoDB分片集群对副本集的依赖比较大,所以先介绍一下如何搭建MongoDB副本集。
MongoDB副本集搭建
本文演示环境:
系统 | 节点IP | 节点类型 |
---|---|---|
centos7.5 | 192.168.3.31 | primary |
centos7.5 | 192.168.3.32 | secondary |
centos7.5 | 192.168.3.33 | secondary |
mongodb 使用官网 mongodb-linux-x86_64-3.6.17 二进制包。
在三台机器上分别搭建实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# 禁用 THP(数据库应用对内存的访问一般都是稀疏访问模式而很少是连续访问模式,如果启用大页面会导致更多的磁盘 IO) $ echo never > /sys/kernel/mm/transparent_hugepage/enabled $ echo never > /sys/kernel/mm/transparent_hugepage/defrag # 下载二进制包 $ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.17.tgz && tar xvf mongodb-linux-x86_64-3.6.17.tgz -C /usr/local/ && cd /usr/local/ && mv mongodb-linux-x86_64-3.6.17 mongodb # 创建配置文件 $ cd /usr/local/mongodb && mkdir config && cd config $ vim mongodb-27017.conf # 添加以下内容 bind_ip = 0.0.0.0 #bind_ip_all = true # add in 3.6 和 bind_ip 互斥 port = 27017 dbpath = /var/lib/mongodb/27017 # 数据目录,根据实际情况配置 logpath = /var/log/mongodb_27017.log # 日志目录,根据实际情况配置 logappend = true fork = true auth = false #keyFile = # 副本集启用认证的配置 directoryperdb = true storageEngine = wiredTiger #wiredTigerCacheSizeGB = 1 #profile = 2 #slowms = 1000 #oplogSize = 100 #replSet = test # 副本集名称 # 如果数据目录或者日志目录不存在则需要创建 $ mkdir -p /var/lib/mongodb/27017 # 启动mongodb,如果启动失败,可以通过日志文件查看原因 $ cd /usr/local/mongodb $ ./bin/mongod -f config/mongodb-27017.conf # 登录mongodb $ ./bin/mongo --port 27017 |
确保三台机器都按以上步骤安装了MongoDB实例,然后就可以开始配置副本集
副本集配置比较简单,主要关注两个参数 replSet (每个节点必须配置一致)和 keyFile (认证相关)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# 首先配置keyfile,在任意一台机器上生成 keyfile 文件 $ cd /usr/local/mongodb/config $ openssl rand -base64 741 > mongodb-keyfile # 注意修改权限,否则会报错 $ chmod 600 mongodb-keyfile # 将keyfile同步到另外两台机器 $ scp mongodb-keyfile username@ip:/usr/local/mongodb/config/ # 修改每台机器上mongodb的配置文件 $ vim /usr/local/mongodb/config/mongodb-27017.conf # 添加以下内容 replSet = myReplSet #副本集名称,根据情况自定义 keyFile = /usr/local/mongodb/config/mongodb-keyfile # 三台机器重启mongodb # 登录primary,初始化副本集 # priority: 优先级,默认为 1,优先级 0 为被动节点,不能成为活跃节点。优先级不为 0 则按照由大到小选出活跃节点。 # arbiterOnly: 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。如果节点变为主库,则 mongo shell 会变成 myReplSet:PRIMARY>。 > config = {_id: "myReplSet", members: []} # _id 为副本集的名称 > config.members.push({_id: 0, host: "192.168.3.31:27017", "priority": 1}) > config.members.push({_id: 1, host: "192.168.3.32:27017", "priority": 1}) > config.members.push({_id: 2, host: "192.168.3.33:27017", "arbiterOnly": true}) > rs.initiate(config) # 创建root用户(后续的命令都需要鉴权) $ use admin $ db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]}); # 登录 $ db.auth('root','root') # 查看副本集状态,关键members中要和之前配置的节点一致 $ rs.status() |
一个3节点的MongoDB副本集到此已经搭建完毕
分片集群环境搭建
前面介绍了,一个分片集群由shard、mongos和config组成,本文演示搭建3个shard(3 节点副本集),1 个 config server(3 节点副本集)加 2 个 mongos 的分片集群。
三台机器,每台机器上部署3个shard(副本集),每台机器部署1 个 config server(副本集),在primary和其中一个secondary上部署一个mongos。
副本集的搭建上面已经介绍过了,部署shard的副本集就是增加配置文件(端口使用 27017、27018、27019)
1 2 3 4 5 6 7 8 |
$ cd /usr/local/mongodb/config # 在每台机器上创建三个配置文件,添加的内容和上面内容一样,只是需要将相应的端口修改正确,还有就是三台机器上端口相同的replSet为一组,这里分别为myReplSet1、myReplSet2、myReplSet3 $ vim mongodb-27017.conf $ vim mongodb-27018.conf $ vim mongodb-27018.conf # 还需要在每个配置文件中加以下内容 shardsvr = true |
config的副本集的搭建过程也是一样,只是配置有一点区别
1 2 3 4 5 6 |
$ cd /usr/local/mongodb/config # 在每台机器上创建config的配置文件,端口使用20000(可自定义) $ vim mongodb-20000.conf # 还需要在每个配置文件中加以下内容,其他配置项和副本集搭建的配置一样 configsvr = true |
mongos路由的配置就比较简单了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ cd /usr/local/mongodb/config # 在每台要开路由机器上创建配置文件,端口使用27000(可自定义) $ vim mongodb-27000.conf # 配置加以下内容 bind_ip = 0.0.0.0 port = 27010 logpath = /var/log/mongodb_27010.log # 日志目录 logappend = true fork = true keyFile = /usr/local/mongodb/config/mongodb-keyfile configdb = myReplSetConfig/192.168.3.31:20000,192.168.3.32:20000,192.168.3.33:20000 # 启动mongos路由 $ ./bin/mongos -f config/mongodb-27000.conf # 登录 $ ./bin/mongo --port 27000 mongos> use admin mongos> db.auth('root', 'root') # 添加分片集群 mongos> sh.addShard("myReplSet1/192.168.3.31:27017,192.168.3.32:27017,192.168.3.33:27017") mongos> sh.addShard("myReplSet2/192.168.3.31:27018,192.168.3.32:27018,192.168.3.33:27018") mongos> sh.addShard("myReplSet3/192.168.3.31:27019,192.168.3.32:27019,192.168.3.33:27019") # 验证分片集群是否搭建成功,shards和我们配置的一样就说明成功了 mongos> sh.status() |
至此,一个 3 shard(副本集)、1 config server(副本集),2 mongos路由的MongoDB的分片集群就搭建成功了。