Gluster容器持久化存储方案

浏览02019-05-14 23:01:57 3

       存储作为存放前端业务的关键数据,在金融、广电、政府、军工行业广泛使用。容器是一种轻量级云计算技术,相比虚拟化,在保证业务安全隔离的同时,减少了操作系统消耗的额外资源,数百倍扩展业务种类。这里重点推荐并深入剖析K8S+Gluster容器持久化存储解决方案。

//

一、K8S+Gluster容器存储方案概述

//

K8S+GlusterFS容器存储方案,是将开源K8S集群管理系统与开源GlusterFS分布式文件存储系统结合的实践方案。K8S+GlusterFS容器存储方案通过全面分析K8S与GlusterFS产品的功能、性能、特点,有效降低K8S产品选择存储的复杂度。将K8S与GlusterFS两个产品有效结合各取所长,在功能、性能、高可用、成本等方面,能够更好地满足产品业务需求。

Kubernetes(简称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。K8S既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等功能,提高了大规模容器集群管理的便捷性。

GlusterFS是一款可横向扩展的开源分布式存储文件系统。支持NAS访问协议及对象存储功能,可实现数PB级的海量存储规模、性能可线性增长。GlusterFS可实现动态的容量及性能扩展、卓越的系统高可用性;可构建大规模、高性能、动态可扩展的共享存储架构。广泛应用于海量媒体、医疗、金融、高性能计算及共享、备份归档等领域,为各行业用户构建高弹性、高可靠、高性能、具备完整企业级服务的分布式文件存储平台。

//
二、存储方案架构设计
//

K8S容器存储具备多种选择方案,访问协议支持较多。包括DAS、NASSAN,以及新兴分布式存储技术,典型代表有GlusterFS和CephFS。Hostpath是K8S使用本地存储的基本形式,具有使用简单、便捷、易用等特性。但由于其本身不具备冗余特性,存在单点故障风险,因此在生产环境中使用较少。

K8S存储常用于存放容器应用数据,综合功能、安全、性能考虑,主要使用文件存储。GlusterFS作为软件定义的分布式文件存储,具有高性能、高可用、高稳定的特性。在功能、性能、安全等方面满足K8S业务需求,被公认为K8S的原生存储。

K8S+GlusterFS超融合架构具有低成本、紧耦合优势。与传统存储相比,具备更好兼容性的同时,无需额外的硬件资源,直接将GlusterFS存储服务运行在K8S容器中,既实现计算与存储超融合部署,又分开管理,提高硬件资源利用率的同时,保证数据安全性与高可靠性,这种自给自足的方案架构成为K8S的首选。

图1.png

K8S+GlusterFS容器存储方案建议4节点起配,配置1管理节点和3工作节点的K8S集群,并在所有K8S节点中部署GlusterFS存储容器,运行GlusterFS相关服务,提供共享文件存储。Heketi是GlusterFS容器集群的管理工具,K8S集群可通过Heketi工具自动进行GlusterFS集群的相关配置。并借助StorageClass实现PV的动态创建以响应PVC请求。

K8S+GlusterFS架构具有如下优势:

  • 在线弹性扩容

  • 存储访问高可用

  • 容器业务高可用

  • 自动化智能管理

  • 提升资源利用率

  • 有效降低成本


2.1 K8S架构

K8S提供了面向应用的容器集群部署和管理系统。K8S消除编排物理与虚拟计算、网络和存储基础设施的负担,使管理员将重点放在以容器为中心的原语上进行自助运营。K8S 也提供稳定、兼容的基础,用于构建定制化的工作流和更高级的自动化任务。K8S是分布式系统支撑平台,具有完备的集群管理能力,包括多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。K8S具有高度自动化管理特性,能够自动部署、自动重启、自动复制、自动伸缩扩展。且具有较强的快速部署和快速扩展特性,支持无缝对接新的应用功能,节省资源,优化硬件资源的使用。


图2.png


K8S集群中有管理节点与工作节点两种类型。管理节点主要负责K8S集群管理,集群中各节点间的信息交互、任务调度,还负责容器、Pod、NameSpaces、PV等生命周期的管理。工作节点主要为容器和Pod提供计算资源,Pod及容器全部运行在工作节点上,工作节点通过kubelet服务与管理节点通信以管理容器的生命周期,并与集群其他节点进行通信。

K8S核心组件主要如下:

  • etcd保存了整个集群的状态,运行在集群管理节点,可实现管理节点高可用

  • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制

  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上

  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理

  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI)

  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡

