摘要:华为GaussDB目前已支持NBU介质的备份与恢复,本文主要描述了华为GaussDB数据库和NetBackup对接进行备份、恢复的配置方法与性能调优方法。

一、简介

企业要想避开自然灾难和站点中断的影响,必须将数据副本远程备份至异地机器中。 这样当生产站点发生重大灾难事故时候,本地的生存存储与备份存储数据可能都会丢失,此时需要从异地备份存储上恢复数据,从而保证数据不丢失。Netbackup 是目前金融行业使用最广的备份软件之一(简称NBU),是Veritas(赛门铁克)主要产品 。华为GaussDB目前已支持NBU介质的备份与恢复,本文主要描述了华为GaussDB数据库和NetBackup对接进行备份、恢复的配置方法与性能调优方法。

二、NBU部署方式

当前GaussDB NBU备份方案支持两种部署架构,分别为侵入式部署于非侵入式部署。

NBU侵入式部署

当GaussDB所在集群支持NBU系列软件安装时,部署方式采用NBU侵入式部署,部署结构如下图:

NBU侵入式部署方案可以借阅 【GaussDB对接NBU备份环境配置指南】

具体使用方法如下:

注意:

  • --media-destination: 该参数为NBU policy名称
  • --metadata-destination: 元数据目录(本地路径)
  • --prior-backup-key: 该参数为增量备份依赖的备份集
  • --backup-key: 该参数指定恢复备份集

1、全量备份:

python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination  /data1/roachbackup/metadata  --parallel-process 3 

2、增量备份

python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/roachbackup/metadata  --parallel-process 3 --prior-backup-key 20200912_083324

3、全量/增量恢复

python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination  /data1/roachbackup/metadata  --backup-key 20200912_083324 

4、单表备份

python $GPHOME/script/GaussRoach.py -t backup --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990 

5、单表恢复

python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990  --backup-key 20190826_151600 

6、多表备份

python $GPHOME/script/GaussRoach.py -t backup --master-port 9500 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/omm/table.list

7、多表恢复

python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 9500 --media-destination $GAUSSHOME/roachbackup/mediadata --media-type nbu_policy --metadata-destination  $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/apdba/table_list.txt --backup-key  20190511_183652 -

8、数据库级备份

python $GPHOME/script/GaussRoach.py -t backup --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU  

9、数据库级恢复

python $GPHOME/script/GaussRoach.py -t restore --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU --backup-key key 20190511_193122  

NBU非侵入式部署

当前NBU系列软件只支持x86机器,NBU非侵入式部署则支撑NBU系列软件无法在ARM、欧拉系统安装的场景。如下图所示,假如已有3节点GaussDB集群,Roach备份工具将本节点的集群数据通过TCP发送到远端NBU Media Server机器。每台NBU Media Server上面同时安装NBU Client,并部署Roach client组件,后者接收集群内Roach进程发来的备份数据,不落盘方式通过XBSA接口转发给本机的NBU Client,完成NBU备份。恢复流程也类似,只是数据流相反。

Roach client插件安装:

从DWS管控面的连接管理界面下载Roach client组件包到集群本地,然后拷贝出来。如下:

useradd omm
passwd omm   # 输入密码
su - omm
cd /data/omm/ # 变更为本地安装目录, 将Roach client安装tar包拷贝至此目录下
mkdir roach_client
tar -zxvf GaussDB-8.1.0-REDHAT-x86_64bit-RoachClient.tar.gz -C roach_client
cd /data/omm/roach_client/bin/
source roach_client_env
./roach_client -p ip:8888 -H 0/0 -D -l roach_client.log  # ip为当前部署roach_client机
ps -ef | grep roach_client # 启动后检查roach_client是否启动成功 

​ 注意:/roach_client -p ip:8888 -H 0/0 -D -l roach_client.log

其中ip为当前部署roach_client机器, 8888为roach_client开放端口,用于沙箱内集群各节点和NBU Media Server之间TCP通信传输备份文件 ; -l 为指定日志路径

备份方式:

注意:

  • --media-destination: 该参数为NBU policy名称
  • --metadata-destination: 元数据目录(本地路径)
  • --nbu-on-remote:该参数指定部署方式为NBU非侵入式部署
  • --nbu-media-list: 该参数指定NBU Media Server的ip清单,按行输入ip地址
  • --client-port: 该参数指定Roach client插件的对外开放通信端口
  • --prior-backup-key: 该参数为增量备份依赖的备份集
  • --backup-key: 该参数指定恢复备份集

1、全量备份:

