分片集群实验(1)--雷哥

MongoDB除了副本集以外,还支持分片集群。分片可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

1.1 概念

分片(有时候也叫分区)是一种跨多台机器分布数据的方法,是指将数据拆分,将其分散到不同的机器上,处理更多的负载

分片有两种解决方案:垂直扩展和水平扩展。

垂直扩展:增加更多的CPU和存储资源来扩展容量。

水平扩展:将数据集分布在多个服务器上。水平扩展就是分片


为什么使用分片

  • 复制所有的写入操作到主节点
  • 延迟的敏感数据会在主节点查询
  • 单个副本集限制在12个节点
  • 当请求量巨大时会出现内存不足。
  • 本地磁盘不足
  • 垂直扩展需要更多的钞能力

1.2 分片包含的组件

image-20200808213911186

上图中主要有如下所述三个主要组件:

  • Shard:

    分片,用于存储实际的数据块,实际生产环境中一个分片可以由多个副本集承担,防止主机单点故障

  • Config Server:

    配置服务器。存储几群的元数据和配置。从MongoDB3.4开始,配置服务器必须是副本集

  • Query Routers:

    路由,mongos充当查询路由器,在客户端和分片集群之间提供接口

本次课程的目标是搭建一个由两个个分片节点副本集+一个配置节点副本集+两个路由节点的集群,总共11个服务节点

image-20200808220153211

1.3 搭建分片节点副本集

Linux系统安装Mongodb

Linux部署MongoDB操作和Windows差不多

官网下载Linux版的tgz包,上传到Linux目录中,解压到当前目录

tar -xvf mongodb-linux-x86_64-4.0.19.tgz

移动解压后的文件夹到指定目录

mv mongodb-linux-x86_64-4.0.19 /usr/local/mongodb

新建数据目录和日志目录

# 数据存储目录
mkdir -p /mongodb/data/db
# 日志存储目录
mkdir -p /mongodb/log

新建配置文件,并修改内容

vi /mongodb/mongod.conf

配置文件内容

systemLog:
  # MongoDB日志输出到文件
  destination: file
  # 日志文件路径
  path: "/mongodb/log/mongod.log"
  # 当mongod实例重新启动时,将新条目附加到现有日志文件的末尾
  logAppend: true
storage:
  # mongod实例存储数据的目录
  dbPath: "/mongodb/data/db"
  journal:
    # 启用或禁用持久性日志
    enabled: true
processManagement:
  # 启用在后台运行
  fork: true
net:
  # 这里是个坑,只能配置0.0.0.0或者本机ip。网上很多教程都是复制粘贴,很不负责任。如果需要限制ip访问,请使用云服务器的安全组
  bindIp: 0.0.0.0
  # 绑定的端口,默认是27017
  port: 27017

启动服务

/usr/local/mongodb/bin/mongod -f /mongodb/mongod.conf

启动后显示successfully,如果没有就说明配置文件有问题,启动失败了。

[root@iZ2zebq96d1zohii1vadzqZ mongodb]# /usr/local/mongodb/bin/mongod -f /mongodb/mongod.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1526
child process started successfully, parent exiting

查看服务是否启动成功

ps -aux|grep mongod

Linux下关闭MongoDB步骤(极不建议使用kill强制杀死进程,这样数据会存在损坏)

# 客户端登录服务
mongo --port 27017
# 切换到admin库
use admin
# 关闭服务
db.shutdownServer()

1.3.1 第一套shard副本集

使用 172.18.87.20 服务器,启动3个MongoDB服务

准备存放数据和日志的目录

mkdir -p /mongodb/sharded_cluster/myshardrs01_27017/log
mkdir -p /mongodb/sharded_cluster/myshardrs01_27017/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs01_27117/log
mkdir -p /mongodb/sharded_cluster/myshardrs01_27117/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs01_27217/log
mkdir -p /mongodb/sharded_cluster/myshardrs01_27217/data/db

新建配置文件

vim /mongodb/sharded_cluster/myshardrs01_27017/mongod.conf

myshardrs01_27017配置内容

systemLog:
  #日志输出为文件 
  destination: file
  #日志文件的路径 
  path: "/mongodb/sharded_cluster/myshardrs01_27017/log/mongod.log"
  #mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。 
  logAppend: true 