Master节点

K8S master 节点管理K8S集群环境,提供与用户交互的接口,并负责集群节点间的信息交互和任务调度,以及容器生命周期的管理。运行组件有:kube-apiserver、kube-scheduler、kube-controller-manager。

图3.png                                          

Work节点

K8S work节点运行组件有:docker、kubelet、kube-proxy。所有容器运行在docker组件上,工作节点上的docker服务为容器提供计算资源。Kubelet负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。

图4.png


2.2 K8S存储系统

      存储是K8S系统中最重要的组成部分,存放着容器运行的所有数据。因此,选择安全可靠的存储系统至关重要。K8S存储系统主要有四层逻辑概念:Volume、PersistentVolume   (PV)、PersistentVolumeClaim(PVC)、StorageClass,是K8S中存储系统的核心内容。K8S存储系统根据业务需求,可归纳为无状态服务、有状态服务及有状态的集群服务。无状态服务无法保存状态数据,Pod重启后会造成原有数据丢失。而有状态服务和有状态集群服务可以保持容器状态数据,确保Pod重启后能够保存原有数据信息。

                     

图5.png

  • Volumes是最基础的存储抽象,支持多种类型,可归纳为本地存储、网络存储、其他存储三类。常见的有HostPath、NFS、FC、GlusterFS、CephFS等,也支持特定存储的自定义插件。本地存储使用简便,但移植性、扩展能力、安全性较弱,生产环境使用较少。网络存储作为K8S存储的重点,常用方式有GlusterFS、CephFS和NFS,不仅具有出色的性能表现、易于扩展,且支持副本和纠删码等多种冗余方式保护数据安全,多用于生产环境。

    K8S集群中的Volume的生命周期和作用范围是Pod,可按服务状态分为普通卷和持久卷(PV)。普通卷常用Pod所在K8S节点的本地目录,典型存储类型为hostpath。普通卷依赖于Pod创建,由于不是独立的K8S资源对象,因此无Pod时无法单独创建普通卷。而永久卷PV是独立的K8S资源对象,支持无Pod时单独创建PV,却无法和Pod直接发生关系,而是通过PVC来实现关系绑定。

  • PersistentVolume(PV) 是K8S集群中由管理员配置的存储,是集群中的资源对象。PV是类似卷的卷插件,其生命周期独立于pod。PV与普通Volume区别在于PV是K8S中的资源对象,存放Pod数据且保证Pod重启后数据不丢失的持久卷,可单独存活,管理员无需创建Pod就可以创建独立的PV,PV资源的使用通过PVC来请求。

    PV的访问模式有三种:ReadWriteOnce是最基本的方式,只能被单个Pod读写访问;ReadOnlyMany可被多个Pod以只读模式挂载;ReadWriteMany是高级访问模式,可被多个Pod以读写的方式共享。但只有少数存储支持ReadWriteMany,比较常用的是NFS、GlusterFS。PV的回收机制有三种:Retain机制允许人工处理保留的数据;Delete机制会删除PV和外部关联的存储资源。Recycle机制只执行清除操作,之后PV可以被新的PVC使用。

  • PersistentVolumeClaim(PVC)是用户对存储资源PV的请求,PV与PVC有静态和动态两种绑定模式。默认为静态模式,即用户发出PVC请求后,需管理员手动创建PV以响应PVC请求。否则PVC一直处于等待状态,直到管理员手动创建PV后请求完成。动态模式需要借助StorageClass完成。在PVC绑定PV时通常根据存储大小和访问模式两个条件来绑定。

  • StorageClass为管理员提供描述存储类型的方法。默认情况下,管理员需要手工创建用户所需的存储资源PV以响应PVC请求。利用StorageClass动态容量供给的功能,可实现自动创建PV的能力。即用户PVC发出请求后,由StorageClass自动创建PV响应PVC请求,减少管理员手动创建的复杂性和存储资源响应的繁琐流程。

