golang ceph客户端操作
首先需要导入依赖
go get gopkg.in/amz.v1/aws go get gopkg.in/amz.v1/s3
1. 初始化ceph连接
在初始化连接之前,我们需要创建一个用户得到accessKey和secretKey,新增用户的指令如下:
docker exec ceph-rgw radosgw-admin user create --uid="test" --display-name="test user"
下面就是初始化ceph客户端的操作,和一些数据库的连接一样的,都是授权+地址:
func init() { auth := aws.Auth{ AccessKey: accessKey, SecretKey: secretKey, } region := aws.Region{ Name: "default", EC2Endpoint: url, // "http://<ceph-rgw ip>:<ceph-rgw port>" S3Endpoint: url, S3BucketEndpoint: "", // Not needed by AWS S3 S3LocationConstraint: false, // true if this region requires a LocationConstraint declaration S3LowercaseBucket: false, // true if the region requires bucket names to be lower case Sign: aws.SignV2, } CephConn = s3.New(auth, region) }
下面是针对ceph的一些简单操作,因为项目原因只需要一些文件上传下载的操作,其他操作可以参见amz.v1的doc
2. 获取一个桶
func GetCephBucket(bucket string) *s3.Bucket { return CephConn.Bucket(bucket) }
3. 将本地文件上传到ceph的一个bucket中
func put2Bucket(bucket *s3.Bucket, localPath, cephPath string) (*s3.Bucket, error) { err := bucket.PutBucket(s3.PublicRead) if err != nil { log.Fatal(err.Error()) return nil, err } bytes, err := ioutil.ReadFile(localPath) if err != nil { log.Fatal(err.Error()) return nil, err } err = bucket.Put(cephPath, bytes, "octet-stream" , s3.PublicRead) return bucket, err }
4. 从ceph下载文件
func downloadFromCeph(bucket *s3.Bucket, localPath, cephPath string) error { data, err := bucket.Get(cephPath) if err != nil { log.Fatal(err.Error()) return err } return ioutil.WriteFile(localPath, data, 0666) }
5. 删除指定的文件
func delCephData(bucket *s3.Bucket, cephPath string) error { err := bucket.Del(cephPath) if err != nil { log.Fatal(err.Error()) } return err }
6. 删除桶
删除桶时要保证桶内文件已经被删除
func delBucket(bucket *s3.Bucket) error { err := bucket.DelBucket() if err != nil { log.Fatal(err.Error()) } return err }
7. 批量获取文件信息
func getBatchFromCeph(bucket *s3.Bucket, prefixCephPath string) []string { maxBatch := 100 // bucket.List() 返回桶内objects的信息,默认1000条 resultListResp, err := bucket.List(prefixCephPath, "" , "" , maxBatch) if err != nil { log.Fatal(err.Error()) return nil } keyList := make([]string, 0) for _, key := range resultListResp.Contents { keyList = append(keyList, key.Key) } return keyList }
8. 测试
编写一个main.go来测试这些接口,尝试上传和下载一个文件
func main() { bucketName := "bucket_test" filename := "C:\\Users\\dell\\Desktop\\ieee.jpg" cephPath := "/static/default/bucket_test/V1/" + "ieee_ceph.jpg" // 获取指定桶 bucket := GetCephBucket(bucketName) // 上传 bucket, err := put2Bucket(bucket, filename, cephPath) if err != nil { return } // 下载 localPath := "C:\\Users\\dell\\Desktop\\download.jpg" err = downloadFromCeph(bucket, localPath, cephPath) if err != nil { return } // 获得url url := bucket.SignedURL(cephPath, time.Now().Add(time.Hour)) fmt.Println(url) // 批量查找 prefixCephpath := "static/default/bucket_test/V1" lists := getBatchFromCeph(bucket, prefixCephpath) for _, list := range lists { fmt.Println(list) } // 删除数据 delCephData(bucket, cephPath) // 删除桶 delBucket(bucket) }
9. 上传ceph的简单优化
选择将本地服务器文件上传ceph应该是异步操作,无论是采用chan通知一个上传的协程还是晚上的定时任务
异步任务的操作可以选择简单的chan,或者使用消息队列,如果吞吐量大的情况下就要使用rabbitmq等消息中间件了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理