自学内容网 自学内容网

python对weedfs的操作

1、weedfs的简介

如果你对weed储存有一定的理解也可以忽略

WeedFS(Weed File System)是一个开源的分布式文件系统,由Go语言编写,旨在解决海量文件存储和访问的问题。它采用了类似于Hadoop HDFS的分布式文件系统架构,但具有更高的性能和更简单的设计。
​
WeedFS的主要特点包括:
​
1. 高可靠性:WeedFS采用多副本存储和数据校验等技术,确保数据的可靠性和一致性。
​
2. 高性能:WeedFS支持快速的文件上传、下载和访问,能够处理大规模的文件存储和访问需求。
​
3. 易于扩展:WeedFS支持简单的横向扩展,可以轻松地添加新的节点和存储设备。
​
4. 简单易用:WeedFS的设计简单、易于使用,可以快速地部署和配置。
​
5. 多语言支持:WeedFS提供了多种编程语言的客户端库,包括Go、Java、Python等。
​
WeedFS的架构主要包括:
​
1. Master:主节点,用于管理整个集群的状态和元数据信息。
​
2. Volume:存储节点,用于存储文件和元数据信息。
​
3. Filer:文件元数据管理节点,用于管理文件元数据信息。
​
4. Client:客户端,用于上传、下载、删除和访问文件。
​
WeedFS的应用场景包括:
​
1. 大规模文件存储:WeedFS能够处理大规模的文件存储需求,适用于图片、视频、音频等文件的存储和访问。
​
2. 分布式文件系统:WeedFS采用分布式的架构,能够快速地扩展和部署,适用于分布式文件系统的构建和管理。
​
总之,WeedFS是一个高可靠性、高性能、易于扩展的分布式文件系统,适用于大规模文件存储和分布式文件系统的构建和管理。

这是我的weed配置文件

kafka:
  brokers: 'kafka46:9092,kafka47:9092,kafka48:9092,kafka49:9092'
  zookeeper_hosts: 'kafka46:2181,kafka47:2181,kafka48/kafka'
  topic: srvdbMessage
  group_id: message_to_srvdb-20210810165601
  # 初始kafka消费偏移: smallest - 从最早消费; largest - 从最新消费
  offset_reset: largest

2、python对weedfs的储存操作

储存数据传入的是图片二进制数据,返回的是图片的储存地址(URL)

#人脸的weed存储位置,需要填写所有的人脸weed主节点
weed:
    host:
        - 192.168.0.1:9333

【代码实例】

from logging.handlers import RotatingFileHandler
import time
import requests
import random
import logging
config = {"weed":{"host":["192.168.0.1:9333"]}}
​
​
​
def save_image_to_url(img_data):
    """
    img_data:图片二进制数据
    return:图片的url
    """
    global weed_server
    image_url = ''
    ttl = '3M'#默认保存三个月,y是年
    # ttl = config['worker']['face_weed']['ttl']
    # 遍历存储weed
    try:
        while 1:
            # 查找可用的weed集群
            available_weed_server = []
            for weed_ser in weed_server:
                if weed_ser['status'] == 1:
                    available_weed_server.append(weed_ser)
            # logging.info(available_weed_server)
            if available_weed_server:
                # 随机找一个weed节点
                face_weed = random.choice(available_weed_server)
                try:
                    weed_url = 'http://' + face_weed['url'] + '/dir/assign?ttl=' + ttl
                    # weed_url = 'http://1.1.1.1:9333/dir/assign'
                    r = requests.post(weed_url, data={}, timeout=10)
                    if r.status_code == requests.codes.ok:
                        arr_data = r.json()
                        files = {'file': ('image.jpg', img_data)}
                        # logging.info(len(img_data))
                        res = requests.post(arr_data['publicUrl'] + arr_data['fid'], files=files, timeout=10)
                        if res.status_code == 201:
                            image_url = ''.join([arr_data['publicUrl'], arr_data['fid'], '.jpg'])
                            # 重置错误统计信息
                            weed_server[face_weed['k']]['error_num'] = 0
                            break
                        else:
                            logging.error('保存驾乘人脸图片到人脸weed集群时错误')
                            weed_server[face_weed['k']]['error_num'] += 1
                            if weed_server[face_weed['k']]['error_num'] >= weed_server_error_num:
                                logging.warning("错误次数大于指定次数,停用weed: %s", weed_server[face_weed['k']]['url'])
                                weed_server[face_weed['k']]['status'] = 0
                    else:
                        logging.error('申请weed存储时错误')
                        weed_server[face_weed['k']]['error_num'] += 1
                        if weed_server[face_weed['k']]['error_num'] >= weed_server_error_num:
                            logging.warning("错误次数大于指定次数,停用weed: %s", weed_server[face_weed['k']]['url'])
                            weed_server[face_weed['k']]['status'] = 0
                except Exception as e:
                    logging.error('调用weed集群时错误: %s', str(e))
                    weed_server[face_weed['k']]['error_num'] += 1
                    if weed_server[face_weed['k']]['error_num'] >= weed_server_error_num:
                        logging.warning("错误次数大于指定次数,停用weed: %s", weed_server[face_weed['k']]['url'])
                        weed_server[face_weed['k']]['status'] = 0
            else:
                logging.error("无可用weed,请检查weed程序运行情况,存储原始图片地址!")
                time.sleep(1)
    except Exception as e:
        logging.exception('save image error:{}'.format(str(e)))
        return None
    return image_url
​
if __name__ == '__main__':
    name = 'test_weed'
    logging.basicConfig(level=logging.DEBUG)
    handler = RotatingFileHandler('/var/log/%s.log' % name, maxBytes=134217728, backupCount=7)
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(lineno)d - %(message)s')
    handler.setFormatter(formatter)
    logging.getLogger().addHandler(handler)
    weed_server = []
    weed_server_error_num = 10
    k = 1
    for face_weed in config['face_weed']['host']:
        t = dict()
        t['url'] = face_weed
        t['error_num'] = 0  # 错误次数,连续失败时才会记录
        t['status'] = 1  # weed状态,1正常,0不可用
        t['k'] = k
        k += 1
        weed_server.append(t)

原文地址:https://blog.csdn.net/wu73guang5jian/article/details/142876888

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!