这两天时间稍微多一点,好好的研究了一下back up的策略,本文只适用于各种shared hosting, vps, dedicated server, server clusters. 但是主要侧重于vps以上以及多台服务器的备份策略,系统环境为centos 6, 是否有whm/cpanel 均可。
6 l: k% T/ ?: m% u # P, T" x" a8 b( F
首先来说,作为一个marketer,最重要的莫过于自己的数据,而且我相信论坛上很多做paid traffic的人没有做back up的习惯,而且我的学员群里就有活生生的例子。。。数据库倒掉,辛苦全报废了,或者被东欧人入侵,数据全报废了。。我的其中一台服务器的硬盘也曾经报废了,但是我很幸运,因为managed的服务,立刻就给我恢复了,但是这也给我敲醒了警钟。; U1 J& T% s# s1 ~, r. o
; z) M; G" I$ S t9 k$ L& q 我不是linux备份方面的专家,以前一直使用managed的服务,但是目前服务器太多( 基本上US每个大型机房都有我的box),有些服务器的用途决定了他不需要managed的服务,毕竟挣钱是在太不容易了,所以就有了此文。此文的中心思想是automated back up,该花钱的地方花钱,该省钱的地方省钱。
+ N' g7 e: ?0 F+ t& [- _/ w 2 M6 B# n/ W1 T
论坛卧虎藏龙,如果此文有任何不正确之处,敬请各位大神以及各位hostloc过来的专家们不吝指出,争取打造为比较标准,完整的back up tutorial!
4 x7 \8 o! {+ { 2 h# Y. X4 o0 ?! C* s: X* b
目前来说,backup一般分为三种,简单的说有FTP备份,rsync备份,以及R1Soft 备份( 商业软件)。(不考虑其他公司的in-house 程序,例如bpbackup等等)
5 V) w* |# o6 I7 |" W! j8 a1 C
" O' W: g- y3 \. W/ w 三种备份各有个的优势,再有whm/cpanel的情况下, FTP备份是最最最简单的,但是流量消耗也是最大的,需要WHM/Cpanel支持。 Rsync 备份属于incremental 备份,效率较高,利用timestamp 的特性只备份变化的文件/夹,需要掌握一定的linux commands。 R1soft作为商业软件,也是incremental备份,基本各大IDC都在卖他们的服务,back up功能是最好的,能够有效的减少CPU负载以及磁盘的IO.
, z/ B" U, B& b
! u( a& {* E! A } 这三种方式,无论哪一种方式,都需要你有一台back up server 或者vps,或者第三方back up service. 对于自己的back up server来说,需要的配置由你的实际情况有关。 Rsync的方式内存1GB即可,R1Soft 需要最少8GB内存。服务器的硬盘可以选择2*1TB, RAID 1 BBU 或者RAID 6的搭配方式( 一般来说RAID 1足够,RAID 6 是备份十分敏感的数据 ,RAID10 一般是向外提供back up的service)。下面我们来实际分析一下:
' x1 v( n. x8 @5 x2 E& A2 O! Q2 C
# [# p, r: V4 s: Y 1) FTP 备份. 主服务器最好有WHM/CPanel面板。同时你需要有back up server 或者第三方back up service的FTP信息。
; ?# V5 F1 k, I3 k$ i
, Q) o, w/ S: n CPanel 下备份: Back Up Wizard => Back Up => Full Back Up => Remote FTP Server, 然后填写remote back up FTP 信息即可。不好的一点是你无法实现automated backup.
) N% X' R0 `% S
) _, w! g) f) E) ]+ I2 a 想用CPanel实现automated backup,可以使用如下代码保存在/home/youraccount/fullbackup.php :<?php
( `! d+ s, ^2 l! \" e4 r# ?
( j8 j" m, Q: e4 d5 J // Disclaim: 此code来源于internet,非 advertcn.com原创。此code适用于FTP 备份,或者rsync备份,或者自动备份到Amazon S38 t; D5 S6 e. h- V$ y0 _' H: E
// 你需要再你的/home下建立一个backup的文件夹
6 I- N# l" i( ?8 d4 ]! o // Information required for cPanel access
) T! s3 f% y" [6 ]
; J7 M; {) Y% c4 ` $cpuser = "username"; // Username used to login to cPanel
8 S4 b* o. r) ^
: v; C5 O; K4 m( m! \ $cppass = "password"; // Password used to login to cPanel 7 U- u# q: m% E" i
6 I# I) }% k3 f( n/ P. h
$domain = "example.com";// Your main domain name # i% a! f! x& H' r0 B% e
- x& u L7 a: F0 i/ c
$skin = "x"; // Set to cPanel skin you use (script will not work if it does not match). Most people run the default "x" theme or "x3" theme * [" P6 P' A8 \; }, m4 `% }
; i& B+ B q) R2 z* L' } // Information required for FTP host 2 j+ E S( }6 N3 Z
4 E9 p$ Q2 P; k6 I. b
$ftpuser = "ftpusername"; // Username for FTP account # ?6 f; }+ s* [& E* h
# D8 E( P& W* n1 I! ^ $ftppass = "ftppassword"; // Password for FTP account
! J4 c8 c+ v* @/ X * D' f0 ]6 ]6 z4 k& i* g
$ftphost = "ip_address"; // IP address of your hosting account : W- S, r" J% P+ a4 T) _ W% H, q
& b# n. a- G' t ]
$ftpmode = "passiveftp"; // FTP mode
3 _# I+ X7 P6 `, L+ C% g" J ! B2 ?5 m8 v% U! x) N5 [
// Notification information $notifyemail = "[email protected] "; // Email address to send results % Y+ `7 a$ O% H; V; Q% p
l. Q( p& @2 b8 ]4 D8 N) \! D
5 J: w% w" T0 B- e
& z4 ]- O5 h% p8 x5 f0 w) S" _' M1 D // Secure or non-secure mode $secure = 0; // Set to 1 for SSL (requires SSL support), otherwise will use standard HTTP
; z- x% @5 G$ n d& e% u) V1 Y 5 j# o# \3 B* X3 r- H b
// Set to 1 to have web page result appear in your cron log $debug = 0;
% c# @( p- t" l , _: z8 q% h: a; W v3 E" n# ~
// *********** NO CONFIGURATION ITEMS BELOW THIS LINE ********* & O! M* F c: |3 U- H
/ M, a4 k3 O4 C- \6 n+ Y
$ftpport = "21";
! D9 P- z$ O1 h# E / g2 t3 c: l- o9 V8 A+ {
$ftpdir = "/backups/"; // Directory where backups stored (make it in your /home/ directory). Or you can change 'backups' to the name of any other folder created for the backups;
- s( }, C- R5 K/ a& w7 @( Q 1 i+ ?/ ?# Q1 o
if ($secure) {
) ?6 t1 Z! D3 e9 w; c/ K! }
1 k9 m' G( O. n b4 D $url = "ssl://".$domain; E9 m& m6 a* n9 K: R! `
; u# Z3 ~ L" I$ v $port = 2083;
! \1 X( j+ D( \5 U 1 U. R* O2 j& T+ g5 W, O
} else { 6 _9 Y$ ]5 f$ J, L |
) G0 N/ F6 z" T
$url = $domain; 9 m8 e. D! V% S' h4 p( T+ [# i
, B1 Z7 D* v6 v7 O7 b" t l $port = 2082;
( h; ~3 |" N) r$ b! W2 c : W! b6 T7 y- S! l8 B' O2 E
}
1 i( w5 y8 I8 G4 [; \% I. p 6 q. P& E% n( z' C' z
4 E! ^" ]' `4 z( }9 f5 A1 K
9 Y2 S0 u- z; K+ _0 o $socket = fsockopen($url,$port);* P8 S; }( e6 g: v% h$ W' `# Z
" u" x1 g1 d. S: s if (!$socket) { echo "Failed to open socket connection... Bailing out!n"; exit; }
6 D6 _5 b" i5 \: `* ]
, E& t5 V3 k) m' J' q: j. m' [1 p- m ! Z) P9 L% x+ ~$ j% c: I
% g2 w: J, \. W; b8 e/ R6 E! a( s5 Q, i
// Encode authentication string 3 k3 l+ M9 t( q
! C" C' k: l; K
$authstr = $cpuser.":".$cppass;
* W+ E7 k2 Q6 L; V6 {6 E! d) S/ C2 P4 b * N! C% ^. [0 Q' M+ G! _$ \8 U; O0 ^# l
$pass = base64_encode($authstr); ( d n! [- h6 U+ t6 n
3 \# q& l3 s, p" s8 l/ X9 ? $params = "dest=$ftpmode&email=$notifyemail&server=$ftphost&user=$ftpuser&pass=$ftppass&port=$ftpport&rdir=$ftpdir&submit=Generate Backup";
, F2 S" A; u# K ! y" c* i/ D* F' s, `
, v/ H# s6 F" n" k+ Q" Z, J
' |1 E2 i8 B. x F // Make POST to cPanel , K& a" N4 N" W. |( }0 s
9 C( s) h) p) }* e8 T
fputs($socket,"POST /frontend/".$skin."/backup/dofullbackup.html?".$params." HTTP/1.0\r\n"); * f/ c5 \& x& j3 U% M" C( e
, P: Y+ g$ P3 m fputs($socket,"Host: $domain\r\n");
R9 |/ ]- }( T: c' ` - E: d* W" a" h( L
fputs($socket,"Authorization: Basic $pass\r\n");
7 i- J1 y) k" R0 f) R 4 n9 e5 `1 L- k. I9 S
fputs($socket,"Connection: Close\r\n");
: X. ^' C" Q* P1 t( I/ Y5 g+ O 7 e( V- O1 Z" w+ {8 |5 y! c
fputs($socket,"\r\n"); + n0 y- r: c4 p a X; ^: ^9 M: [; a
" S9 L2 M7 {7 U+ N4 F( S# d
// Grab response even if we do not do anything with it.
, G! R" }% u; d, F L$ N- [) O ( g$ x4 y) g4 Y; t( F
while (!feof($socket)) { 2 O; f% t7 ?3 Q& i- [+ Q
. W% \2 \5 E, n/ w0 M, ~# q+ u, Q
$response = fgets($socket,4096); if ($debug) echo $response;
; a2 D2 D* W! D/ d
- p0 v; {& c3 ] V' I O% h } . F" f* J1 |- n) e/ o2 W. R. e8 {( }
& j9 W; [2 {9 G" \5 h O4 g- o$ Z- j7 j fclose($socket);
- E F- `6 P9 R W" K
% Y: E- b' C) T+ `7 c0 {- H ?> 复制代码 如果我们想每天凌晨2点钟进行备份,可以将如下code加到cron当中,就可以实现自动备份到远程FTP中00 2 * * * /usr/local/bin/php /home/youraccount/fullbackup.php 复制代码 或者将上面的code稍微修改下,只需要产生备份的文件,也可以利用下面的Rsycn或者amazon s3进行备份。0 y/ D5 h* R2 G& p
WHM 下实现automated back up: Back up => Configure Back Up, 然后再这里enable backup,并且填好FTP信息即可。1 H6 m# Q( b, h8 I4 ?9 I0 k8 O
+ c' ?* S; o/ B$ ^
2) Rsync 备份. 此办法属于incremental 备份的,效率较高,节省服务器的CPU 负载,减少IO等等,但是配置较为复杂,需要一定的linux 基础。
5 G4 ]" U- v0 s& f! E & F% x6 J4 J2 ?
代码如下:a) 用root身份登录录住服务器(避免权限问题), Z4 F% D5 l5 U( W; n( Q; T. o) `
b) 设立SSH key pair。
" Q" e! C6 r1 _ E5 a 有的box没有安装rsync,需要自己安装rsync 这种情况概率很低
8 Y- s; T& F. z # yum install rsync
& j' e2 _7 G1 p - i& J$ A9 m% e' O
你需要用如下命令检查是不是系统已经存在一个key6 K6 @& X8 x2 l
# cat ~/.ssh/id_rsa.pub
3 u! `) p/ [: E9 ]8 ~ 9 W' F0 w1 u, ?$ Y
如果已经存在,可以直接到c),否则执行如下命令:
2 L2 B: |: J4 f. ]& a8 X% w
4 k) {1 u! V* x/ m # ssh-keygen -t rsa -N ''
8 H; j+ s+ f5 N( D0 Y9 @0 H 注意,是两个单引号,这样就产生了两个默认的key: id_rsa 和 id_rsa.pub7 q" i/ K4 D \7 F: y- k. N
9 p, d& S. m& W) j ( f3 Y' w$ {& ~, f' |
c)把RSA加密的key 复制到你的back up server, 假设IP为9.8.89.2
. k8 }) N3 m. l3 `1 Y* { : F7 C' e! p. K7 W
# scp /root/.ssh/id_rsa.pub [email protected] :/root/
+ N0 I- u' e3 |8 s, h 5 M) a+ e4 T) O! L- p: Z8 B \4 _8 U
然后ssh到你的back up server,执行下列命令:
; F8 L8 f) X* j 2 R4 [! ]7 B9 o, v1 J) E$ B! K P
# cat /root/id_rsa.pub >> /root/.ssh/authorized_keys& j2 X' N% h1 _/ s9 _9 C
# chmod 644 /root/.ssh/authorized_keys( z7 R8 t( j v( X7 Y: q3 s8 W
这样SSH pair就构建完毕。
$ V8 d* Y: h* F* i
1 ~8 O" J y( u2 p& R5 f# z d) 测试SSH pair是不是成功,如果不需要密码,就说明成功了# N( n, M1 @4 m2 {* l
#ssh -i /root/.ssh/id_rsa [email protected] 8 Z' S ?+ d- K. K1 E# V# A3 V3 R
( m. |# g7 G9 D+ W) \6 Q e) 最后一步也就是最重要的一步,备份,假设我们的住服务器的备份文件夹是/home/var/etc, 需要备份到back up server的/home/root/backup_server1,则我们需要将5 w U( i5 l3 Z- c+ R
下列命令写入到cron:
{ Y3 K; k- v* ` #echo "0 5 * * * root rsync -avz -e ssh /home/var/etc [email protected] :/home/root/backup_server1" >> /etc/crontab2 O: m$ y" s6 D) ]/ y
表示每天5点的时候同步这两个文件夹
6 M) g7 }! o8 ^1 k4 y) E 7 ?' N' T; g" J' H+ ~
一些其他的备份例子:
6 J: [6 b1 {' |( d- \ 备份整个server: rsync -avz -e ssh / [email protected] :/home/root/backup_server17 `! G6 k/ M8 M1 h
备份home: rsync -avz -e ssh /home [email protected] :/home/root/backup_server1) J3 W# a. o: K, O/ ?2 N
备份某一个用户: rsync -avz -e ssh /home/advertcn [email protected] :/home/root/backup_server1 复制代码 由代码可以看出,rsync只能同步文件,不能保存每天都备份的数据。但是相当的经济实惠。
8 W- Z# L3 `! k( |; t# P8 }1 P
0 Y! @+ w$ H x3 u5 G6 z# w f8 y 3) R1Soft 软件备份。虽然花点钱,但是使用的很值。我的建议是服务器多的同学可以考虑这个产品。买一个2*1TB的RAID 1的服务器,就可以备份n多服务器,甚至也可以提供备份服务。很多大型的ISP的备份服务都是R1Soft。 我建议可以使用gigenet或者steadfast 的R1Soft 备份服务,价格公道,network好。http://www.gigenet.com/hosting-solutions/storage/r1soft-cdp-backup/ 复制代码 http://steadfast.net/services/disaster-recovery.backup.php 复制代码 4) 直接备份到Amazon S3.
+ w' `- j" p9 s2 P8 o/ t
9 T' `2 t* x8 h& T, J4 S! R S3的服务有保证,你的备份文件不会丢失,不需要考虑什么RAID 1,5,6,10之类的。而且AWS的价格不是一般的便宜,每GB文件0.095刀,我估计大部分人的文件10GB到头了,也就是一个月1刀的费用。。。服务公道。可以综合上面的Rsync和FTP的获取备份文件的办法,将文件直接备份到Amazon S3。Amazon S3 全部使用API 进行操作,步骤非常的简单,备份过程如下:& F( U0 O5 b. Z. t
# Z( {9 h" c( |8 G: ] a) 注册AWS账户,获取你的access key 和secret keyhttp://aws.amazon.com/s3/ 复制代码 b) 在你的主服务器上安装s3 client,用来和AWS进行通信<p># cd /etc/yum.repos.d</p><p># wget http://s3tools.org/repo/RHEL_6/s3tools.repo</p><p># yum install s3cmd</p> 复制代码 配置s3 client<p># s3cmd --configure</p><p></p> 复制代码 这个过程需要你输入你的aws的access key 和secret key,其余全部默认即可。+ I$ T9 z8 B2 A# r2 I0 Z9 l# Y& f
* i0 V3 m' G8 z* P 这样就完成了基本的配置工作,下面开始配置备份过程。
' y0 J, P. y0 r0 p+ Q9 C
& L( ?9 e( m6 o" X c) 备份配置9 R/ L0 B% i: H* x3 y5 I& G
. b* V U9 @5 K9 J* A5 x
在S3上建议一个bucket,假设用来备份广告中国的这个server这样以后所有的关于advertcn的数据都会保存在这个bucket上
/ _$ B3 m: @$ i7 _% ?3 a6 v
. Z+ a8 y8 n# ?" _2 o5 q! o (更多的命令,可以查看:http://s3tools.org )) j V! z# }! U# \
, ?; Z6 ]" F0 M' [4 c \' Z
前面我们已经说过了如何开启WHM 自动备份功能,或者查看http://docs.cpanel.net/twiki/bin/view/AllDocumentation/WHMDocs/ConfigBackup 复制代码 假设我们使用的是WHM的默认备份文件夹/backup, 则在里面还有一个文件夹/cpbackup/daily,所有文件都会在daily里面5 a' w( g) e4 ^. [3 `# u
+ \, l4 L7 p$ S; b& U- ?. J5 z- Q 创建备份log文件# mkdir /var/log/backuplogs 复制代码 这样基本的参数就全部完毕# {" l* l5 k, T
( v8 G/ s8 A4 o# V( A5 m7 X' K D d) 自动备份代码9 P/ ]& N9 g# s& I
$ b9 _1 p5 N* C s! Z4 k3 Q g: s
将下面的代码保存为/root/dailybackup.sh#!/bin/bash
, n5 R. D4 M* g- Q
. b7 d+ {1 V. y' P6 H: k7 y ##notification email, 把这个email改成自己的email,需要改5 ^0 E+ ^" Q* C7 Y2 C) |0 y
[email protected]
9 n& @/ S& h$ q& [8 W
, X' \ o5 I; R, R. `0 b7 N N ERRORLOG=/var/log/backuplogs/backup.err`date +%F`
, [0 h/ r4 v: E( f0 `8 n2 J ACTIVITYLOG=/var/log/backuplogs/activity.log`date +%F`
9 t. x" f9 e! k2 Q7 w
+ }* F1 R4 B8 C9 e# A# ` ##需要备份的文件地址,按照前面说过的,或者改成自己的+ L1 w0 @& j4 [. P5 |
SOURCE=/backup/cpbackup/daily9 N( ]" w2 g* g9 W0 p
$ Q' n& J$ d w9 m+ W
##S3的Bucket文件名称,不要改
( K* m- [" o4 F0 } DESTINATION=`date +%F`; f9 {* M& ^7 z) Z
# ?5 `7 b5 T$ W ` ##保存的备份的天数,3表示只保持近三天的备份文件,一般用5或者7,或者up to yourself
* T9 A! }# O1 L7 z" V% ^$ Y, v DEGREE=3
3 I7 x z0 \$ I4 W* u+ n
) e- r. w; ^6 X. U- [8 q ##clear 日志,不要改
+ k4 [: z5 d1 a- n$ R. L# U% s :> ${ERRORLOG}
4 c* d0 J5 o. Q :> ${ACTIVITYLOG}! H: U& u6 w/ G1 n; W
s/ g7 ]; q0 ~" I. b# W' R ##上传到amazon S3,把backup_daily改成相应的s3 bucket
; d/ Q/ u) L4 z; Z! { /usr/bin/s3cmd -r put ${SOURCE} s3://Backup_daily/${DESTINATION}/ 1>>${ACTIVITYLOG} 2>>${ERRORLOG}2 p3 ^& t- w! V( ?7 ]/ U
ret2=$?' u2 t. I" G. \) _
# F& N1 Z& r0 O ##发送email notification,不要改
9 C: s4 _# b# z; x! f msg="BACKUP NOTIFICATION ALERT FROM `hostname`"
7 [; i( L8 r1 `, ^4 v. |0 L ) H# v9 f1 Q; c4 C
if [ $ret2 -eq 0 ];then
' }: R) z: n0 J; g. ~4 f& J msg1="Amazon s3 Backup Uploaded Successfully"4 I9 D0 b6 P% m2 a" W! \
else
5 k( M0 L N& l. ]: ` msg1="Amazon s3 Backup Failed!!\n Check ${ERRORLOG} for more details"
. B# n! I/ h* }. S Q3 L7 F3 @ fi
2 w9 J5 _! A& U* Z6 V echo -e "$msg1"|mail -s "$msg" ${_EMAIL}0 w% f3 e1 b c( v* ` p5 h
0 I# |! C7 K6 Q: g+ Y- T #######################
. p) h0 e) Q3 b# E ##删除超过备份天数的文件
5 a: B! y9 L2 I! N9 @ ## 本地服务器和amazon s3全部删除,把backup_daily改成相应的bucket
+ p8 ?1 e% `, f #######################* J1 B" F+ P$ s% D
DELETENAME=$(date --date="${DEGREE} days ago" +%F): t% i5 q$ L* k( C3 x' b
" v' N, D' ` S* E5 x# d/ B
/usr/bin/s3cmd -r --force del s3://Backup_daily/${DELETENAME} 1>>${ACTIVITYLOG} 2>>${ERRORLOG} 复制代码 然后更改权限,加入cron,实现自动备份<p># chmod u+x /root/dailybackup.sh</p><p># cp -p /root/dailybackup.sh /etc/cron.daily/</p> 复制代码 这样基本就完成了自动备份工作。3 M- L D3 G* [" y/ {$ s5 u
& c7 ?, j) x8 P2 X 从S3恢复文件到本地服务器:<p># mkdir restore</p><p>
7 ~, b; Y/ B0 I% |2 \- E2 I3 P9 g </p><p>#s3cmd -r get s3://Backup_daily/2011-02-32 restore</p> 复制代码 是不是很简单?& J* r' \5 }- D0 _( H$ J7 i5 A
1 ~6 {# y2 w2 E3 R, c( {
Note:
/ _ H' `4 Z. U, i( b+ E& o 5 d0 E+ \5 b0 @$ ?" g9 P
1) 如果你想在每天WHM完成备份之后就执行这个备份命令,可以如下:
! A& u. D4 V; x) g2 }2 T3 l' I
6 V4 H7 |9 a i% S5 d- Q7 K2 K 添加代码<p>#!/usr/bin/perl</p><p>system(“/root/dailybackup.sh”);</p> 复制代码 到/scripts/postcpbackup,再改文件权限6 s& U1 \2 n$ f$ Z! X, w: g
k2 x4 F5 g- k# ]
# chmod u+x /scripts/postcpbackup: X& H! W: k! w8 m1 ?- `. E9 y$ g
9 K! i8 i' B1 U, S
2) 如果你想修改WHM每天的自动备份时间,可以在WHM后台
! r4 \! h% C1 M: T2 {; M# t
; B( N: `! K* p! H WHM => Cpanel => Manage Plugins => Install and update, 给cronconfig打上勾7 W! d/ B9 _# w, c; B$ `
; }4 r! s8 U4 t2 n 然后去Plugin里面设定自动备份的时间即可。: \+ C6 K8 N/ a- q$ l1 I( S
! m- ]8 Q& L- f. R8 f+ M1 \
1 r; {# V4 c& i( B" R& D0 B/ ?+ C --------------------------------------------------------------------------------------------------------------------------------------------------
6 x; D" `; O4 ^, M+ ? 以上涵盖了大部分人的备份方式。不要过于追求高端,选择合适你的就好,as long as it 能够保护好你的数据。; L9 x. @5 u) m4 K
& t: }4 T6 V( v4 z$ o, p& {" s
目前广告中国采取双重备份,每天自动备份到amazon s3,同时通过R1Soft 备份到自己的back up server
9 z% c7 s; V$ w
2 k2 r1 P4 v2 o
3 b+ u2 Y% x& r2 v 我是back up 这一行的菜鸟,希望各路大仙不吝指出我的代码错误或者offer一个更方便的办法7 h3 L5 \) O0 }4 z% L. l3 d
/ o1 s( l5 k3 c/ l
( ~! [6 ]6 H3 }; i
& o1 C5 P3 N& p) Q4 h 3 G; M: C! u; A" p* R6 F
# B6 g" K0 A0 F) y
O* O/ q! W# m& E
d% ?5 n" ~' L5 A- P" m% `! g
# [: T! w5 y1 S. ^0 s6 F2 J
8 ^: I! D4 W( H( A4 ~, @+ C: D% r7 C
评分
查看全部评分
相关帖子