python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination  /data1/roachbackup/metadata  --parallel-process 3 --nbu-on-remote --nbu-media-list /home/Ruby/media.txt --client-port 8888

2、增量备份

python $GPHOME/script/GaussRoach.py -t backup --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/roachbackup/metadata  --parallel-process 3 --nbu-on-remote --nbu-media-list /home/Ruby/media.txt --client-port 8888 --prior-backup-key 20200912_083324

3、全量/增量恢复

python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 55000 --media-destination nbu_policy --media-type NBU --metadata-destination  /data1/roachbackup/metadata  --backup-key 20200912_083324 --nbu-on-remote --nbu-media-list /home/Ruby/media.txt --client-port 8888

4、单表备份

python $GPHOME/script/GaussRoach.py -t backup --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990  --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000

5、单表恢复

python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 25990 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/tablebackup/metadata --dbname testdb --tablename test --agent-port 34990  --backup-key 20190826_151600  --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000

6、多表备份

python $GPHOME/script/GaussRoach.py -t backup --master-port 9500 --media-destination nbu_policy --media-type NBU --metadata-destination  $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/omm/table.list --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000

7、多表恢复

python $GPHOME/script/GaussRoach.py -t restore --clean --master-port 9500 --media-destination $GAUSSHOME/roachbackup/mediadata --media-type nbu_policy --metadata-destination  $GAUSSHOME/roachbackup/metadata --logical --agent-port 7000 --dbname testdb --table-list /home/apdba/table_list.txt --backup-key  20190511_183652 --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000

8、数据库级备份

python $GPHOME/script/GaussRoach.py -t backup --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU  --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000

9、数据库级恢复

python $GPHOME/script/GaussRoach.py -t restore --dbname testdb --agent-port 7000 --metadata-destination $GAUSSHOME/roachbackup/metadata --media-destination nbu_policy --master-port 9500 --media-type NBU --backup-key key 20190511_193122  --nbu-on-remote --nbu-media-list /home/liding/nbu/media.txt --client-port 9000

三、NBU流程概述

备份数据流

NBU 一般涉及NBU Master Server、NBU Media Server、NBU client,属于一个three-trie结构。

本章节主要介绍NBU进程工作原理,方便使用者、开发者了解NBU备份流程,排查问题。

下图中为通过备份所涉及的数据流向

基本备份过程:

1、启动备份方式:

  • 当 nbpem 服务检测到某项作业到了启动时间时,将开始进行预定的备份操作。nbpem会检查到了启动时间的预定客户机备份的策略配置。
  • 如果管理员在 NetBackup 管理控制台中选择了手动备份选项,将开始进行即时手动备份。这会使 bprd 联系 nbpem,然后 nbpem 将处理管理员所选择的策略、客户机和日程表。
  • 当客户机上的用户通过该客户机上的用户界面(或者通过 bpbackup 或xbsa系列接口)启动备份或回复时,将开始进行用户控制的备份或回复操作。这将调用该客户机的 XBSA程序,该程序向主服务器上的请求后台驻留程序 bprd发送请求。当前Roach NBU介质备份采用这种启动方式。

2、接收备份任务: 响应进程(bprd)接收到客户端的备份请求,

  • bprd: request manager请求管理器:

bprd是Master Server的守护进程,bprd进程主要负责对客户机请求作出响应,并将并向nbjm发出 job请求,用于提交备份并获取job ID。

3、将请求转发个策略执行管理器nbpm

  • nbpem: policy execution manager策略执行管理器

策略执行管理器服务 (nbpem) 执行以下操作:

a. 通过nbproxy从 bpdbm 中获取策略列表, 查询到有效的备份policy的是否存在;

b、向 nbjm 提交当前已到预定启动时间的所有作业(按照schedule执行时间的策略)。

4、为备份job分配资源

a、nbjm(job manager作业管理器)接收到任务后,nbjm首先会与bpjobd通信,将此job添加至job列表中,此时在Activity Monitor中该job以queue状态可见。b、nbjm通过nbrb 请求资源,nbrb负责分配资源以响应来自 nbjm 的请求。并从 nbemm (企业介质管理器服务)获取物理资源,并管理逻辑资源,如多路复用组、每个客户机的最多作业数、每个策略的最多作业数。 当nbrb进程从nbemm获取到所需资源时,会返回通知nbjm资源已分配。

b、当nbrm资源分配完成后,nbjm会调用 image database 创建临时快照文件,此时该job会在Activity Monitor中该job以active状态可见。

5、开始备份

