分布式对象存储Ambry集群部署

一、简介

Ambry 是一个分布式对象存储,支持存储数万亿个不可变对象(50K -100K)以及数十亿个大型对象。它专为在网络公司中存储和服务媒体对象而设计。但是,它可以用作通用存储系统来存储数据库备份、搜索索引或业务报告。系统具有以下特征:

  1. 高度可用且水平可扩展
  2. 低延迟和高吞吐量
  3. 针对小型和大型对象进行了优化
  4. 经济高效
  5. 易于使用

二、部署

1、基础环境及架构

image.png
前端ip port 服务端ip port
192.168.4.39 1174 192.168.4.39 6667
192.168.4.40 6667
192.168.4.41 6667

注意:至少需要 JDK 1.8

# yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64

2、安装

# git clone https://github.com/linkedin/ambry.git 
# cd ambry
# ./gradlew allJar
# 会生成target文件夹并编译生成jar包

3、服务端部署

# 新建目录(三台服务器操作相同)
# mkdir -p /data/ambry/{data,config,logs}
# 把所需配置文件移动到目录
# cp config/{frontend.properties,HardwareLayout.json,log4j.properties,PartitionLayout.json,server.properties,server.ssl.properties} /data/ambry/config/
# jar包
# cp target/ambry.jar /data/ambry/
3.1、配置文件
3.1.1、集群硬件配置
# egrep -v "^$|*#" HardwareLayout.json
{
    "clusterName": "my_ambry_cluster",  #自定义名字
    "version": 99,
    "datacenters": [
        {
            "dataNodes": [
                {
                    "disks": [
                        {
                            "capacityInBytes": 21474836480,
                            "hardwareState": "AVAILABLE",
                            "mountPath": "/app_server/ambry/data"
                        }
                    ],
                    "hardwareState": "AVAILABLE",
                    "hostname": "192.168.4.39",
                    "port": 6667
                },
                {
                    "disks": [
                        {
                            "capacityInBytes": 21474836480,
                            "hardwareState": "AVAILABLE",
                            "mountPath": "/app_server/ambry/data"
                        }
                    ],
                    "hardwareState": "AVAILABLE",
                    "hostname": "192.168.4.40",
                    "port": 6667
                },
                {
                    "disks": [
                        {
                            "capacityInBytes": 21474836480,
                            "hardwareState": "AVAILABLE",
                            "mountPath": "/app_server/ambry/data"
                        }
                    ],
                    "hardwareState": "AVAILABLE",
                    "hostname": "192.168.4.41",
                    "port": 6667
                }
            ],
            "name": "Datacenter",
            "id" : "1"
        }
    ]
}
3.1.2、集群逻辑分片配置
# egrep -v "^$|*#" PartitionLayout.json
{
    "clusterName": "my_ambry_cluster",  #自定义名字
    "version": 88,
    "partitions": [
        {
            "id": 0,
            "partitionClass": "max-replicas-all-datacenters",
            "partitionState": "READ_WRITE",
            "replicaCapacityInBytes": 10737418240,
            "replicas": [
                {
                    "hostname": "192.168.4.39",
                    "mountPath": "/app_server/ambry/data",
                    "port": 6667
                },
                {
                    "hostname": "192.168.4.40",
                    "mountPath": "/app_server/ambry/data",
                    "port": 6667
                },
                {
                    "hostname": "192.168.4.41",
                    "mountPath": "/app_server/ambry/data",
                    "port": 6667
                }
            ]
        }
    ]
}
3.1.3、集群日志配置
egrep -v "^$|*#" log4j.properties
注意:不做修改,使用原来的。
3.1.4、集群服务端配置
# egrep -v "^$|*#" server.properties 
host.name=192.168.4.39   #本机ip
clustermap.cluster.name=Ambry_Dev
clustermap.datacenter.name=Datacenter
clustermap.host.name=192.168.4.39   #本机ip
3.1.5、 数字证书集群配置

由于 集群配置必须要SSL连接 ,需要在每台服务器上生成数字证书
使用用Java自带的keystore生成数字证书。 Keytool是一个Java数据证书的管理工具。Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里
注意:需要记住文件位置以及密码(三台服务器操作相同)

