前言

ceph的s3数据的同步可以通过radosgw-agent进行同步,同region可以同步data和metadata,不同region只能同步metadata,这个地方可以参考下秦牧羊梳理的 ceph radosgw 多集群同步部署流程,本篇讲述的方案与radosgw-agent的复制方案不同在于,这个属于前端复制,后端相当于透明的两个相同集群,在入口层面就将数据进行了复制分流

在某些场景下,需求可能比较简单:

  • 需要数据能同时存储在两个集群当中
  • 数据写一次,读多次
  • 两个集群都能写

一方面两个集群可以增加数据的可靠性,另一方面可以提高读带宽,两个集群同时可以提供读的服务

radosgw-agent是从底层做的同步,正好看到秦牧羊有提到nginx新加入了ngx_http_mirror_module 这个模块,那么本篇就尝试用这个模块来做几个简单的配置来实现上面的需求,这里纯架构的尝试,真正上生产还需要做大量的验证和修改的测试的

结构设想

当数据传到nginx的server的时候,nginx本地进行负载均衡到两个本地端口上面,本地的两个端口对应到两个集群上面,一个主写集群1,一个主写集群2,这个是最简结构,集群的civetweb可以是很多机器,nginx这个也可以是多台的机器,在一台上面之所以做个均衡是可以让两个集群是对等关系,而不是一个只用nginx写,另一个只mirror写

环境准备

准备两个完全独立的集群,分别配置一个s3的网关,我的环境为:

  1. 192.168.19.101:8080
  2. 192.168.19.102:8080

在每个机器上都创建一个管理员的账号,这个用于后面的通过restapi来进行管理的,其他的后面的操作都通过http来做能保证两个集群的数据是一致的

nginx的机器在192.168.19.104

在两个集群当中都创建相同的管理用户

  1. radosgw-admin user create --uid=admin --display-name=admin --access_key=admin --secret=123456

这里为了测试方便使用了简单密码

此时admin还仅仅是普通的权限,需要通过--cap添加user的capabilities,例如:

  1. radosgw-admin caps add --uid=admin --caps="users=read, write"
  2. radosgw-admin caps add --uid=admin --caps="usage=read, write"

下面就用到了nginx的最新的模块了

Nginx 1.13.4 发布,新增 ngx_http_mirror_module 模块

软件下载:

  1. wget https://nginx.org/packages/mainline/centos/7/x86_64/RPMS/nginx-1.13.4-1.el7.ngx.x86_64.rpm

下载rpm包然后安装

安装:

  1. rpm -ivh nginx-1.13.4-1.el7.ngx.x86_64.rpm

修改nginx配置文件:

  1. upstream s3 {
  2. server 127.0.0.1:81;
  3. server 127.0.0.1:82;
  4. }
  5. server {
  6. listen 81;
  7. server_name localhost;
  8. location / {
  9. mirror /mirror;
  10. proxy_pass http://192.168.19.101:8080;
  11. }
  12. location /mirror {
  13. internal;
  14. proxy_pass http://192.168.19.102:8080$request_uri;
  15. }
  16. }
  17. server {
  18. listen 82;
  19. server_name localhost;
  20. location / {
  21. mirror /mirror;
  22. proxy_pass http://192.168.19.102:8080;
  23. }
  24. location /mirror {
  25. internal;
  26. proxy_pass http://192.168.19.101:8080$request_uri;
  27. }
  28. }
  29. server{
  30. listen 80;
  31. location / {
  32. proxy_pass http://s3;
  33. }
  34. }

负载均衡的设置有很多种,这里用最简单的轮训的模式,想配置其他负载均衡模式可以参考我的《关于nginx-upstream的几种配置方式》

重启进程并检查服务

  1. [root@node04 ~]# systemctl restart nginx
  2. [root@node04 ~]# netstat -tunlp|grep nginx
  3. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1582973/nginx: mast
  4. tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 1582973/nginx: mast
  5. tcp 0 0 0.0.0.0:82 0.0.0.0:* LISTEN 1582973/nginx: mast

整个环境就配置完成了,下面我们就来验证下这个配置的效果是什么样的,下面会提供几个s3用户的相关的脚本

s3用户相关脚本