2.3 GlusterFS架构

GlusterFS  (Gluster File System)  是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量,处理数千客户端。GlusterFS 借助 TCP/IP 或  InfiniBand RDMA 网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS  基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。GlusterFS  支持POSIX、NFS、CIFS、FTP等多种NAS方式访问,与业务对接具有良好的兼容性与极高的性能。GlusterFS  无需独立的元数据服务器,这种无元数据中心的架构对于提升整个系统的性能、可靠性和稳定性都有着决定性的意义。

图6.png

GlusterFS无论是FUSE还是NFS接口,都支持多客户端同时读写访问,以满足K8S环境中多个Pod同时挂载GlusterFS共享卷进行ReadWriteMany高级需求。块存储具有不支持多个客户端同时读写的自身缺陷,传统集中式NAS存储又面临着成本高、无法扩展、性能等瓶颈。而Ceph产品主要应用场景为分布式块存储业务,CephFS虽然表现良好,但官方不推荐在生产环境使用CephFS。因此,综合成本、扩展性、兼容性、稳定性、安全和性能考虑,GlusterFS无疑作为K8S存储的最佳选择。

2.4 方案特点

  • MultiPlexing管理

GlusterFS的MultiPlexing功能,使单个进程可以管理该节点内所有brick,解决了GlusterFS中创建共享卷数量受到局限的弊病,满足K8S中创建更多PV的业务需求。GlusterFS默认方式为每个brick对应一个进程且占用一个端口,创建更多的共享卷意味着创建更多的brick,随着brick数据量增加会导致系统运行负载压力增大,降低整体性能和系统稳定性,因此只能创建少量共享卷。而MultiPlexing功能使单个进程管理该节点内所有brick,所有brick只占用一个线程和端口,为跨卷的I\O调度提供更大的灵活性。提升了K8S业务访问性能,降低资源消耗、减少端口和内存占用,优化资源管理能力并提高系统稳定性。

  • Block存储功能

Gluster卷提供基于iSCSI目标的块存储。可将Gluster卷中的文件模拟为块设备,通过TCMU导出iSCSI。Block块存储的数据访问提供高性能的随机I/O和数据吞吐率,具有高带宽、低延迟的优势,在高性能计算中效果显著。且解决了传统SAN存储的价格高、可扩展性差的问题。

  • 兼容S3对象存储

Gluster不仅支持POSIX、CIFS、NFS、FTP等常用NAS访问接口,以微服务方式运行在容器中的Gluster还兼容S3对象存储访问,Gluster-S3容器可提供S3访问接口。S3对象存储不会有多个层级结构,每个对象在存储池的扁平地址空间的同一级别里,具备智能、自我管理能力,通过Web服务协议实现对象的读写和存储资源的访问。

对象存储这种扁平化的数据结构扩展性极强。支持对象存储容量扩展,管理高达数百亿个存储对象,支持从Byte到TB范围内的任意大小对象,解决了文件系统复杂的iNode机制带来的扩展性瓶颈,也无需像SAN存储那样管理数量庞大的逻辑单元号。具有数据保护级别、保留期限、合规状况、远程复制的份数等基于策略的自动化管理能力。可对多租户和多应用设置相应策略,并对各自的数据保护隔离。对象存储系统通过连续进行后台数据扫描、数据完整性校验、自动化对象修复任务,有效提高数据完整性和安全性。

  • 数据分片

Gluster支持Sharding特性,以实现数据分片功能。将K8S卷较大的数据文件进行切片,分割成若干个较小的数据块,并将这些较小的数据块平均分配到集群中所有的brick上,突破了单个brick性能和容量的局限。较小的数据块更容易复制和迁移,可以更快的完成数据写入,有效提高读写性能,切片后K8S客户端文件的大小和读写性能将不受单个brick的容量与IO限制,使容量负载更加均衡。

  • 容器化部署

