MongoDB分片集群搭建

MongoDB分片集群搭建

如果不清楚什么是分片集群,可以看我上一篇发布的文章MongoDB分片集群详解

环境信息

以下是我在测试环境中虚拟机的配置,如果你的虚拟机ip不同可以对应的更改,但是要确保这三台虚拟机之间可以ping通

shell 复制代码
#操作系统:centos6.8
mongodb版本:mongodb-linux-x86_64-rhe162-4.0.6.tgz
#3台虚拟机
192.168.57.201、192.168.57.202、192.168.57.203
#2个分片复制集
分片集群1:(192.168.57.201:27017、192.168.57.202:27017、192.168.57.203:27017)
分片集群2:(192.168.57.201:27018、192.168.57.202:27018、192.168.57.203:27018)
#1个config复制集
config复制集:(192.168.57.201:28018、192.168.57.202:28018、192.168.57.203:28018)
1个mongos节点

config搭建复制集是为了保证config节点的高可用性,避免config挂了,mongos找不到数据存储的地方

搭建mongodb分片复制集

⚠️:如果配置中没有的的文件夹,需要手动创建,例如下面的/opt/mongo/data/db文件夹

  • shard1集群步骤

    • 添加复制集配置文件:mongo.conf,三台虚拟机都要加

      shell 复制代码
      # 添加复制集配置文件
      fork=true
      dbpath=/opt/mongo/data/db
      port=27017
      bind_ip=0.0.0.0
      logpath=/opt/mongo/logs/mongodb.log
      logappend=true
      # 副本集名称
      replSet=goat_repl
      smallfiles=true
      # 分片集群必须要有的属性
      shardsvr=true
    • 添加复制集配置文件: mongo2.conf,同样三台虚拟机都要加

      shell 复制代码
      # 添加复制集配置文件
      fork=true
      dbpath=/opt/mongo/data/db
      # 注意这里的port要改为27018
      port=27018
      bind_ip=0.0.0.0
      logpath=/opt/mongo/logs/mongodb.log
      logappend=true
      # 副本集2的名称要与副本集1名称不同
      replSet=goat_repl2
      smallfiles=true
      # 分片集群必须要有的属性
      shardsvr=true
    • 去到mongod所在目录下,启动两个副本集

      shell 复制代码
      # mongo.conf替换为自己的配置文件路径
      ./mongod -f mongo.conf
      ./mongod -f mongo2.conf
    • 登陆副本集,添加初始化配置

      shell 复制代码
      # 进入mongo客户端
      # 配置goat_repl副本集
      ./mongo -port 27017
      
      
      # 配置goat_repl2副本集
      ./mongo -port 27018
    • 进入shell后,执行初始化命令

      27017配置

      shell 复制代码
      var rsconf = {
      	_id:'goat_repl', // 这里的id要与配置文件中指定的服务所属复制集相同
      	members: // 复制集成员
      	[
      		{
      			_id:1, // 成员id
      			host: '192.168.57.201:27017'
      		},
      		{
      			_id:2, // 成员id
      			host: '192.168.57.202:27017'
      		},
      		{
      			_id:3, // 成员id
      			host: '192.168.57.203:27017'
      		}
      	]
      }
      # 初始化配置
      rs.initiate(rsconf)

      27018配置

      shell 复制代码
      var rsconf = {
      	_id:'goat_repl2', // 这里的id要与配置文件中指定的服务所属复制集相同
      	members: // 复制集成员
      	[
      		{
      			_id:1, // 成员id
      			host: '192.168.57.201:27018'
      		},
      		{
      			_id:2, // 成员id
      			host: '192.168.57.202:27018'
      		},
      		{
      			_id:3, // 成员id
      			host: '192.168.57.203:27018'
      		}
      	]
      }
      # 初始化配置
      rs.initiate(rsconf)
      # 状态查看
      rs.status()
