Redis-3.2.0集羣配置(redis cluster)

目錄 1

1. 前言 2

2. 部署計劃 2

3. 目錄結構 2

4. 編譯安裝 3

5. 修改系統參數 3

5.1. 修改最大可打開文件數 3

5.2. TCP監聽隊列大小 4

5.3. OOM相關:vm.overcommit_memory 4

5.4. /sys/kernel/mm/transparent_hugepage/enabled 4

6. 配置Redis 4

7. 啓動redis實例 6

8. 創建和啓動redis cluster前的準備工作 6

8.1. 安裝ruby 7

8.2. 安裝rubygems 7

8.3. 安裝redis-3.0.0.gem 7

9. redis-trib.rb 7

10. 創建和啓動redis集羣 8

10.1. 複製redis-trib.rb 8

10.2. 創建redis cluster 9

10.3. ps aux|grep redis 10

11. redis cluster client 11

11.1. 命令行工具redis-cli 11

11.2. 從slaves讀數據 11

11.3. jedisJava cluster client 11

11.4. r3cC++ cluster client 12

12. 新增節點 12

12.1. 添加一個新主(master)節點 12

12.2. 添加一個新從(slave)節點 13

13. 刪除節點 13

14. 檢查節點狀態 13

15. slots相關命令 14

15.1. 遷移slosts 14

15.2. redis-trib.rb rebalance 14

16. 人工主備切換 14

17. 查看集羣信息 14

18. 問題排查 15

 

1. 前言

本文參考官方文檔而成:http://redis.io/topics/cluster-tutorial。經測試,安裝過程也適用於redis-3.2.0

2. 部署計劃

依據官網介紹,部署6redis節點,爲33從。3臺物理機每臺都創建2redis節點:

服務端口

IP地址

配置文件名

6379

192.168.0.251

redis-6379.conf

6379

192.168.0.252

redis-6379.conf

6379

192.168.0.253

redis-6379.conf

6380

192.168.0.251

redis-6380.conf

6380

192.168.0.252

redis-6380.conf

6380

192.168.0.253

redis-6380.conf

 

疑問:3臺物理機,會不會主和從節點分佈在同一個物理機上?

3. 目錄結構

redis.conf爲從https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf下載的配置文件。redis-6379.confredis-6380.conf指定了服務端口,兩者均通過include複用(包含)了redis.conf

本文將redis安裝在/data/redis(每臺機器完全相同,同一臺機器上的多個節點對應相同的目錄和文件,並建議將bin目錄加入到環境變量PATH中,以簡化後續的使用):

/data/redis

|-- bin

|   |-- redis-benchmark

|   |-- redis-check-aof

|   |-- redis-check-dump

|   |-- redis-cli

|   |-- redis-sentinel -> redis-server

|   `-- redis-server

|-- conf

|   |-- redis-6379.conf

|   |-- redis-6380.conf

|   `-- redis.conf