Gluster支持容器化部署,以微服务方式运行在K8S容器中。同其他普通应用一样使用容器资源,并与各应用相互隔离,实现PaaS层的超融合架构,为K8S提供归档和备份,用途广泛,灵活多变。利用容器的部署方式使Gluster安装更加快速高效,降低了使用过程中的管理难度,良好的兼容性和轻量特性易于实现负载的动态管理,方便后期的快速扩容。

  • Heketi管理

Heketi是K8S自动管理Gluster卷生命周期的RESTful管理工具,允许以编程方式访问常用的GlusterFS卷管理任务,K8S可通过Heketi按需动态创建和删除Gluster卷。Heketi会自动选择创建卷所需的brick,确保副本数据会分散到集群不同的故障域内,Heketi能够同时管理多个Gluster集群,可更换、移除设备及节点。具有轻量、简单、可靠的特性。

  • TSL/SSL加密

GlusterFS通信支持TLS和SSL加密保护。TLS提供身份验证和加密,不提供授权,但GlusterFS可以使用TLS认证的身份来授权到卷的客户端连接。关于GlusterFS中TLS的使用,如果有GlusterFS节点被配置为使用TLS,那么所有GlusterFS节点必须全部使用。使用TLS认证后无法自动回退到非TLS通信,也无法对同一资源进行并发TLS和非TLS访问,因为两者都不安全。任何这样的“混合模式”连接都将被TLS使用方拒绝,从而牺牲了维护安全性的可用性。

图7.jpg

//
三、快速部署
//


Kubernetes部署支持多种方式。包括:二进制、kubeadm、minikube、ansible、yum方式等。二进制方式为手动安装,部署过程繁琐。本次采用kubeadm自动化工具安装,简单快速。

3.1 主机环境准备

本次测试基于CentOS7.5操作系统。要求CPU、内存、磁盘、IP规划如表所示。

表1.jpg

相关软件版本信息如表所示。

表2.jpg

3.2 安装软件

设置所有节点最新版Kubernetes、docker的yum源,关闭swap、selinux、firewalld,设置hosts域名解析。所有节点安装kubelet、kubeadm、kubectl、docker-ce。

yum install -y kubelet kubeadm kubectl docker-ce

管理节点下载需要使用的镜像

kubeadm config images pull --config kubeadm.conf

3.3 配置集群

镜像下载完成后,需要用kubeadm工具在Master节点初始化集群,并配置calico网络,完成后所有node节点加入集群,即完成Kubernetes环境的集群配置。

Master节点初始化

kubeadm init--kubernetes-version=v1.13.0 --pod-network-cidr=172.22.0.0/16 --apiserver-advertise-address=192.168.3.80

      所有node节点执行命令加入Kubernetes集群

kubeadm join 192.168.3.80:6443--tokendglf3r.sci7jw9au0dlurkj --discovery-token-ca-cert-hash sha256:387a21bd4f2ad2d53c02c0995399325f496d8a34a3e4bd49b1744df32255821e

查看集群,返回结果列出所有的集群节点,状态为“Ready”,说明集群正常。

# kubectl get nodesNAME     STATUS   ROLES    AGE   VERSIONmaster   Ready     master   9d    v1.13.1node1    Ready    <none>   9d    v1.13.1node2    Ready    <none>   9d    v1.13.1node3    Ready    <none>   9d    v1.13.1

3.4 GlusterFS部署

使用GlusterFS容器化部署方式,搭建Kubernetes+GlusterFS超融合环境。下载heketi-client文件,并给部署GlusterFS的节点打上标签,之后部署GlusterFS。

wget https://github.com/heketi/heketi/releases/download/v8.0.0/heketi-client-v8.0.0.linux.amd64.tar.gztar xvf heketi-client-v8.0.0.linux.amd64.tar.gz cd heketi-client/share/heketi/kubernetes/kubectl create -f glusterfs-daemonset.json

3.5 管理Heketi及StorageClass