a、当job处于active状态后,nbjm通过bpcompatd与NBU Media Server上的客户端服务(bpcd)进行连接,其中bpcompatd服务通过专用小交换机(PBX)和NetBackup旧式网络服务(vnetd)创建连接。b、bpcd进程是NBU Media Server上的守护进程,允许Master Server或NBU Client启动程序。bpcd接收到连接后会启动Netbackup 备份恢复管理器(bpbrm)。

b、bpbrm进程服务通过PBX与vnetd与NBU client机器上的bpcd进程建立连接,启动NBU client机器上的bpbkar,其中bpbkar负责生成备份image,并将image数据发送至NBU Media Server上的bpdrm,对于每个备份或恢复job,都会在NBU Media Server上启动一个bpbrm实例用于传输image数据。bpdrm进程会启动磁带/磁盘管理进程bptm,对于磁盘介质,bptm直接与磁盘通信。对于磁带介质,bptm保留驱动器并向逻辑磁带接口守护程序(ltid)发出安装请求。 ltid服务调用机械手驱动器守护程序(txxd,其中xx根据所使用的机械手的类型而异)。 txxd守护程序将安装请求传达给机械手控制守护程序(txxcd),后者将安装介质。

6、结束备份

bpbkar服务通过bptm发送备份数据,以将其写入介质存储或磁盘存储。 备份完成后,将通知nbjm并将消息发送到bpjobd。此时job在“Activity Monitor”中显示为“done”。 nbjm服务还会将作业退出状态报告给nbpem,nbpem将重新计算作业的下一个到期时间。

四、XBSA相关接口

NBU软件提供的libxbsa64.so动态库(实现了标准的XBSA系列接口),将本地数据传送到NBU服务器,然后由NBU服务器负责落盘到磁带介质上。 GaussDB的专用备份工具Roach,负责调用libxbsa64.so库将本地数据库文件备份到远端NBU服务器。 本章节则主要针对开发者,介绍XBSA系列接口。

备份相关接口

备份过程中涉及的XBSA相关接口主要如下:

  • BSAQueryApiVersion:该接口用于确定Netbackup XBSA接口的当前版本。
  • BSAInit:该接口用于对XBSA应用程序进行身份验证,与NetBackup XBSA接口建立session会话,并为调用者的后续API调用建立环境。注意,BSAInit不支持嵌套创建session会话。
  • BSABeginTxn

​ 该接口用于创建一个事物,这里的事物和数据库事物概念相似,BSABeginTxn()调用向NetBackup XBSA接口指示作为原子单位执行的一个或多个操作的开始,即所有操作将成功或没有成功。可以将一个动作假定为为特定目的而进行的单个函数调用或一系列函数调用。

​ 例如,一个BSACreateObject()调用后跟多个BSASendData()调用并以BSAEndData()调用终止可以被视为单个操作。 在正常使用中,BSABeginTxn()调用总是与随后的BSAEndTxn()调用耦合。如果在事务期间调用BSATerminate(),则事务中止。

​ 注意,BSABeginTxn不支持嵌套创建事物。

  • BSACreateObject

​ BSACreateObject调用在NetBackup中创建一个XBSA对象。 该调用将启动NetBackup XBSA接口与NetBackup服务器之间的通信。然后可以将XBSA对象数据传递到内存缓冲区中。BSACreateObject调用中的dataBlockPtr参数允许调用者获取有关NetBackup XBSA接口所需的缓冲区结构的信息。

  • BSASendData

​ BSASendData()将字节数据流发送到缓冲区中的NetBackup XBSA接口。如果要发送的字节数据流很大,则可以多次调用BSASendData()。此调用只能在BSACreateObject()或另一个BSASendData()调用之后使用。

  • BSAEndData

调用方在调用BSACreateObject之后调用零次或多次BSASendData,当前备份文件传输完毕后调用BSAEndData,用于通知Netbackup服务器当前文件传输结束

  • BSAEndTxn

BSAEndTxn与BSABeginTxn耦合使用,以标识将被视为事务的API调用或一组API调用。。

  • BSATerminate

BSATerminate调用终止与NetBackup XBSA接口的会话,该接口由BSAInit调用对应,释放当前session会话获取的所有资源。如果在事务内调用BSATerminate(),则事务中止。

恢复相关接口

恢复过程中涉及的XBSA相关接口主要如下:

  • BSAQueryObject

​ BSAQueryObject调用从NetBackup XBSA界面启动有关NetBackup XBSA对象文件的信息请求。查询结果由查询描述符中指定的搜索条件确定。在BSA_ObjectDescriptor(由objectDescriptorPtr参数引用)中返回满足查询搜索条件的第一个XBSA对象的XBSA对象描述符。

  • BSAGetData