配置mongodb分片配置集
  • 搭建config节点复制集

    • 创建config节点配置文件:mongo-cfg.conf(同样3台虚拟机都要配置)

      yaml 复制代码
      systemLog:
      	destination: file
      	path: /opt/mongo/mongo-cfg/logs/mongodb.log
      	logAppend: true
      storage:
      	joural:
      		enable: true
      	# 数据存储位置
      	dbPath: /opt/mongo/mongo-cfg/data
      	# 是否一个库一个文件夹
      	directoryPerDB: true
      	wiredTiger:
      		engineConfig:
      			#最大使用的cache,根据需求调节
      			cacheSizeGB: 1
      			#是否将索引也按照数据库名,单独存储
      			directoryForIndexes: true
      		collectionConfig:
      			#表压缩配置
      			blockCompressor: zlib
      		indexConfig:
      			prefixCompression: true
      net:
      	# ip地址
      	bindIp: 192.168.57.201
      	# 端口
      	port: 28018
      replication:
      	oplogSizeMB: 2048
      	# 配置节点的复制集名称
      	replSetName: configReplSet
      sharding:
      	clusterRole: configsvr
      processManageMent:
      	fork: true
      yaml 复制代码
      systemLog:
      	destination: file
      	path: /opt/mongo/mongo-cfg/logs/mongodb.log
      	logAppend: true
      storage:
      	joural:
      		enable: true
      	# 数据存储位置
      	dbPath: /opt/mongo/mongo-cfg/data
      	# 是否一个库一个文件夹
      	directoryPerDB: true
      	wiredTiger:
      		engineConfig:
      			#最大使用的cache,根据需求调节
      			cacheSizeGB: 1
      			#是否将索引也按照数据库名,单独存储
      			directoryForIndexes: true
      		collectionConfig:
      			#表压缩配置
      			blockCompressor: zlib
      		indexConfig:
      			prefixCompression: true
      net:
      	# ip地址
      	bindIp: 192.168.57.202
      	# 端口
      	port: 28018
      replication:
      	oplogSizeMB: 2048
      	# 配置节点的复制集名称
      	replSetName: configReplSet
      sharding:
      	clusterRole: configsvr
      processManageMent:
      	fork: true
      shell 复制代码
      systemLog:
      	destination: file
      	path: /opt/mongo/mongo-cfg/logs/mongodb.log
      	logAppend: true
      storage:
      	joural:
      		enable: true
      	# 数据存储位置
      	dbPath: /opt/mongo/mongo-cfg/data
      	# 是否一个库一个文件夹
      	directoryPerDB: true
      	wiredTiger:
      		engineConfig:
      			#最大使用的cache,根据需求调节
      			cacheSizeGB: 1
      			#是否将索引也按照数据库名,单独存储
      			directoryForIndexes: true
      		collectionConfig:
      			#表压缩配置
      			blockCompressor: zlib
      		indexConfig:
      			prefixCompression: true
      net:
      	# ip地址
      	bindIp: 192.168.57.203
      	# 端口
      	port: 28018
      replication:
      	oplogSizeMB: 2048
      	# 配置节点的复制集名称
      	replSetName: configReplSet
      sharding:
      	clusterRole: configsvr
      processManageMent:
      	fork: true
    • 启动配置复制集(三台)

      shell 复制代码
      ./mongod -f /opt/mongo/mongo-cfg.conf
    • 初始化配置节点(三台)

      shell 复制代码
      # 登陆
      ./mongo -host 192.168.57.201 -port 28018
    • 初始化命令

      shell 复制代码
      var rsconf = {
      	_id:'configReplSet', // 这里的id要与配置文件中指定的服务所属复制集相同
      	members: // 复制集成员
      	[
      		{
      			_id:1, // 成员id
      			host: '192.168.57.201:28018'
      		},
      		{
      			_id:2, // 成员id
      			host: '192.168.57.202:28018'
      		},
      		{
      			_id:3, // 成员id
      			host: '192.168.57.203:28018'
      		}
      	]
      }
      # 初始化配置
      rs.initiate(rsconf)
配置mongos节点
  • mongos配置文件

    yaml 复制代码
    systemLog:
    	destination: file
    	path: /opt/mongo/mongos/log/mongos.log
    	logAppend: true
    net:
    	bindIp: 192.168.57.201
    	port: 28017
    sharding:
    	configDB: configReplSet/192.168.57.201:28018,192.168.57.202:28018,192.168.57.201:28018
    processManagement:
    	fork: true
  • 启动mongos

    shell 复制代码
    ./mongos -confjg /opt/mongo/mongos/mongos.conf
添加集群中的分片节点
  • 切换到admin数据库

    shell 复制代码
    use admin
  • 添加shard1复制集

    shell 复制代码
    db.runCommand({
    	addshard: "goat_repl/192.168.57.201:27017,192.168.57.202:27017,192.168.57.203:27017",
    	name: "shard1"
    })
  • 添加shard2复制集

    shell 复制代码
    db.runCommand({
    	addshard: "goat_repl2/192.168.57.201:27018,192.168.57.202:27018,192.168.57.203:27018",
    	name: "shard1"
    })
  • 查看分片

    shell 复制代码
    # 列出分片
    db.runCommand({listshards: 1})
    # 查看分片集群的状态
    sh.status()
测试分片集群
  • 先创建一个数据库,开启分片
shell 复制代码
db.runCommand({ enablesharding: "testdb" })
  • 创建分片的键
shell 复制代码
db.runCommand({ shardcollection: "testdb.users", key: {id: 1}})
  • 创建索引(如果不是空集合,不是第一次操作)
shell 复制代码
use testdb
db.users.ensureIndex({id: 1})
  • 添加测试数据
shell 复制代码
var arr=[];
for(var i = 0; i < 1500000;i++) {
	var uid = i;
	var name = "name" + i;
	arr.push({"id":uid, "name":name});
}
db.users.insertMany(arr);

其他分片集群的命令

shell 复制代码
# 删除分片
db.runCommand({removeShard: "shard2"})

分片集群部署的常见错误

  • 分片不会默认生成,需要先在数据库中启动分片(sh.enableSharding("DBName")),然后再设置集合分片(sh.shardCollection("Collection"{片键}))
相关推荐
码上一元2 分钟前
掌握 Spring 事务管理:深入理解 @Transactional 注解
数据库·spring
程序猿毕设源码分享网5 分钟前
基于springboot停车场管理系统源码和论文
数据库·spring boot·后端
YiSLWLL11 分钟前
Django+Nginx+uwsgi网站使用Channels+redis+daphne实现简单的多人在线聊天及消息存储功能
服务器·数据库·redis·python·nginx·django
.生产的驴22 分钟前
Docker Seata分布式事务保护搭建 DB数据源版搭建 结合Nacos服务注册
数据库·分布式·后端·spring cloud·docker·容器·负载均衡
盖盖衍上22 分钟前
4.4 MySQL 触发器(Trigger)
数据库·mysql
清心歌25 分钟前
Redis入门(九)
数据库·redis
superman超哥28 分钟前
Oralce数据库巡检SQL脚本
数据库·oracle·性能优化·dba·rdbms·巡检
墨城烟柳ベ旧人殇29 分钟前
MySQL数据库6——SQL优化
数据库·sql·mysql
standxy29 分钟前
集成金蝶云星空数据至MySQL的完整案例解析
android·数据库·mysql
漫天转悠1 小时前
MySQL 数据库命名及SQL语句书写规范详解
数据库·mysql