Heketi是GlusterFS集群的管理工具,StorageClass自动创建PV以响应PVC请求。部署heketi管理工具,并同步topology-sample.json文件完成GlusterFS集群初始化。参考官方文档生成gluster-storage-class.yaml文件创建StorageClass。

kubectl create -f heketi-bootstrap.jsonkubectl port-forward  deploy-heketi-8465f8ff78-sb8z 8080:8080curl http://localhost:8080/helloheketi-cli topology load --json=topology-sample.json

3.6 创建pod测试

Pod是K8s集群中所有业务类型的基础,创建PVC查看能否自动创建PV,PVC中指定StorageClass,之后创建Pod绑定PVC,Pod文件中指定刚刚创建的PVC。

kubectl create -f glusterfs-pvc.yamlkubectl create -f heketi-nginx.yaml


//
四、最 佳 实 践
//

4.1 K8S+GlusterFS超融合

K8S+GlusterFS超融合架构,将GlusterFS软件部署在K8S容器中,以微服务的方式运行GlusterFS,保证GlusterFS服务与其他应用相互隔离运行,并可通过K8S容器的副本方式保证每个GlusterFS容器的高可用。用Heketi工具管理GlusterFS集群,可动态进行GlusterFS节点、磁盘、集群、共享卷的配置,StorageClass可动态创建PV以响应PVC请求,无需管理员手动参与,增加管理的便捷性。

GlusterFS与Heketi工具服务都运行在K8S容器中,K8S以GlusterFS的FUSE原生接口对接访问,具有更好的性能与高可用特性。配置好完整的K8S+GlusterFS超融合集群和Heketi管理工具,可用Heketi管理命令配置GlusterFS集群,包括节点添加、磁盘初始化等操作。配置StorageClass可实现动态创建PV持久卷,即用kubectl创建PVC,可查看到相应的PV也被直接创建,之后创建Pod绑定该PVC即可实现容器访问GlusterFS共享卷。此种模式不仅支持K8S存储访问的ReadWriteOnce和ReadOnlyMany,而且支持高级模式ReadWriteMany。相比其他架构方案,能够更自动化的管理、更强的访问兼容、更高的读写性能、更快速的在线扩容。

4.2 常规管理命令

  • Kubectl命令

1.创建pod命令

kubectl create -f heketi-nginx.yamlpod/nginx1 created

创建pv、pvc、StorageClass操作命令与创建pod相同,区别在于yaml配置文件内容。

2.查看pod命令,可用kubectl get pods –o wide 命令查看运行节点及ip地址。

# kubectl get podsNAME                             READY    STATUS    RESTARTS   AGEcentos-nginx-7c49d74966-bnwhk   1/1     Running    0          11dcentos-nginx-7c49d74966-m8vsz   1/1     Running    0          11dcentos-nginx-7c49d74966-mn4hk   1/1     Running    0          11ddeploy-heketi-77745f8c4-lqw7l   1/1     Running    0          12dglusterfs-jl9xw                  1/1     Running    4          13dglusterfs-nlc4k                  1/1     Running    1          18d

3.查看命名空间

# kubectl get namespaceNAME          STATUS   AGEdefault       Active   20dkube-public   Active   20dkube-system   Active   20d

4.查看pvc信息

# kubectl get pvcNAME       STATUS   VOLUME                                      CAPACITY   ACCESS MODES   STORAGECLASS     AGEgluster3   Bound    pvc-7a0dbb51-1a0f-11e9-8c71-005056a0faaa    8Gi        RWX            gluster-heketi   11d

5.查看pv信息

#kubectl get pvNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS     REASON   AGEpvc-7a0dbb51-1a0f-11e9-8c71-005056a0faaa   8Gi        RWX            Delete           Bound    default/gluster3   gluster-heketi            11d

6.进入容器glusterfs-46smb操作系统

# kubectl exec -it glusterfs-46smb /bin/bash
  • Heketi命令

1.集群操作