创建用户的脚本

  1. #!/bin/bash
  2. ###
  3. #S3 USER ADMIN
  4. ###
  5. ###==============WRITE BEGIN=============###
  6. ACCESS_KEY=admin ## ADMIN_USER_TOKEN
  7. SECRET_KEY=123456 ## ADMIN_USER_SECRET
  8. HOST=192.168.19.104:80
  9. USER_ACCESS_KEY="&access-key=user1"
  10. USER_SECRET_KEY="&secret-key=123456"
  11. ###==============WRITE FINAL=======FINAL=====###
  12. query2=admin/user
  13. userid=$1
  14. name=$2
  15. uid="&uid="
  16. date=`TZ=GMT LANG=en_US date "+%a, %d %b %Y %H:%M:%S GMT"`
  17. header="PUT\n\n\n${date}\n/${query2}"
  18. sig=$(echo -en ${header} | openssl sha1 -hmac ${SECRET_KEY} -binary | base64)
  19. curl -v -H "Date: ${date}" -H "Authorization: AWS ${ACCESS_KEY}:${sig}" -L -X PUT "http://${HOST}/${query2}?format=json${uid}${userid}&display-name=${name}${USER_ACCESS_KEY}${USER_SECRET_KEY}" -H "Host: ${HOST}"
  20. echo ""