storage: 
  #数据目录。
  dbPath: "/mongodb/sharded_cluster/myshardrs01_27017/data/db" 
  journal:
    #启用持久性日志
    enabled: true
processManagement:
  #启用守护进程模式。 
  fork: true
  #指定进程ID的文件位置
  pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27017/log/mongod.pid"
net:
  #服务实例绑定的IP
  bindIp: 0.0.0.0
  #绑定的端口 
  port: 27017
replication:
  #副本集的名称 
  replSetName: myshardrs01
sharding:
  #分片角色,shard
  clusterRole: shardsvr

myshardrs01_27117配置内容

vim /mongodb/sharded_cluster/myshardrs01_27117/mongod.conf
systemLog:
  #日志输出为文件 
  destination: file
  #日志文件的路径 
  path: "/mongodb/sharded_cluster/myshardrs01_27117/log/mongod.log"
  #mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。 
  logAppend: true 
storage: 
  #数据目录。
  dbPath: "/mongodb/sharded_cluster/myshardrs01_27117/data/db" 
  journal:
    #启用持久性日志
    enabled: true
processManagement:
  #启用守护进程模式。 
  fork: true
  #指定进程ID的文件位置
  pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27117/log/mongod.pid"
net:
  #服务实例绑定的IP
  bindIp: 0.0.0.0
  #绑定的端口 
  port: 27117
replication:
  #副本集的名称 
  replSetName: myshardrs01
sharding:
  #分片角色,shard
  clusterRole: shardsvr

myshardrs01_27217配置内容

vim /mongodb/sharded_cluster/myshardrs01_27217/mongod.conf
systemLog:
  #日志输出为文件 
  destination: file
  #日志文件的路径 
  path: "/mongodb/sharded_cluster/myshardrs01_27217/log/mongod.log"
  #mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。 
  logAppend: true 
storage: 
  #数据目录。
  dbPath: "/mongodb/sharded_cluster/myshardrs01_27217/data/db" 
  journal:
    #启用持久性日志
    enabled: true
processManagement:
  #启用守护进程模式。 
  fork: true
  #指定进程ID的文件位置
  pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27217/log/mongod.pid"
net:
  #服务实例绑定的IP
  bindIp: 0.0.0.0
  #绑定的端口 
  port: 27217
replication:
  #副本集的名称 
  replSetName: myshardrs01
sharding:
  #分片角色,shard
  clusterRole: shardsvr

启动三个服务

/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27017/mongod.conf

/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27117/mongod.conf

/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27217/mongod.conf

初始化副本集

连接任意一个节点

/usr/local/mongodb/bin/mongo --host 172.18.87.20 --port 27017

初始化副本集(如果副本集名称有问题,记得修改名称)

rs.initiate()
记得一定要回车一下,不然不是主节点
# 导出配置到config
#这一句如果不写会报错[js] ReferenceError: config is not defined 
config = rs.conf() 
# 设置第1个节点的优先级是10
config.members[0].host="172.18.87.20:27017"
# 重载配置
rs.reconfig(config)

添加副本节点

rs.add("172.18.87.20:27117")

添加仲裁节点

rs.addArb("172.18.87.20:27217")

 退出第一台服务器

myshardrs01:PRIMARY> exit

 

1.3.2 第二套shard副本集

使用 172.17.238.236 服务器,启动3个MongoDB服务

准备存放数据和日志的目录

mkdir -p /mongodb/sharded_cluster/myshardrs02_27017/log
mkdir -p /mongodb/sharded_cluster/myshardrs02_27017/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs02_27117/log
mkdir -p /mongodb/sharded_cluster/myshardrs02_27117/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs02_27217/log
mkdir -p /mongodb/sharded_cluster/myshardrs02_27217/data/db

新建配置文件

vim /mongodb/sharded_cluster/myshardrs02_27017/mongod.conf

myshardrs02_27017配置内容

systemLog:
  #日志输出为文件 
  destination: file
  #日志文件的路径 
  path: "/mongodb/sharded_cluster/myshardrs02_27017/log/mongod.log"
  #mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。 
  logAppend: true 
