前一阵子负责公司分布式文件技术选型、搭建集群、数据迁移等相关杂七杂八的工做,技术选型上一篇已经讲过了,这里重点聊聊集群和迁移。html
集群是三台套路云机器,8C-16G-5M * 3前端
搭建 Minio
的负载均衡集群,官方推荐无外乎两种方式: Docker Swarm 与 Kubernetes (K8S「K-S共8个字母所以得名」) 两种方式,K8S 不是我负责,因此我先使用 Swarm 来搭建集群先保证测试经过便可。linux
集群搭建方式也很简单,直接看官网的例子: https://docs.min.io/docs/deploy-minio-on-docker-swarmnginx
稍微用过一点 docker 的人看一下就能够,稍微注意一点:记住集群的 Leader 的编号、后面迁移也会用到。git
初步打算负载四个不一样的环境github
既然用了集群,就须要考虑多租户的问题了,Minio 的桶最初的设想我是想单租户用来放 COMPANYID 的,这个思想有点相似 ElasticSearch 中的 _routing,这样能够海量数据均匀分布,之后的横向扩容、数据迁移都十分的方便。可是考虑到这样一来就没有机器给 「测试机器」「金丝雀机器」「研发本地开发」「备用机」搭建环境了,确实有点浪费,因此通过深思熟虑改变策略:web
以域名做为桶区分租户,之前硬盘的数据原路写到 Minio,换句话说一个环境一个桶,这样目前好处也很明显:sql
恰好前几天看了本书《分布式服务架构 原理、设计与实战》,原本挺好奇的,读一读发现挺水的,不如叫 《近两年常见的分布式架构介绍》,不过速度一番也能看到一些有用的东西。做者写了这么一句:docker
可是我我的感受,双写后较难立刻发现问题,立刻修复,因此双写并无大规模的实践,由于我也不肯定,双写后本地 IO 关掉会发生多少问题。shell
迁移的工做是最复杂、最容易遗漏的、须要咱们留心观察,尽可能一步到位,与测试人员沟通细心测试全部相关文件内容,避免之后的麻烦
系统资源所有改成文件系统集群,说白了就是「上云了」,全部服务器本地 IO 都绝对不能再有。不然负载均衡时会出现 A B C 三台机器轮询,66.6%的概率访问不到资源的 BUG,为之后研发人员的调试,和测试同事找麻烦。因此这里要尽可能找到全部的:
好比 outputSream read write flush 等关键参数全局搜一搜,须要下一步改成以流的方式传到分布式文件系统中。
其中有些通用上传的改下能解决 50% 的问题,剩余的就五花八门了,有定时 Task 写到 openResty 静态资源目录的,有写到系统 /mnt/xxx 下的,恰好趁机与领导碰一下,制定一套规则,涉及到 N 个微服务 + 一些报表服务 + 一些中间件微服务『压缩服务、文件预览服务』 等,共同调整。
软规则,口头 + 文档说明,并不是在代码指定好 Utiil + Contacts 的硬性规则,由于微服务众多,短时间内只能作点妥协。
上面的只是上传的一些问题,下面说说读取的问题
以前用的是 openResty 的静态目录,如今迁移到文件系统天然须要前端平滑的过滤到 Minio 上,前端不能有太大的改动,先后端一块儿调整是灾难性的,我很忌讳这样的操做。
打个比方原来前端:
/checkJpg/routing/xxx/user/xxx/xx.jpg复制代码
迁移到 Minio 后
/minio_host/checkJpg/routing/xxx/user/xxx/xx.jpg复制代码
注意:minio 桶禁止大写字母
咱们不可能让前端加个 Base_Url 由于不少都是后端早早持久化到 Mysql 或者 ES 中了,前端对此确定无能为力。因此使用 openResty rewrite 重写了路由,固然安装 lua 插件也能够。
好比这样:
location ~^/checkJpg {复制代码 proxy_buffering off;复制代码 rewrite ^//checkJpg/(.*)$ /minio_host/checkJpg/$1;复制代码 proxy_set_header Host $http_host;复制代码 # 而后代理 checkjpg 到 minio 集群: 复制代码 }复制代码
复制代码
其实开始我考虑到了 Minio 的令牌权限问题,代理时设为公开来桶的安全问题,要不要写个 lua 脚本作验证,后来发现本身特傻想多了,可能想多了,参考 行业 BAT Github 等众多服务,也没见谁把 OSS 搞成验证的,因此这样应该能够,若之后有需求涉及到用户敏感信息预防万一的话,分分钟加个验证不是问题。
还有本地一些 IO 读取操做,与上文的上传同理,循序渐进的修改就能够了。
接下来 merge 代码以后,扔到一个分支上,而后进行老数据的迁移工做。
迁移呢,我选择的 Minio 官方的 mc 客户端,操做简单容易上手,我也本身简单整理了一下:
因为先临时测试 我先临时 docker 搭建了单台 Minio 进行测试,待测试所有经过,发布集群。
yum install s3cmd # centos、具体看 https://s3tools.org/repositories复制代码
复制代码 # linux/macos 复制代码 wget https://dl.min.io/server/minio/release/linux-amd64/minio复制代码 chmod +x minio复制代码 ./minio server /data复制代码
先启动一下看看 私钥 而后 nohup
nohup ./minio server /data &
复制代码
# linux/macos /home/minio/复制代码 wget https://dl.minio.io/client/mc/release/linux-amd64/mc复制代码 chmod +x mc复制代码 ./mc --help复制代码
mc 添加 minio 地址
# mc config host add <alias> <ip:port> <access key> <> <aws相关版本 s3v4便可>复制代码 mc config host add qmenhu http://localhost:9000 4NMXJ94DEJHKTSI42B9D Kwbypq+4sySAqWl7AN0kSfZT5jLJfTq96B3CdMIO S3v4复制代码
建立须要的桶
mc mb qmenhu/checkjpg 复制代码 # 全部的大写都是不容许的 具体:https://github.com/minio/minio/pull/5095#discussion_r147351020复制代码 # 其实也能够代理回来大写的 :9000/minio/checkJpg复制代码
设为公开 (无秘钥访问) 公开的桶,无需秘钥访问、能够硬盘写入资源「硬盘写入可否同步未测」
mc policy public qmenhu/checkjpg复制代码
Access permission for qmenhu/checkjpg
is set to public
先配置下
复制代码vim ~/.s3cfg复制代码
复制代码# 设置endpoint复制代码host_base = 127.0.0.1:9000复制代码host_bucket = 127.0.0.1:9000复制代码bucket_location = us-east-1复制代码use_https = False #若是升级了 https 就放开复制代码 复制代码# 设置access key和secret key,「启动时的,通常不会变」复制代码access_key = 4NMXJ94DEJHKTSI42B9D复制代码secret_key = Kwbypq+4sySAqWl7AN0kSfZT5jLJfTq96B3CdMIO复制代码 复制代码# 启用S3 v4版本签名API复制代码signature_v2 = False复制代码
复制代码
执行迁移命令
s3cmd sync /usr/local/nginx/html/checkJpg/ s3://checkjpg #从 本地 到 minio复制代码 复制代码 #s3cmd sync s3://checkjpg /usr/local/nginx/html/checkJpg/ 从 minio 到 本地复制代码
主要取决于文件个数+磁盘速度「14888图片| 1224Mb | 719s」
完成以后,删掉 Linux 服务器本地原有的资源,gitLab-runner 部署刚才 checkout 的你们调整的分支,交给测试的同事测试。
结果还能够,测试的同窗们1个小时给咱们提了 20+ 个 BUG,不过都轻轻松的改完了,以后的陆陆续续的小问题也很快就迎刃而解了。那么单台测试效果很理想,只须要迁移到集群就OK了
后面的重复工做我就不作了,交给运维来作,说明关键点,注意尽可能往 Swarm 指定的 Leader 机器来写数据,方便「从」机器同步数据。
修改写
修改读
检查各个须要调整的服务
单台迁移数据测试「金丝雀」
测试集群
发布
不只是文件系统,经过此次的迁移冒险,之后迁移任何集群均可以借鉴。此文非技术性文章,纯属分享经验。
首发地址 :github.com/pkwenda/Blo…