当前位置:   article > 正文

多机对象存储的实现机制_对象存储机制

对象存储机制

特点:

1. 多机同时运行

2. 当客户端提交一个大文件的时候,服务端要判断这个文件的大小,然后把这个文件分割,并执行一些调度逻辑,假设分成4份,调度逻辑要调度出这份文件的4个子集,分别应该放到哪个具体的data-server上,并向客户端返回这4个data-server的IP地址

3. 服务端记录下这个文件和这4个dataserver的对应关系,这些就叫元数据,比如类似这样的结构化形式:

id、filename、storage_path、total_size、splits、data_servers(可以有多个)、每个data_server上存储的具体位置、每个data_server存储的文件分片的offset位置

换句话说,元数据服务器进程要根据客户端提交上来的一个文件写入的请求,进行计算,计算什么呢?

  1. 这个文件有多大
  2. 分成几份,每份按字节来计算偏移量,startoffset ~ endoffset,比如分成4份,分别是1-1000、1001-2000、2001-3000、3001-3555字节,这4份子文件分别存放在4台data-server上
  3. 找出4台data-server,比如根据data-server是否在线,data-server的磁盘剩余容量等
  4. 向客户端返回4台data-server的ip地址
  5. 客户端同时连接4台data-server,分别向4台data-server发送数据,把文件的4个子集写到data-server磁盘上,还要记住4个data-server上的具体存储位置,比如/data/companyname/projectname/abc/myfile001

4. 客户端向meta-server发起查询文件的时候,metaserver就要根据之前的元数据信息,找出这个文件对应存放在哪些data-server上了,然后让client和这4个data-server建立tcp连接,同时下载数据,客户端最后把文件自行拼接起来

5. 整个集群系统要支持文件的副本备份,上面一个客户端提交的大文件,分成4份后,要自动再集群内进行备份,而且要跨data-server进行互为备份,这些备份信息要存储在meta-server的数据库中,而且meta-server的数据库也必须高可用

6. meta-server也是必须HA部署

7. 要能够随时对meta-server进行扩容

8. 要能够随时对data-server进行扩容,meta-server必须知道每个data-server的详细信息(健康状态、磁盘剩余空间、cpu使用率、内存使用率、网卡流量等信息),data-server和meta-server之间有心跳包

MinIO的集群方式部署

肯定不能单机试验那样启动一个进程就完事了,必须集群部署,如果是docker-compose的话,可以在单机启动多个minIO docker容器,但是不能跨物理主机,用docker swarm或者K8s的话,可以跨物理主机部署minIO,下面这个compose.yaml文件说明了一切。

  1. version: '3.7'
  2. # Settings and configurations that are common for all containers
  3. x-minio-common: &minio-common
  4. image: quay.io/minio/minio:RELEASE.2021-09-09T21-37-07Z
  5. command: server --console-address ":9001" http://minio{1...4}/data{1...2}
  6. expose:
  7. - "9000"
  8. - "9001"
  9. environment:
  10. MINIO_ROOT_USER: minio
  11. MINIO_ROOT_PASSWORD: minio123
  12. healthcheck:
  13. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  14. interval: 30s
  15. timeout: 20s
  16. retries: 3
  17. # starts 4 docker containers running minio server instances.
  18. # using nginx reverse proxy, load balancing, you can access
  19. # it through port 9000.
  20. services:
  21. minio1:
  22. <<: *minio-common
  23. hostname: minio1
  24. volumes:
  25. - data1-1:/data1
  26. - data1-2:/data2
  27. minio2:
  28. <<: *minio-common
  29. hostname: minio2
  30. volumes:
  31. - data2-1:/data1
  32. - data2-2:/data2
  33. minio3:
  34. <<: *minio-common
  35. hostname: minio3
  36. volumes:
  37. - data3-1:/data1
  38. - data3-2:/data2
  39. minio4:
  40. <<: *minio-common
  41. hostname: minio4
  42. volumes:
  43. - data4-1:/data1
  44. - data4-2:/data2
  45. nginx:
  46. image: nginx:1.19.2-alpine
  47. hostname: nginx
  48. volumes:
  49. - ./nginx.conf:/etc/nginx/nginx.conf:ro
  50. ports:
  51. - "9000:9000"
  52. - "9001:9001"
  53. depends_on:
  54. - minio1
  55. - minio2
  56. - minio3
  57. - minio4
  58. ## By default this config uses default local driver,
  59. ## For custom volumes replace with volume driver configuration.
  60. volumes:
  61. data1-1:
  62. data1-2:
  63. data2-1:
  64. data2-2:
  65. data3-1:
  66. data3-2:
  67. data4-1:
  68. data4-2:

启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令 

  1. export MINIO_ACCESS_KEY=<ACCESS_KEY>
  2. export MINIO_SECRET_KEY=<SECRET_KEY>
  3. minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
  4. http://192.168.1.13/export3 http://192.168.1.14/export4 \
  5. http://192.168.1.15/export5 http://192.168.1.16/export6 \
  6. http://192.168.1.17/export7 http://192.168.1.18/export8

但是奇怪的是,并没有看到minio有meta-server这样的角色,难道所有的节点都是对等的?貌似核心是它用了一个所谓的纠删码机制

纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复

纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。

 位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/379416?site
推荐阅读