storage: 
  #数据目录。
  dbPath: "/mongodb/sharded_cluster/myshardrs02_27017/data/db" 
  journal:
    #启用持久性日志
    enabled: true
processManagement:
  #启用守护进程模式。 
  fork: true
  #指定进程ID的文件位置
  pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27017/log/mongod.pid"
net:
  #服务实例绑定的IP
  bindIp: 0.0.0.0
  #绑定的端口 
  port: 27017
replication:
  #副本集的名称 
  replSetName: myshardrs02
sharding:
  #分片角色,shard
  clusterRole: shardsvr

myshardrs02_27117配置内容

vim /mongodb/sharded_cluster/myshardrs02_27117/mongod.conf
systemLog:
  #日志输出为文件 
  destination: file
  #日志文件的路径 
  path: "/mongodb/sharded_cluster/myshardrs02_27117/log/mongod.log"
  #mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。 
  logAppend: true 
storage: 
  #数据目录。
  dbPath: "/mongodb/sharded_cluster/myshardrs02_27117/data/db" 
  journal:
    #启用持久性日志
    enabled: true
processManagement:
  #启用守护进程模式。 
  fork: true
  #指定进程ID的文件位置
  pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27117/log/mongod.pid"
net:
  #服务实例绑定的IP
  bindIp: 0.0.0.0
  #绑定的端口 
  port: 27117
replication:
  #副本集的名称 
  replSetName: myshardrs02
sharding:
  #分片角色,shard
  clusterRole: shardsvr

myshardrs02_27217配置内容

vim /mongodb/sharded_cluster/myshardrs02_27217/mongod.conf
systemLog:
  #日志输出为文件 
  destination: file
  #日志文件的路径 
  path: "/mongodb/sharded_cluster/myshardrs02_27217/log/mongod.log"
  #mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。 
  logAppend: true 
storage: 
  #数据目录。
  dbPath: "/mongodb/sharded_cluster/myshardrs02_27217/data/db" 
  journal:
    #启用持久性日志
    enabled: true
processManagement:
  #启用守护进程模式。 
  fork: true
  #指定进程ID的文件位置
  pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27217/log/mongod.pid"
net:
  #服务实例绑定的IP
  bindIp: 0.0.0.0
  #绑定的端口 
  port: 27217
replication:
  #副本集的名称 
  replSetName: myshardrs02
sharding:
  #分片角色,shard
  clusterRole: shardsvr

启动三个服务

/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27017/mongod.conf

/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27117/mongod.conf

/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27217/mongod.conf

初始化副本集

连接任意一个节点

/usr/local/mongodb/bin/mongo --host 172.18.86.119 --port 27017

初始化副本集(如果副本集名称有问题,记得修改名称)

rs.initiate()
记得一定要回车一下,不然不是主节点
# 导出配置到config
#这一句如果不写会报错[js] ReferenceError: config is not defined 
config = rs.conf() 
# 设置第1个节点的优先级是10
config.members[0].host="172.18.86.119:27017"
# 重载配置
rs.reconfig(config)

添加副本节点

rs.add("172.18.86.119:27117")

添加仲裁节点

rs.addArb("172.18.86.119:27217")

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
引用\[1\]和\[2\]中提到的问题是关于使用@JsonFormat注解进行日期格式化时遇到的错误。具体问题是在使用LocalDateTime作为日期类型时,前端传递日期格式的字符串到后端后,后端接收到的数据转换为LocalDateTime后总是少8个小时。这是由于时区的问题导致的。为了解决这个问题,可以在@JsonFormat注解中添加时区信息。然而,这样做可能会导致报错,如java.lang.NoSuchFieldError: ACCEPT_CASE_INSENSITIVE_VALUES。这个错误是由于Jackson的版本不一致导致的。解决方法是将jackson-annotations包升级为2.10.3版本,确保与jackson-datatype-jsr310包的版本一致。这样就可以解决问题了。\[1\]\[2\] #### 引用[.reference_title] - *1* [@JsonFormat注解遇到的问题](https://blog.csdn.net/p393975269/article/details/122379742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JsonFormat java.lang.NoSuchFieldError: ACCEPT_CASE_INSENSITIVE_VALUES](https://blog.csdn.net/lly576403061/article/details/131172611)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夏天禧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值