​ BSAGetData从NetBackup XBSA接口请求XBSA对象文件数据。在BSAGetObject()调用之后或在其他BSAGetData调用之后使用此调用。

五、问题定位

使用Roach工具NBU备份发生故障时,可通过以下思路进行问题定位

NBU管理控制界面activity monitor可显示相关的备份、恢复job。 job类型分为三类:

  • 蓝色站立人性:表示该次备份/恢复操作已成功执行完毕;
  • 绿色跑步人形:表示该次备份/恢复操作正在执行;
  • 红色x形:表示该次备份/恢复操作失败,可根据Status查询NBU官方文档获取错误相关原因;

例如上图中失败job返回码为13,则可根据文档信息定位排查原因

若NBU界面无失败job,则一般问题出现在了Roach侧,可根据Roach日志进行定位。

六、参数调优

Roach工具目前支持两种NBU部署结构,分别为NBU侵入式部署于NBU非侵入式部署,两种部署方式的参数调优分别如下:

1、通用参数调优

  • Maximum concurrent jobs

此值指定了对应存储单元上最大作业数量,取值范围为1-256,

例如准备将三个备份作业发送到存储单元,并将“最大并发作业数”设置为两个。前两个作业开始,而第三个作业等待。

  • Maximum vault jobs

​ 此属性指定在master server上允许活动的最大活跃job数量。如果达到了允许活动的job限制,则将后续的kob排队,并且它们状态在“活动监视器”中显示为“已排队”。此属性设置范围为1~200, 当备份过程并发job数大大超过200,则master server会出现瓶颈,造成任务排队耗时。此时应考虑部署多Master Server模式。

设置NET_BUFFER_SZ :

在应用Netbackup备份数据到带库时,有一个NET_BUFFER_SZ参数,决定media server与client之间数据传输的缓冲池大小,该参数值默认为32032 bytes,以文件形式保存于%Install_Path/netbackup/目录下。通常默认值都较小,如果希望修改该参数值,则直接修改%Install_Path/netbackup/NET_BUFFER_SZ即可,例如:

host-192-168-241-40:/usr/openv/netbackup # echo 65536 > /usr/openv/netbackup/NET_BUFFER_SZ
host-192-168-241-40:/usr/openv/netbackup # more /usr/openv/netbackup/NET_BUFFER_SZ
65536

设置一个足够大的NET_BUFFER_SZ某些情况下能够有效提高备份的速度,推荐在server/client端都设置该参数。

2、NBU侵入式部署调优

  • Maximum jobs per client

此值设定每个NBU client发送的并行处理任务数,通常Roach与并行参数相对性,一般设置为DN数+CN数为最佳。

3、NBU非侵入式部署调优

  • Maximum jobs per client

此值设定每个NBU client发送的并行处理任务数,通常Roach与并行参数相对性,一般设置为

(DN数+CN数)*(Roach client 服务的Roach agent)个数为最佳。

4、超时设置

超时属性适用于选定的Master server、Media Server以及NBU client

  • Client connect timeout

​ 此选项指定服务器连接客户端时等待的秒数。默认值为300s。一般Roach备份业务中,建议此值设置为3600s或者更高。此选项适用于NBU Master Server、NBU Media Server、NBU Client。

  • Client read timeout:

​ 此选项指定用于客户端读取超时的秒数。此选项适用于NBU Master Server、NBU Media Server。默认值为300s,如果服务器在客户端在此超时时间内没有从客户端得到响应,则备份/恢复任务失败,报错误码13。特别是针对于NBU Job复用场景,文件间隔传输时间超过此值,则备份/恢复任务失败。建议此值设置为3600s或者更高。

  • Media server connect timeout

​ 此选项用于指定Master Server连接Media Server的等待超时描述,默认值为300s。建议此值设置为3600s。此选项适用于NBU Master Server、NBU Media Server。

点击关注,第一时间了解华为云新鲜技术~

