RDS搭配OSS实现多结构数据存储

RDS可以和OSS搭配使用,组成多类型数据存储解决方案。

OSS是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。RDS可以和OSS搭配使用,例如当业务应用为论坛时,RDS搭配OSS使用,注册用户的图像、帖子内容的图像等资源可以存储在OSS中,以减少RDS的存储压力。

代码示例

OSS与RDS搭配使用示例,基于Python 3.6编写。

OSS Python SDK安装指导,请参见Python安装

  1. 初始化oss2.Bucket类。

     # !/usr/bin/env python
    import oss2
    
    # 阿里云账号AccessKey拥有所有API的访问权限,风险很高。建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
    
    # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = 'yourEndpoint'
    
    # 填写Bucket名称。
    bucket = oss2.Bucket(auth, endpoint, 'examplebucket')                    
    
  2. 上传Object。

    # 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
    # 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    # 上传info_old.txt文件对象
    res1 = bucket.put_object_from_file("info_key.txt", "info_old.txt")
    print("res1-{0}".format(res1.status))
        
    # 上传picture_old.png图片对象
    res2 = bucket.put_object_from_file("picture_key.png", "picture_old.png")
    print("res3-{0}".format(res2.status))
  3. 获取对应Object。

    # 填写Object完整路径,完整路径中不包含Bucket名称,例如info_key.txt。
    # 下载Object到本地文件,并保存到指定的本地路径D:\\info_new.txt。如果指定的本地文件存在,则会覆盖该文件,不存在则新建文件。
    res3 = bucket.get_object_to_file("info_key.txt", "D:\\info_new.txt")
    print("res2-{0}".format(res3.status))
    
    res4 = bucket.get_object_to_file("picture_key.png", "D:\\picture_new.png")
    print("res4-{0}".format(res4.status))

ECS应用代码中,RDS中存储了每个用户的id,而用户对应的头像资源存储于OSS中,以简单的Python代码为例:

# !/usr/bin/env python
import oss2
import mysql_client

def conn_client():
    auth = oss2.Auth('LTAI5tLNak1sYu8g9UT*****', 'Lyn9YLbmfQYQBgdNJAupawSHT*****')
    endpoint = "oss-cn-hangzhou.aliyuncs.com"
    bucket = oss2.Bucket(auth, endpoint, 'oss-wwjtest')

    user_id = mysql_client.fetch_one(sql)  # 从RDS中查找用户的user_id
    # 获取用户头像并下载到对应路径
    bucket.get_object_to_file(object, your_path/user_id + '.png')
    # 处理用户上传头像
    bucket.put_object_from_file(object, your_path/user_id + '.png')

if __name__ == '__main__':
    conn_client()