# cd /data/ambry/config
# 输入完密码后,其他都可默认回车
# keytool -genkeypair -alias certificatekey -validity 7000 -keystore keystore.jks
# keytool -export -alias certificatekey -keystore keystore.jks -rfc -file selfsignedcert.cer
# keytool -import -alias certificatekey -file selfsignedcert.cer -keystore truststore.jks
# egrep -v "^$|*#" server.ssl.properties
host.name=192.168.4.39   #本机ip
clustermap.cluster.name=Ambry_Dev
clustermap.datacenter.name=Datacenter
clustermap.host.name=192.168.4.39     #本机ip
ssl.context.protocol=TLS
ssl.context.provider=SunJSSE
ssl.enabled.protocols=TLSv1.2
ssl.endpoint.identification.algorithm=HTTPS
ssl.client.authentication=required
ssl.keystore.type=PKCS12
ssl.keystore.path=/data/ambry/config/keystore.jks       #证书路径
ssl.keystore.password=gicloud
ssl.key.password=gicloud
ssl.truststore.path=/data/ambry/config/truststore.jks    #证书路径
ssl.truststore.password=gicloud
ssl.cipher.suites=

4、前端部署

4.1、前端配置文件
# egrep -v "^$|*#" frontend.properties
rest.server.blob.storage.service.factory=com.github.ambry.frontend.AmbryBlobStorageServiceFactory
router.hostname=192.168.4.39   #本机ip
router.datacenter.name=Datacenter
router.put.success.target=1
router.delete.success.target=1
clustermap.cluster.name=Ambry_Dev
clustermap.datacenter.name=Datacenter
clustermap.host.name=192.168.4.39   #本机ip
kms.default.container.key=B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF

5、启动

通过编写脚本的形式启动

# 服务端
# egrep -v "^$|*#" server.sh
#!/bin/bash
case $1 in
       start)
             nohup java -Dlog4j.configuration=file:./config/log4j.properties -jar ambry.jar --serverPropsFilePath ./config/server.ssl.properties --hardwareLayoutFilePath ./config/HardwareLayout.json --partitionLayoutFilePath ./config/PartitionLayout.json 1>> logs/server.log 2>> logs/server-error.log &
            ;;
        
        stop)
            pid=`ps -ef|grep ambry|grep -v grep |awk '{print $2}'`
            kill -9 $pid
            ;;
     restart)
            $0 stop
            sleep 2
            $0 start
            ;;
           *)
            echo "usage:$0 {start | stop | restart}"
            ;;
            
esac
# 前端
# egrep -v "^$|*#" frontend.sh
#!/bin/bash
case $1 in
       start)
            nohup java -Dlog4j.configuration=file:./config/log4j.properties -cp "*" com.github.ambry.frontend.AmbryFrontendMain --serverPropsFilePath ./config/frontend.properties --hardwareLayoutFilePath ./config/HardwareLayout.json --partitionLayoutFilePath ./config/PartitionLayout.json 1>> logs/frontend.log 2>> logs/frontend-error.log &
            ;;
        
        stop)
            pid=`ps -ef|grep frontend|grep -v grep |awk '{print $2}'`
            kill -9 $pid
            ;;
     restart)
            $0 stop
            sleep 2
            $0 start
            ;;
           *)
            echo "usage:$0 {start | stop | restart}"
            ;;
            
esac

6、测试

6.1、确保前端可以接受请求
# curl http://localhost:1174/healthCheck
GOOD
6.2、上传
# curl -i -H "x-ambry-blob-size : `wc -c demo.gif | xargs | cut -d" " -f1`" -H "x-ambry-service-id : CUrlUpload"  -H "x-ambry-owner-id : `whoami`" -H "x-ambry-content-type : image/gif" -H "x-ambry-um-description : Demonstration Image" http://localhost:1174/ --data-binary @demo.gif
HTTP/1.1 201 Created
Location: AmbryID
Content-Length: 0

curl命令创建一个请求,其中包含 demo.gif 中的二进制数据。与文件数据一起,我们提供充当 blob 属性的标头。其中包括 Blob 的大小、服务 ID、所有者 ID 和内容类型。
除了这些属性之外,Ambry 还提供了任意用户定义的元数据。我们提供用户元数据。Ambry 不解释此数据,它纯粹是用于用户注释。响应中的标头是我们刚刚上载的 Blob 的 blob ID。

6.3、验证
# curl -i http://localhost:1174/AmbryID/BlobInfo
HTTP/1.1 200 OK
x-ambry-blob-size: {Blob size}
x-ambry-service-id: CUrlUpload
x-ambry-creation-time: {Creation time}
x-ambry-private: false
x-ambry-content-type: image/gif
x-ambry-owner-id: {username}
x-ambry-um-desc: Demonstration Image
Content-Length: 0
6.4、获取
# curl http://localhost:1174/AmbryID > demo-downloaded.gif
# diff demo.gif demo-downloaded.gif
6.5、删除

Ambry 是一个不可变存储,无法更新 Blob,但可以删除它们,以便使其不可恢复 。

# curl -i -X DELETE http://localhost:1174/AmbryID
HTTP/1.1 202 Accepted
Content-Length: 0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容