`-- log

 

3 directories, 9 files

4. 編譯安裝

打開redisMakefile文件,可以看到如下內容:

PREFIX?=/usr/local

INSTALL_BIN=$(PREFIX)/bin

INSTALL=install

 

Makefile中的“?=”表示,如果該變量之前沒有定義過,則賦值爲/usr/local,否則什麼也不做。

如果不設置環境變量PREFIX或不修改Makefile中的值,則默認安裝到/usr/local/bin目錄下。建議不要使用默認配置,而是指定安裝目錄,如/data/redis-3.0.5

$ make

$ make install PREFIX=/data/redis-3.0.5

$ ln -s /data/redis-3.0.5 /data/redis

$ mkdir /data/redis/conf

$ mkdir /data/redis/log

$ mkdir /data/redis/data

5. 修改系統參數

5.1. 修改最大可打開文件數

修改文件/etc/security/limits.conf,加入以下兩行:

* soft nofile 102400

* hard nofile 102400

 

# End of file

 

其中102400爲一個進程最大可以打開的文件個數,當與RedisServer的連接數多時,需要設定爲合適的值。

修改後,需要重新登錄纔會生效,如果是crontab,則需要重啓crontab,如:service crond restart,有些平臺可能是service cron restart

5.2. TCP監聽隊列大小

TCP listenbacklog大小,“/proc/sys/net/core/somaxconn”的默認值一般較小如128,需要修改大一點,比如改成32767。立即生效還可以使用命令:sysctl -w net.core.somaxconn=32767

要想永久生效,需要在文件/etc/sysctl.conf中增加一行:net.core.somaxconn = 32767,然後執行命令“sysctl -p”以生效。

5.3. OOM相關:vm.overcommit_memory

如果“/proc/sys/vm/overcommit_memory”的值爲0,則會表示開啓了OOM。可以設置爲1關閉OOM,設置方法請參照net.core.somaxconn完成。

5.4. /sys/kernel/mm/transparent_hugepage/enabled

默認值爲“[always] madvise never”,建議設置爲never,以開啓內核的“Transparent Huge Pages (THP)”特性,設置後redis進程需要重啓。爲了永久生效,請將“echo never > /sys/kernel/mm/transparent_hugepage/enabled”加入到文件/etc/rc.local中。

6. 配置redis

https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf下載配置文件(也可直接複製源代碼包中的redis.conf,然後在它的基礎上進行修改),在這個基礎上,進行如下表所示的修改(配置文件名redis-6379.conf中的6379建議設置爲實際使用的端口號):

內存項請自己根據實際配製修改


配置項

配置文件

說明

port

6379

redis-6379.conf

客戶端連接端口,並且總有一個剛好大於10000的端口,這個大的端口用於主從複製和集羣內部通訊。

cluster-config-file

nodes-6379.conf

 

pidfile

/var/run/redis-6379.pid

只有當daemonize值爲yes時,纔有意義;並且這個要求對目錄/var/run有寫權限,否則可以考慮設置爲/tmp/redis-6379.pid

dir

/data/redis/data/6379

 

dbfilename

dump-6379.rdb

位於dir指定的目錄下

appendfilename

"appendonly-6379.aof"

 

logfile

/data/redis/log/redis-6379.log

日誌文件,包含目錄和文件名

loglevel

verbose

 

日誌級別

port

6380

redis-6380.conf

 

cluster-config-file

nodes-6380.conf

 

pidfile

/var/run/redis-6380.pid

 

dir

/data/redis/data/6380

AOFRDB文件存放目錄

dbfilename

dump-6380.rdb

RDB文件名

appendfilename

appendonly-6380.aof

AOF文件名

logfile

/data/redis/log/redis-6380.log

 

loglevel

verbose

日誌級別

cluster-enabled

yes

redis.conf

表示以集羣方式運行,爲no表示以非集羣方式運行

cluster-node-timeout

3000

單位爲毫秒:

repl-ping-slave-period+

(cluster-node-timeout*

cluster-slave-validity-factor)

cluster-slave-validity-factor

0

如果要最大的可用性,值設置爲0

repl-ping-slave-period

1

slave ping master的時間間隔,單位爲秒

repl-timeout

10

複製超時,單位爲秒,須大於repl-ping-slave-period的值

slave-read-only

yes

slave是否只讀

slave-serve-stale-data

yes

slavemaster斷開連接,slave是否繼續提供服務

slave-priority

100

slave權重值,當master掛掉,只有權重最大的slave接替master

appendonly

yes

當同時寫AOFRDB,則redis啓動時只會加載AOFAOF包含了全量數據

daemonize

yes

相關配置項pidfile

protected-mode

no

3.2.0新增的配置項,默認值爲yes,限制從其它機器登錄Redis server,而只能從127.0.0.1登錄。爲保證redis-trib.rb工具的正常運行,需要設置爲no,完成後可以改回yes,但每次使用redis-trib.rb都需要改回爲no。要想從非127.0.0.1訪問也需要改爲no

tcp-backlog

32767

取值不能超過系統的/proc/sys/net/core/somaxconn

auto-aof-rewrite-percentage

100

設置自動rewite AOF文件(手工rewrite只需要調用命令BGREWRITEAOF

auto-aof-rewrite-min-size

64mb

觸發rewriteAOF文件大小,只有大於此大小時纔會觸發rewrite

no-appendfsync-on-rewrite

yes

子進程在做rewrite時,主進程不調用fsync(由內核默認調度)

cluster-require-full-coverage

no

no表示有slots不可服務時其它slots仍然繼續服務

7. 啓動redis實例

登錄3臺物理機,啓動兩個redis實例(啓動之前,需要創建好配置中的各目錄):

1) redis-server redis-6379.conf

2) redis-server redis-6380.conf

 

可以寫一個啓動腳本start-redis-cluster.sh

#!/bin/sh

 

REDIS_HOME=/data/redis

$REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis-6379.conf

$REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis-6380.conf

8. 創建和啓動redis cluster前的準備工作

上一步啓動的redis只是單機版本,在啓動redis cluster之前,需要完成如下一些依賴的安裝。在此之後,纔可以創建和啓動redis cluster

8.1. 安裝ruby

安裝命令:yum install ruby

安裝過程中,如提示“[y/d/N]”,請選“y”然後回車。

 

查看版本:

$ ruby --version

ruby 2.0.0p353 (2013-11-22) [x86_64-Linux]

 

也可以從Ruby官網https://www.ruby-lang.org下載安裝包(如ruby-2.3.1.tar.gz)來安裝Ruby。截至2016/5/13Ruby的最新穩定版本爲Ruby 2.3.1

8.2. 安裝rubygems

安裝命令:yum install rubygems

如果不使用yum安裝,也可以手動安裝RubyGemsRubyGems是一個Ruby包管理框架,它的下載網址:https://rubygems.org/pages/download

比如下載安裝包rubygems-2.6.4.zip後解壓,然後進入解壓生成的目錄,裏面有個setup.rb文件,以root用戶執行:ruby setup.rb安裝RubyGems

8.3. 安裝redis-3.0.0.gem

安裝命令:gem install -l redis-3.0.0.gem

 

安裝之前,需要先下載好redis-3.0.0.gem

redis-3.0.0.gem官網:https://rubygems.org/gems/redis/versions/3.0.0

redis-3.0.0.gem下載網址:https://rubygems.org/downloads/redis-3.0.0.gem

redis-3.3.0.gem官網:https://rubygems.org/gems/redis/versions/3.3.0

9. redis-trib.rb

redis-trib.rbredis官方提供的redis cluster管理工具,使用ruby實現。

10. 創建和啓動redis集羣

10.1. 複製redis-trib.rb

將redis源代碼src目錄下的集羣管理程序redis-trib.rb複製到/data/redis/bin目錄,並將bin目錄加入到環境變量PATH中,以簡化後續的操作。

redis-trib.rb用法(不帶任何參數執行redis-trib.rb即顯示用法):

$ ./redis-trib.rb

Usage: redis-trib <command> <options> <arguments ...>

 

  rebalance       host:port

                  --auto-weights

                  --timeout <arg>

                  --pipeline <arg>

                  --use-empty-masters

                  --weight <arg>

                  --threshold <arg>

                  --simulate

  add-node        new_host:new_port existing_host:existing_port

                  --slave

                  --master-id <arg>

  reshard         host:port

                  --timeout <arg>

                  --pipeline <arg>

                  --yes

                  --slots <arg>

                  --to <arg>

                  --from <arg>

  check           host:port

  set-timeout     host:port milliseconds

  call            host:port command arg arg .. arg

  fix             host:port

                  --timeout <arg>

  info            host:port

  create          host1:port1 ... hostN:portN

                  --replicas <arg>

  import          host:port

                  --replace

                  --copy

                  --from <arg>

  help            (show this help)

  del-node        host:port node_id

 

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

 

10.2. 創建redis cluster

創建命令(33):

redis-trib.rb create --replicas 1 192.168.0.251:6379 192.168.0.252:6379 192.168.0.253:6379 192.168.0.251:6380 192.168.0.252:6380 192.168.0.253:6380

 

Ø 參數說明:

1) create

表示創建一個redis cluster集羣。

2) --replicas 1

表示爲集羣中的每一個主節點指定一個從節點,即一比一的複製。\

 

運行過程中,會有個提示,輸入yes回車即可。從屏幕輸出,可以很容易地看出哪些是主(master)節點,哪些是從(slave)節點:

>>> Creating cluster

Connecting to node 192.168.0.251:6379: OK

/usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: wrong element type nil at 0 (expected array)

/usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: ignoring wrong elements is deprecated, remove them explicitly

/usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.0.251:6379

192.168.0.252:6379

192.168.0.253:6379

Adding replica 192.168.0.252:6380 to 192.168.0.251:6379

Adding replica 192.168.0.251:6380 to 192.168.0.252:6379

Adding replica 192.168.0.253:6380 to 192.168.0.253:6379

M: 150f77d1000003811fb3c38c3768526a0b25ec31 192.168.0.251:6379

   slots:0-5460 (5461 slots) master

M: de461d3337b17d2119b79024d57d8b119e7320a6 192.168.0.252:6379

   slots:5461-10922 (5462 slots) master

M: faf50658fb7b0bae64cee5371da782e0f4919eee 192.168.0.253:6379

   slots:10923-16383 (5461 slots) master

S: c567db02cc40eebf577f71f703214dd2f4f26dfb 192.168.0.251:6380

   replicates de461d3337b17d2119b79024d57d8b119e7320a6

S: 284f8196b250ad9ac272316db84a07bebf661ab7 192.168.0.252:6380

   replicates 150f77d1000003811fb3c38c3768526a0b25ec31

S: 39fdef9fd5778dc94d8add819789d7d73ca06899 192.168.0.253:6380

   replicates faf50658fb7b0bae64cee5371da782e0f4919eee

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join....

>>> Performing Cluster Check (using node 192.168.0.251:6379)

M: 150f77d1000003811fb3c38c3768526a0b25ec31 192.168.0.251:6379

   slots:0-5460 (5461 slots) master

M: de461d3337b17d2119b79024d57d8b119e7320a6 192.168.0.252:6379

   slots:5461-10922 (5462 slots) master

M: faf50658fb7b0bae64cee5371da782e0f4919eee 192.168.0.253:6379

   slots:10923-16383 (5461 slots) master

M: c567db02cc40eebf577f71f703214dd2f4f26dfb 192.168.0.251:6380

   slots: (0 slots) master

   replicates de461d3337b17d2119b79024d57d8b119e7320a6

M: 284f8196b250ad9ac272316db84a07bebf661ab7 192.168.0.252:6380

   slots: (0 slots) master

   replicates 150f77d1000003811fb3c38c3768526a0b25ec31

M: 39fdef9fd5778dc94d8add819789d7d73ca06899 192.168.0.253:6380

   slots: (0 slots) master

   replicates faf50658fb7b0bae64cee5371da782e0f4919eee

[OKAll nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

10.3. ps aux|grep redis

[test@test-168-251 ~]$ ps aux|grep redis

test   3824  0.7  5.9 6742404 3885144 ?    Ssl   2015 1639:13 /data/redis/bin/redis-server *:6379 [cluster]

test   3831  0.5  3.9 6709636 2618536 ?    Ssl   2015 1235:43 /data/redis/bin/redis-server *:6380 [cluster]

 

停止redis實例,直接使用kill命令即可,如:kill 3831,重啓和單機版相同,經過上述一系列操作後,重啓會自動轉換成cluster模式。。

11. redis cluster client

11.1. 命令行工具redis-cli

官方提供的命令行客戶端工具,在單機版redis基礎上指定參數“-c”即可。以下是在192.168.0.251上執行redis-cli的記錄:

$ ./redis-cli -c -p 6379

127.0.0.1:6379> set foo bar

-> Redirected to slot [12182] located at 192.168.0.253:6379

OK

192.168.0.253:6379> set hello world

-> Redirected to slot [866] located at 192.168.0.251:6379

OK

192.168.0.251:6379> get foo

-> Redirected to slot [12182] located at 192.168.0.253:6379

"bar"

192.168.0.253:6379> get hello

-> Redirected to slot [866] located at 192.168.0.251:6379

"world"

 

查看集羣中的節點:

192.168.0.251:6379> cluster nodes

11.2. 從slaves讀數據

默認不能從slaves讀取數據,但建立連接後,執行一次命令READONLY ,即可從slaves讀取數據。如果想再次恢復不能從slaves讀取數據,可以執行下命令READWRITE

11.3. jedisjava cluster client

官網:https://github.com/xetorthio/jedis

編程示例:

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

//Jedis Cluster will attempt to discover cluster nodes automatically

jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));

JedisCluster jc = new JedisCluster(jedisClusterNodes);

jc.set("foo", "bar");

String value = jc.get("foo");

11.4. r3cC++ cluster client

官網:https://github.com/eyjian/r3c

12. 新增節點

12.1. 添加一個新主(master)節點

先以單機版配置和啓動好redis-server,然後執行命令:

./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

 

執行上面這條命令時,可能遇到錯誤“[ERR] Sorry, can't connect to node 127.0.0.1:7006”。引起該問題的原因可能是因爲ruby的版本過低(運行ruby -v可以查看ruby的版本),可以嘗試升級ruby再嘗試,比如ruby 1.8.7版本就需要升級。對於Redis 3.0.5Redis 3.2.0,使用Ruby 2.3.1操作正常。請注意升級到最新版本的ruby也可能遇到這個錯誤。

 

另一個會引起這個問題的原因是從Redis 3.2.0版本開始引入了“保護模式(protected mode),防止redis-cli遠程訪問”,僅限redis-cli綁定到127.0.0.1纔可以連接Redis server

爲了完成添加新主節點,可以暫時性的關閉保護模式,使用redis-cli,不指定-h參數(但可以指定-p參數,或者-h參數值爲127.0.0.1)進入操作界面:CONFIG SET protected-mode no

 

注意7006是新增的節點,而7000是已存在的節點(可爲masterslave)。如果需要將7006變成某masterslave節點,執行命令:

cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

 

新加入的master節點上沒有任何數據(slots,運行redis命令cluster nodes可以看到這個情況)。當一個slave想成爲master時,由於這個新的master節點不管理任何slots,它不參與選舉。

可以使用工具redis-trib.rbresharding特性爲這個新master節點分配slots,如:

redis-trib.rb reshard 127.0.0.1:7000,其中7000爲集羣中任意一個節點即可,redis-trib.rb將自動發現其它節點。

reshard過程中,將會詢問reshard多少slots

How many slots do you want to move (from 1 to 16384)?,取值範圍爲1~16384,其中16384redis cluster的擁有的slots總數,比如想只移動100個,輸入100即可。如果遷移的slots數量多,應當設置redis-trib.rb的超時參數--timeout值大一點。否則,遷移過程中易遇到超時錯誤“[ERR] Calling MIGRATE: IOERR error or timeout reading to target instance”,導致只完成部分,可能會造成數據丟失。

接着,會提示“What is the receiving node ID?”,輸入新加入的master節點ID。過程中如果遇到錯誤“Sorry, can't connect to node 10.225.168.253:6380”,則可能需要暫時先關閉相應的保護模式。

 

如果在遷移過程遇到下面這樣的錯誤:

>>> Check for open slots...

[WARNING] Node 192.168.0.3:6379 has slots in importing state (5461).

[WARNING] Node 192.168.0.5:6380 has slots in migrating state (5461).

[WARNING] The following slots are open: 5461

 

可以考慮使用命令“redis-trib.rb fix 192.168.0.3:6379”嘗試修復。需要顯示有節點處於migrating或importing狀態,可以登錄到相應的節點,使用命令“cluster setslot 5461 stable”修改,參數5461爲問題顯示的slotID

12.2. 添加一個新從(slave)節點

./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000

 

注意這種方式,如果添加了多個slave節點,可能導致masterslaves不均衡,比如一些有3slave,其它只1slave。可以在slave節點上執行redis命令“CLUSTER REPLICATE”進行調整,讓它成爲其它masterslave。“CLUSTER REPLICATE”帶一個參數,即master ID,注意使用redis-cli -c登錄到slave上執行。

上面方法沒有指定7006master,而是隨機指定。下面方法可以明確指定爲哪個masterslave

./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000

 

13. 刪除節點

從集羣中刪除一個節點:

./redis-trib del-node 127.0.0.1:7000 `<node-id>`

 

第一個參數爲集羣中任意一個節點,第二個參數爲需要刪除節點的ID

 

CLUSTER FORGET <node-id>

 

注意如果是刪除一個master節點,則需要先將它管理的slots的遷走,然後纔可以刪除它。

14. 檢查節點狀態

redis-trib.rb check 127.0.0.1:6380

 

如發現如下這樣的錯誤:

[WARNING] Node 192.168.0.11:6380 has slots in migrating state (5461).

[WARNING] The following slots are open: 5461

 

可以使用redis命令取消slots遷移(5461爲slotID):

cluster setslot 5461 stable

需要注意,須登錄到192.168.0.11:6380上執行redissetslot子命令。

15. slots相關命令

CLUSTER ADDSLOTS slot1 [slot2] ... [slotN]

CLUSTER DELSLOTS slot1 [slot2] ... [slotN]

CLUSTER SETSLOT slot NODE node

CLUSTER SETSLOT slot MIGRATING node

CLUSTER SETSLOT slot IMPORTING node

 

15.1. 遷移slosts

示例:將slot8從節點A遷移到節點B,有如下兩種方法:

在節點B上執行:CLUSTER SETSLOT 8 IMPORTING A

在節點A上執行:CLUSTER SETSLOT 8 MIGRATING B

15.2. redis-trib.rb rebalance

當有增減節點時,可以使用命令:

redis-trib.rb rebalance 192.168.0.31:6379 --auto-weights

做一次均衡,簡單點可以只指定兩個參數:“192.168.0.31:6379”爲集羣中已知的任何一個節點,參數“-auto-weights”表示自動權重。

16. 人工主備切換

在需要的slaves節點上執行命令:CLUSTER FAILOVER

17. 查看集羣信息

對應的redis命令爲:cluster info,示例:

127.0.0.1:6381> cluster info

cluster_state:ok 所有slots正常則顯示爲OK,否則爲error

cluster_slots_assigned:16384 多少slots被分配了,即多少被master管理了,16384爲全部slots

cluster_slots_ok:16384 有多少slots是正常的

cluster_slots_pfail:0 有多少slots可能處於異常狀態,處於這個狀態並不表示有問題,仍能繼續提供服務

cluster_slots_fail:0 有多少slots處於異常狀態,需要修復才能服務

cluster_known_nodes:10 集羣中的節點數

cluster_size:3 集羣中master個數

cluster_current_epoch:11 本地的當前時間變量,用於故障切換時生成獨一無二的增量版本號

cluster_my_epoch:0

cluster_stats_messages_sent:4049 通過集羣消息總線發送的消息總數

cluster_stats_messages_received:4051 通過集通過羣消息總線收到的消息總數

 

18. 問題排查

1) 如果最後一條日誌爲“16367:M 08 Jun 14:48:15.560 # Server started, Redis version 3.2.0”,節點狀態始終終於fail狀態,則可能是aof文件損壞了,這時可以使用工具edis-check-aof --fix進行修改,如:

../../bin/redis-check-aof --fix appendonly-6380.aof 

0x        a1492b9b: Expected prefix '

AOF analyzed: size=2705928192, ok_up_to=2705927067, diff=1125

This will shrink the AOF from 2705928192 bytes, with 1125 bytes, to 2705927067 bytes

Continue? [y/N]: y

 

發佈了170 篇原創文章 · 獲贊 75 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章