美文网首页
分布式对象存储Ambry集群部署

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

作者: 苏米西 | 来源:发表于2019-12-17 21:00 被阅读0次

    一、简介

    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
    

    相关文章

      网友评论

          本文标题:分布式对象存储Ambry集群部署

          本文链接:https://www.haomeiwen.com/subject/xwmenctx.html