Ceph S3 基于NGINX的集群复制方案

前言

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的网关,我的环境为:

192.168.19.101:8080192.168.19.102:8080

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

nginx的机器在192.168.19.104

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

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

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

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

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

下面就用到了nginx的最新的模块了 Nginx 1.13.4 发布,新增 ngx_http_mirror_module 模块

软件下载:

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

下载rpm包然后安装 安装:

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

修改nginx配置文件:

upstream s3 {
      server 127.0.0.1:81;
      server 127.0.0.1:82;
}

server {
    listen       81;
    server_name  localhost;

    location / {
    mirror /mirror;
    proxy_pass http://192.168.19.101:8080;
    }

    location /mirror {
    internal;
    proxy_pass http://192.168.19.102:8080$request_uri;
    }
}

server {
    listen       82;
    server_name  localhost;

    location / {
    mirror /mirror;
    proxy_pass http://192.168.19.102:8080;
    }

    location /mirror {
    internal;
    proxy_pass http://192.168.19.101:8080$request_uri;
    }
}
server{
    listen 80;
    location / {
        proxy_pass         http://s3;
    }
}

负载均衡的设置有很多种,这里用最简单的轮训的模式,想配置其他负载均衡模式可以参考我的这篇文章

重启进程并检查服务

[root@node04 ~]# systemctl restart nginx[root@node04 ~]# netstat -tunlp|grep nginxtcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1582973/nginx: mast 
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      1582973/nginx: mast 
tcp        0      0 0.0.0.0:82              0.0.0.0:*               LISTEN      1582973/nginx: mast

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

s3用户相关脚本

创建用户的脚本

见原文链接

运行脚本: 见原文链接

在两个集群中检查:

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

修改用户

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

删除用户脚本

见原文链接

可以看到两边都删除了

获取用户的信息脚本

见原文链接

测试上传一个文件

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

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

总结

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

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

原文发布于微信公众号 - 磨磨谈(momotan1987)

原文发表时间:2017-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

使用 cURL 测量网站响应时间

内容整理自:https://blog.cloudflare.com/a-question-of-timing/,其中还有 chrome 的测量方式,有兴趣的朋友...

1602
来自专栏性能与架构

读写分离中间件 MaxScale 在 slave 有故障后如何处理?

之前介绍了 MaxScale 可以实现 Mysql 的读写分离和读负载均衡,那么当 slave 出现故障后,MaxScale 会如何处理呢? 例如有 3 台数据...

5404
来自专栏mwangblog

开始使用GitHub

1252
来自专栏软件工程师成长笔记

Xshell远程连接linux虚拟机

Ubuntu默认不安装openssh服务器,所以若要使用ssh远程登录Ubuntu主机,首先需要安装ssh服务器。 首先,判断Ubuntu是否安装了ssh服务...

6283
来自专栏河湾欢儿的专栏

webpack

npm install webpack -g npm init -y npm install webpack --save-dev

1021
来自专栏性能与架构

使用 twemproxy 构建 Redis 集群

twemproxy 简介 twemproxy(又称 nutcracker)是 Twtter 贡献的一个 轻量级 高性能 的 redis/memcached 代理...

3284
来自专栏我的小碗汤

NAT模式实现虚拟机共享主机网络

上一节我们在虚拟机上搭建了linux系统,并利用桥接模式访问互联网,这一节,我们来配置一下通过NAT模式访问互联网。说到这里有些小伙伴可能要问了,NAT模式和桥...

1652
来自专栏IT可乐

Linux系列教程(二十四)——Linux的系统管理

  上篇博客介绍了Linux的服务管理,不管是以RPM包安装的服务,还是通过源码包安装的服务,万能启动服务的方法都可以通过 /绝对路径/启动脚本名 start ...

2006
来自专栏信安之路

Linux本地信息收集

我们在获取到webshell之后,经常会遇到Linux的操作系统,这是我们需要对Linux系统本地的敏感资源进行信息收集,下面就是一些有用的信息获取方式。

990
来自专栏安恒信息

【高危】漏洞预警 | Linux Systemd存在高危远程溢出漏洞(CVE-2017-9445)

systemd是Linux下的init软件,主要用于减少系统引导时间和计算开销。 systemd 的systemd-resolved服务用于处理DNS请求并为本...

3077

扫码关注云+社区

领取腾讯云代金券