运行脚本:

  1. [root@node01 ~]# sh addusernew.sh user1 USER1
  2. * About to connect() to 192.168.19.104 port 80 (#0)
  3. * Trying 192.168.19.104...
  4. * Connected to 192.168.19.104 (192.168.19.104) port 80 (#0)
  5. > PUT /admin/user?format=json&uid=user1&display-name=USER1&access-key=user1&secret-key=123456 HTTP/1.1
  6. > User-Agent: curl/7.29.0
  7. > Accept: */*
  8. > Date: Wed, 09 Aug 2017 07:51:58 GMT
  9. > Authorization: AWS admin:wuqQUUXhhar5nQS5D5B14Dpx+Rw=
  10. > Host: 192.168.19.104:80
  11. >
  12. < HTTP/1.1 200 OK
  13. < Server: nginx/1.13.4
  14. < Date: Wed, 09 Aug 2017 07:51:58 GMT
  15. < Content-Type: application/json
  16. < Content-Length: 195
  17. < Connection: keep-alive
  18. <
  19. * Connection #0 to host 192.168.19.104 left intact
  20. {"user_id":"user1","display_name":"USER1","email":"","suspended":0,"max_buckets":1000,"subusers":[],"keys":[{"user":"user1","access_key":"user1","secret_key":"123456"}],"swift_keys":[],"caps":[]}

在两个集群中检查:

可以看到两个集群当中都产生了相同的用户信息

修改用户

直接把上面的创建脚本里面的PUT改成POST就是修改用户的脚本

删除用户脚本

  1. #!/bin/bash
  2. ###
  3. #S3 USER ADMIN
  4. ###
  5. ###==============WRITE BEGIN=============###
  6. ACCESS_KEY=admin ## ADMIN_USER_TOKEN
  7. SECRET_KEY=123456 ## ADMIN_USER_SECRET
  8. HOST=192.168.19.104:80
  9. ###==============WRITE FINAL=======FINAL=====###
  10. query2=admin/user
  11. userid=$1
  12. uid="&uid="
  13. date=`TZ=GMT LANG=en_US date "+%a, %d %b %Y %H:%M:%S GMT"`
  14. header="DELETE\n\n\n${date}\n/${query2}"
  15. sig=$(echo -en ${header} | openssl sha1 -hmac ${SECRET_KEY} -binary | base64)
  16. curl -v -H "Date: ${date}" -H "Authorization: AWS ${ACCESS_KEY}:${sig}" -L -X DELETE "http://${HOST}/${query2}?format=json${uid}${userid}" -H "Host: ${HOST}"
  17. echo ""

执行删除用户:

  1. [root@node01 ~]# sh deluser.sh user1

可以看到两边都删除了

获取用户的信息脚本

  1. #! /bin/sh
  2. ###
  3. #S3 USER ADMIN
  4. ###
  5. ###==============WRITE BEGIN=============###
  6. ACCESS_KEY=admin ## ADMIN_USER_TOKEN
  7. SECRET_KEY=123456 ## ADMIN_USER_SECRET
  8. HOST=192.168.19.101:8080
  9. ###==============WRITE FINAL=======FINAL=====###
  10. query2=admin/user
  11. userid=$1
  12. uid="&uid="
  13. date=`TZ=GMT LANG=en_US date "+%a, %d %b %Y %H:%M:%S GMT"`
  14. header="GET\n\n\n${date}\n/${query2}"
  15. sig=$(echo -en ${header} | openssl sha1 -hmac ${SECRET_KEY} -binary | base64)
  16. curl -v -H "Date: ${date}" -H "Authorization: AWS ${ACCESS_KEY}:${sig}" -L -X GET "http://${HOST}/${query2}?format=json${uid}${userid}&display-name=${name}" -H "Host: ${HOST}"

测试上传一个文件

通过192.168.19.104:80端口上传一个文件,然后通过nginx的端口,以及两个集群的端口进行查看

可以看到在上传一次的情况下,两个集群里面同时拥有了这个文件

总结

真正将方案运用到生产还需要做大量的验证测试,中间的失效处理,以及是否可以将写镜像,读取的时候不镜像,这些都需要进一步做相关的验证工作

本篇中的S3用户的管理接口操作参考了网上的其他资料

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-08-10

Ceph S3 基于NGINX的集群复制方案的更多相关文章

  1. 基于Centos7xELK+Kafka集群部署方案

    本次集群部署使用ELK版本统一为6.8.10,kafka为2.12-2.51 均可在官网下载 elasticsearch下载地址:https://www.elastic.co/cn/downloads ...

  2. 基于Nginx实现集群原理

    1)安装Nginx 2)配置多个Tomcat,并修改端口号(两个端口号不一样即可) 3)在Nginx的Nginx.conf添加如下配置:

  3. Linux+.NetCore+Nginx搭建集群

    本篇和大家分享的是Linux+NetCore+Nginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话 ...

  4. Centos7+nginx+keepalived集群及双主架构案例

    目录简介 一.简介 二.部署nginx+keepalived 集群 三.部署nginx+keepalived双主架构 四.高可用之调用辅助脚本进行资源监控,并根据监控的结果状态实现动态调整 一.简介 ...

  5. nginx实现集群高可用

    大家知道NGINX作为反向代理服务器可以实现负载均衡,同时也可以作为静态文件服务器,它的特点就是并发支持大,单机可同时支持3万并发,现在很多网站都把NGINX作为网关入口来统一调度分配后端资源.但是如 ...

  6. LB+nginx+tomcat7集群模式下的https请求重定向(redirect)后变成http的解决方案

    0. 环境信息 Linux:Linux i-8emt1zr1 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_6 ...

  7. Tomcat之如何使用Nginx进行集群部署

    目录结构: contents structure [+] 1,为什么需要集群 2,如何使用Nginx部署tomcat集群 2.1,下载Nginx 2.2,在同一台电脑上部署多个Tomcat服务器 2. ...

  8. FastDFS+nginx+keepalived集群搭建

    安装环境 nginx-1.6.2 libfastcommon-master.zip FastDFS_v5.05.tar.gz(http://sourceforge.net/projects/fastd ...

  9. tomcat+nginx+redis集群试验

    Nginx负载平衡 + Tomcat + 会话存储Redis配置要点   使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7x24 运 ...

随机推荐

  1. Android HandlerThread 详解

    概述 HandlerThread 相信大家都比较熟悉了,从名字上看是一个带有 Handler 消息循环机制的一个线程,比一般的线程多了消息循环的机制,可以说是Handler + Thread 的结合, ...

  2. 如何获取前端提交来得json格式数据

    composer.json { "require": { "guzzlehttp/guzzle": "~6.0" } } composer ...

  3. centos8安装sersync为rsync实现实时同步

    一,查看本地centos的版本: [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) ...

  4. IL角度理解C#中字段,属性与方法的区别

    IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...

  5. MVC实现修改数据

    前言 前言 最近没什么好写的,所以写个修改来巩固一下知识 控制器 public ActionResult UpdeteCartsNum(SYS_Carts sYS_Carts) { var list ...

  6. 攻防世界-web2

    打开题目直接一梭子代码,给我们了个加密的密文,然我们解出flag 审计一波 先时将flag字符串逆序,然后每一个ascii码数值+1,然后base64加密,然后逆序,然后再rot13加密 得到加密的密 ...

  7. 在Linux系统中安装Chrome浏览器

    前言:作为一个Web开发人员,经常与我们相伴的必然少不了浏览器,而Google旗下的chrome浏览器更是凭借着出色的性能.简洁的界面被广大开发者所喜爱,今天分享下如何在linux系统下安装chrom ...

  8. Eureka整合sidecar异构调用

    本次使用nodejs脚本生成的异构程序测试: node-server.js var http = require('http'); var url = require('url'); var path ...

  9. Mysql优化建议

    Mysql优化建议: (1)CPU要更快,而不是更多.因为mysql不支持多个处理器并发处理一条sql,所以正常情况下不需要考虑更多的CPU.当然,你的系统中的对mysql的并发很高时,多核可以解决一 ...

  10. 微信小程序日历签到

    近日做了一个项目需要用到日历插件,在网上找了一部分感觉跟项目不对口,所以就查考了其他的日历插件做了一个. 需求: 如图: 代码如下: index.wxml: <!--pages/pictrues ...