#列出集群# heketi-cli cluster listClusters:Id:9a8991d67f1382fab9708c12646793d1 [file][block]#查看集群信息# heketi-cli cluster info 9a8991d67f1382fab9708c12646793d1#查看集群拓扑# heketi-cli topology info 9a8991d67f1382fab9708c12646793d1

2.节点信息

# heketi-client/bin/heketi-cli node listId:42e629a9061b2857bd28534bb2fcae92Cluster:9a8991d67f1382fab9708c12646793d1Id:4ffb8d6876221b09f94e54b2a8c09e46Cluster:9a8991d67f1382fab9708c12646793d1Id:5c7da2e54ceeae5799e634b7f3048808Cluster:9a8991d67f1382fab9708c12646793d1

3.创建5G卷

# heketi-cli volume create --size=5

4.创建5G存储块卷

# heketi-client/bin/heketi-cli volume create --size 5 –block

4.3 集群性能优化

集群性能优化可以从多方面着手,包括操作系统优化、GlusterFS优化、硬件优化、xfs文件系统优化等。硬件优化相对简单,可以采用更高配置的CPU,加大内存,提高网络带宽,用SSD提高IO性能。xfs文件系统并非性能瓶颈,优化xfs对整体性能提升较小。操作系统和GlusterFS是影响集群性能的关键部分,需要优化的重点对象。

  • GlusterFS存储优化

限制指定 volume 的配额,配额容量建议小于卷可用容量85%

gluster volume quota <VOLNAME> enablegluster volume quota <VOLNAME> limit-usage / 1TB

设置 cache 大小, 默认32MB

gluster volume set <VOLNAME> performance.cache-size 4GB

设置 io 线程, 太大会导致进程崩溃

gluster volume set <VOLNAME> performance.io-thread-count 16

设置网络检测时间默认42s

gluster volume set <VOLNAME> network.ping-timeout 10

设置写缓冲区的大小, 默认1M

gluster volume set <VOLNAME> performance.write-behind-windowsize 1024MB

开启mulplexing

gluster volume set <VOLNAME> cluster.brick-multiplex on

开启切片功能

gluster volume set <VOLNAME> features.shard enable

启用元数据缓存以提高目录操作的性能。

gluster volume set <VOLNAME> group metadata-cache

并发读取目录信息

gluster volume set <VOLNAME> performance.read-ahead ongluster volume set <VOLNAME> performance.rda-cache-limit 1GBgluster volume set <VOLNAME> performance.parallel-readdir on

关闭eager-lock,用以解决多个进程访问同一目录时速度变慢问题

gluster volume set <VOLNAME> cluster.eager-lock offgluster volume set <VOLNAME> disperse.eager-lock off

判断文件存在与否操作性能优化

gluster volume set <VOLNAME> cluster.lookup-optimize on

防止文件显示不全

gluster volume set <VOLNAME> cluster.lookup-unhashed ongluster volume set <VOLNAME> cluster.readdir-optimize off
  • 系统优化

系统参数优化较多且对性能优化明显,既手动更改相关参数进行调整配置。也可以使用相关优化工具进行一键优化,建议使用tuned工具配置throughput-performance策略优化性能。调整完成后可用tuned-adm list 命令查看当前策略。

yum install tuned-utilstuned-adm profile throughput-performance


//
五、系 统 验 证
//


表3.jpg

//
六、总      结
//

K8S+GlusterFS超融合架构,将GlusterFS部署在K8S容器中提供存储资源,并使用Heketi自动化工具管理GlusterFS集群,配置StorageClass创建PV以动态响应PVC请求,使K8SGlusterFS进行深度融合,具有良好的兼容性。GlusterFS支持K8S的高级读写模式ReadWriteMany,允许多个POD同时进行读写访问,功能上完全符合K8S读写需求。GlusterFS具有副本与纠删码等多种数据冗余方式,保证在冗余访问允许坏盘、断网、宕机等情况下不影响业务运行,有效保障数据安全。最重要的是支持容量横向在线扩展,容量扩展过程不影响业务运行。


发表评论

全部评论(1)

...
游客 05-19 18:10:18
可以公众号转载么?