未雨绸缪,数据保护之NBU介质备份相关推荐

  1. NBU网络备份大全之oracle系统冷备份

    学习和掌握如何使用NBU备份文件系统,对于一个数据管理员来说,仅仅是一个开始.因为对于大部分企业来说,买来NBU主要是为了备份企业数据库的数据, 保护数据库的数据安全,进而保证企业应用的安全运行.因此 ...

  2. NBU网络备份大全之oracle系统热备份

    学习和掌握如何使用NBU备份文件系统,对于一个数据管理员来说,仅仅是一个开始.因为对于大部分企业来说,买来NBU主要是为了备份企业数据库的数据,保护数据库的数据安全,进而保证企业应用的安全运行.因此, ...

  3. NBU(NetBackup)备份vmware虚拟机

    NBU的强大备份能力相信用过的人都清楚,今天这里介绍一下对应Vmware虚拟机层面的备份,实现系统级的虚拟机备份. 步骤如下: 1.新建虚拟机集群(要备份的集群VCenter) 记得修改Host文件 ...

  4. 存储大师班 | 浅谈数据保护之快照与备份

    作者简介:徐林波 NeonSAN 开发人员,具备丰富的存储领域从业经验,资深存储系统软件研发工程师,熟悉当前主流及新型存储介质. 引言 面对当前企业数字化转型浪潮,信息数据已经成为企业赖以生存的基础, ...

  5. 1.4 NBU配置备份策略(Policy)

    1.4 配置备份策略(Policy) 一个备份策略由四部分组成. Attributes(属性) Policy是否Active Policy类型 由此Policy产生的任务的优先级 使用的Storage ...

  6. Windows2014使用NBU备份实现Oracle11g本地恢复和异地恢复

    Windows2014使用NBU备份实现Oracle11g本地恢复和异地恢复 主机名 IP 角色 环境配置 Win-126 192.168.0.126 业务数据库 安装完整的oracle11G数据库和 ...

  7. Veritas NetBackup备份系统管理维护实战(NBU培训+各种数据库备份恢复)

    一.风哥Veritas NetBackup企业级备份系统建设与管理维护介绍 NBU介绍: Netbackup(简称NBU)是当今世界非常流行的一款数据备份软件,是全球排名NO.1的企业数据保护平台,8 ...

  8. nbu备份oracle rac,利用NETBACKUP将备份写到磁盘上

    NETBACKUP备份软件主要用于将备份写到带库上,当然NETBACKUP也可以将备份写到磁盘上. 配置过程比较简单,这里简单描述一下. 首先,启动NETBACKUP的图形管理工具:jnbSA. 下面 ...

  9. DP DD VTL 备份 NBU

    BCV->VTL->TL 都是DP实现的, BCV到VTL的日备周备脚本和VTL到TL的月备脚本其实内容一样,就是保存时间变了,9天,5周,53周,用的pool变了. VTL->TL ...

  10. nbu备份db2数据库6号错误解决案例

    NBU在备份一台AIX服务器上的DB2数据库时,报6号错误. 报错截图: 在AIX服务器上运行备份脚本,具体报错信息如下: Executing: db2 BACKUP DATABASE BJMOA4 ...

最新文章

  1. js 改变change方法_Linux 中改变主机名的 4 种方法 | Linux 中国
  2. js调试,输出函数调用顺序
  3. 最强新一代消息系统,没有之一,不接受反驳!
  4. linux下查询域名或IP注册信息的操作记录(whois)
  5. JAVA与DOM解析器基础 学习笔记
  6. 编程同写作,写代码只是在码字
  7. 【算法】剑指 Offer 03. 数组中重复的数字
  8. 程序员为什么非得参加一场编程竞赛?
  9. 移动应用开发者在区块链中怎么赚钱?
  10. php x不能转移,[PHP] 从 PHP 5.3.X 迁移到 PHP 5.6.X不兼容点
  11. NAACL 2018 | 最佳论文:艾伦人工智能研究所提出新型深度语境化词表征
  12. C++:字符(串)输入和输出
  13. mysql远程主机强迫关闭了_channal经常关闭
  14. 生物化学 核磁共振 氢谱 n+1定律 邻碳耦合 同碳耦合
  15. 灵性图书馆:好书推荐-《在荷欧波诺波诺中遇见真正的自己》
  16. html5锚点平滑,使用锚点定位不改变url同时平滑的滑动到锚点位置,不会生硬的直接到锚点位置...
  17. RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP-Android解码获取视频帧的方法
  18. Basler驱动如何彩色相机白平衡说明
  19. fping 命令参考--网络工具--快速ping--windowslinux
  20. 点对点传输现状,镭速高速点对点传输解决方案

热门文章

  1. macOS下安装ENVI
  2. ENVI国产卫星插件
  3. Python 玩转数据 17 - Pandas 数据处理 合并 pd.merge() df1.merge(df2)
  4. Advanced Installer生成安装包
  5. Intel/Altera 系列FPGA简介
  6. 药店收费系统服务器,智能药店收费管理系统
  7. Shell脚本学习指南(一)——入门
  8. 常遇电脑故障应急处理方法(转)
  9. com.android.gallery3d文件夹,如何在Android Gallery3D(cooliris)中显示特定文件夹?
  10. css 图片大小自适应div,css让图片自适应容器(div)大小