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"{片键}))
相关推荐
bug菌¹28 分钟前
滚雪球学Oracle[6.2讲]:Data Guard与灾难恢复
数据库·oracle·data·灾难恢复·guard
一般路过糸.31 分钟前
MySQL数据库——索引
数据库·mysql
Cengineering1 小时前
sqlalchemy 加速数据库操作
数据库
Cikiss1 小时前
微服务实战——平台属性
java·数据库·后端·微服务
小小不董2 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba
无敌少年小旋风2 小时前
MySQL 内部优化特性:索引下推
数据库·mysql
柒小毓2 小时前
将excel导入SQL数据库
数据库
bug菌¹2 小时前
滚雪球学Oracle[2.5讲]:数据库初始化配置
数据库·oracle·数据库初始化·初始化配置
一休哥助手2 小时前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
翔云1234562 小时前
MVCC(多版本并发控制)
数据库·mysql