ZooKeeper系列(二) Zookeeper的環(huán)境配置

一、Zookeeper的搭建方式

Zookeeper安裝方式有三種,單機(jī)模式和集群模式以及偽集群模式缠诅。

1.單機(jī)模式:Zookeeper只運(yùn)行在一臺服務(wù)器上溶浴,適合測試環(huán)境;

2.偽集群模式:就是在一臺物理機(jī)上運(yùn)行多個Zookeeper 實例管引。

3.集群模式:Zookeeper運(yùn)行于一個集群上士败,適合生產(chǎn)環(huán)境,這個計算機(jī)集群被稱為一個“集合體”(ensemble)汉匙。

Zookeeper通過復(fù)制來實現(xiàn)高可用性,只要集合體中半數(shù)以上的機(jī)器處于可用狀態(tài)生蚁,它就能夠保證服務(wù)繼續(xù)噩翠。為什么一定要超過半數(shù)呢?這跟Zookeeper的復(fù)制策略有關(guān):zookeeper確保對znode 樹的每一個修改都會被復(fù)制到集合體中超過半數(shù)的機(jī)器上邦投。

1.1 Zookeeper的單機(jī)模式搭建

(1)下載ZooKeeper:http://pan.baidu.com/s/1pJlwbR9

(2)解壓:tar -zxvf zookeeper-3.4.5.tar.gz 重命名:mv zookeeper-3.4.5 zk

(3)配置文件:在conf目錄下刪除zoo_sample.cfg文件伤锚,創(chuàng)建一個配置文件zoo.cfg

tickTime=2000
dataDir=/usr/local/zk/data
dataLogDir=/usr/local/zk/dataLog        
clientPort=2181

(4)配置環(huán)境變量:為了今后操作方便志衣,我們需要對Zookeeper的環(huán)境變量進(jìn)行配置屯援,方法如下在/etc/profile文件中加入如下內(nèi)容:

export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.:HADOOP H OME/bin: ZOOKEEPER_HOME/bin:JAVA H OME/bin: PATH

(5)啟動ZooKeeper的Server:zkServer.sh start;關(guān)閉ZooKeeper的Server:zkServer.sh stop

1.2 Zookeeper的偽集群模式搭建

Zookeeper不但可以在單機(jī)上運(yùn)行單機(jī)模式Zookeeper念脯,而且可以在單機(jī)模擬集群模式 Zookeeper的運(yùn)行狞洋,也就是將不同節(jié)點運(yùn)行在同一臺機(jī)器。我們知道偽分布模式下Hadoop的操作和分布式模式下有著很大的不同绿店,但是在集群為分布 式模式下對Zookeeper的操作卻和集群模式下沒有本質(zhì)的區(qū)別吉懊。顯然,集群偽分布式模式為我們體驗Zookeeper和做一些嘗試性的實驗提供了很大 的便利假勿。比如借嗽,我們在實驗的時候,可以先使用少量數(shù)據(jù)在集群偽分布模式下進(jìn)行測試转培。當(dāng)測試可行的時候恶导,再將數(shù)據(jù)移植到集群模式進(jìn)行真實的數(shù)據(jù)實驗。這樣不 但保證了它的可行性浸须,同時大大提高了實驗的效率惨寿。這種搭建方式,比較簡便删窒,成本比較低缤沦,適合測試和學(xué)習(xí),如果你的手頭機(jī)器不足易稠,就可以在一臺機(jī)器上部署了 3個server缸废。

1.2.1. 注意事項

在一臺機(jī)器上部署了3個server,需要注意的是在集群為分布式模式下我們使用的每個配置文檔模擬一臺機(jī)器,也就是說單臺機(jī)器及上運(yùn)行多個Zookeeper實例企量。但是测萎,必須保證每個配置文檔的各個端口號不能沖突,除了clientPort不同之外届巩,dataDir也不同硅瞧。另外,還要在dataDir所對應(yīng)的目錄中創(chuàng)建myid文件來指定對應(yīng)的Zookeeper服務(wù)器實例恕汇。

(1)clientPort端口:如果在1臺機(jī)器上部署多個server腕唧,那么每臺機(jī)器都要不同的 clientPort,比如 server1是2181,server2是2182瘾英,server3是2183枣接,

(2)dataDir和dataLogDir:dataDir和dataLogDir也需要區(qū)分下,將數(shù)據(jù)文件和日志文件分開存放缺谴,同時每個server的這兩變量所對應(yīng)的路徑都是不同的但惶。

(3)server.X和myid: server.X 這個數(shù)字就是對應(yīng),data/myid中的數(shù)字湿蛔。在3個server的myid文件中分別寫入了0膀曾,1,2阳啥,那么每個server中的zoo.cfg都配 server.0 server.2,server.3就行了添谊。因為在同一臺機(jī)器上,后面連著的2個端口察迟,3個server都不要一樣碉钠,否則端口沖突。

下面是我所配置的集群偽分布模式卷拘,分別通過zoo1.cfg喊废、zoo2.cfg、zoo3.cfg來模擬由三臺機(jī)器的Zookeeper集群栗弟。詳見下圖1.1-1.3

代碼清單 1.1 zoo1.cfg

# The number of milliseconds of each tick
tickTime=2000

# The number of ticks that the initial
# synchronization phase can take
initLimit=10

# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5

# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_1

# the port at which the clients will connect
clientPort=2181

#the location of the log file
dataLogDir=/usr/local/zk/logs_1

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

代碼清單 1.2 zoo2.cfg

# The number of milliseconds of each tick
tickTime=2000

# The number of ticks that the initial
# synchronization phase can take
initLimit=10

# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5

# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_2

# the port at which the clients will connect
clientPort=2182

#the location of the log file
dataLogDir=/usr/local/zk/logs_2

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

代碼清單 zoo3.cfg

# The number of milliseconds of each tick
tickTime=2000

# The number of ticks that the initial
# synchronization phase can take
initLimit=10

# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5

# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_3

# the port at which the clients will connect
clientPort=2183

#the location of the log file
dataLogDir=/usr/local/zk/logs_3

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

1.2.2 啟動

在集群為分布式下污筷,我們只有一臺機(jī)器,按時要運(yùn)行三個Zookeeper實例乍赫。此時瓣蛀,如果在使用單機(jī)模式的啟動命令是行不通的。此時雷厂,只要通過下面三條命令就能運(yùn)行前面所配置的Zookeeper服務(wù)惋增。如下所示:

zkServer.sh start zoo1.sh
zkServer.sh start zoo2.sh
zkServer.sh start zoo3.sh

啟動過程,如下圖1.4-1.5所示:

這里寫圖片描述

圖 1.4

[站外圖片上傳中...(image-3744f9-1510797174100)]

圖 1.5

在運(yùn)行完第一條指令之后改鲫,會出現(xiàn)一些錯誤異常诈皿,產(chǎn)生異常信息的原因是由于Zookeeper服務(wù)的每個實例都擁有全局配置信息林束,他們在啟動的時候會隨時隨地的進(jìn)行Leader選舉操作。此時稽亏,第一個啟動的Zookeeper需要和另外兩個Zookeeper實例進(jìn)行通信壶冒。但是,另外兩個Zookeeper實例還沒有啟動起來截歉,因此就產(chǎn)生了這樣的異樣信息胖腾。

我們直接將其忽略即可,待把圖中“2號”和“3號”Zookeeper實例啟動起來之后瘪松,相應(yīng)的異常信息自然會消失咸作。此時,可以通過下面三條命令宵睦,來查詢记罚。

zkServer.sh status zoo1.cfg
zkServer.sh status zoo2.cfg
zkServer.sh status zoo3.cfg

Zookeeper服務(wù)的運(yùn)行狀態(tài),如圖1.6状飞。

這里寫圖片描述

圖 1.6

1.3 Zookeeper的集群模式搭建

為了獲得可靠地Zookeeper服務(wù)毫胜,用戶應(yīng)該在一個機(jī)群上部署Zookeeper书斜。只要機(jī)群上大多數(shù)的Zookeeper服務(wù)啟動了诬辈,那么總的Zookeeper服務(wù)將是可用的。集群的配置方式荐吉,和前兩種類似焙糟,同樣需要進(jìn)行環(huán)境變量的配置。在每臺機(jī)器上conf/zoo.cf配置文件的參數(shù)設(shè)置相同

1.3.1 創(chuàng)建myid

在dataDir(/usr/local/zk/data)目錄創(chuàng)建myid文件

Server0機(jī)器的內(nèi)容為:0

Server1機(jī)器的內(nèi)容為:1

Server2機(jī)器的內(nèi)容為:2

1.3.2 編寫配置文件

在conf目錄下刪除zoo_sample.cfg文件样屠,創(chuàng)建一個配置文件zoo.cfg穿撮,如圖2.4所示。

代碼清單 2.4 zoo.cfg中的參數(shù)設(shè)置

# The number of milliseconds of each tick
tickTime=2000

# The number of ticks that the initial
# synchronization phase can take
initLimit=10

# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5

# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data

# the port at which the clients will connect
clientPort=2183

#the location of the log file
dataLogDir=/usr/local/zk/log

server.0=hadoop:2288:3388
server.1=hadoop0:2288:3388
server.2=hadoop1:2288:3388

1.3.3 啟動

分別在3臺機(jī)器上啟動ZooKeeper的Server:zkServer.sh start痪欲;

二悦穿、Zookeeper的配置

Zookeeper的功能特性是通過Zookeeper配置文件來進(jìn)行控制管理的(zoo.cfg).這樣的設(shè)計其實有其自身的原因,通過前面對Zookeeper的配置可以看出业踢,在對Zookeeper集群進(jìn)行配置的時候栗柒,它的配置文檔是完全相同的。集群偽分布模式中知举,有少部分是不同的瞬沦。這樣的配置方式使得在部署Zookeeper服務(wù)的時候非常方便。如果服務(wù)器使用不同的配置文件雇锡,必須確保不同配置文件中的服務(wù)器列表相匹配逛钻。

在設(shè)置Zookeeper配置文檔時候,某些參數(shù)是可選的锰提,某些是必須的曙痘。這些必須參數(shù)就構(gòu)成了Zookeeper配置文檔的最低配置要求芳悲。另外,若要對Zookeeper進(jìn)行更詳細(xì)的配置屡江,可以參考下面的內(nèi)容芭概。

2.1 基本配置

下面是在最低配置要求中必須配置的參數(shù):

1.client:監(jiān)聽客戶端連接的端口。

2.tickTime:基本事件單元惩嘉,這個時間是作為Zookeeper服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔罢洲,每隔tickTime時間就會發(fā)送一個心跳;最小的session過期時間為2倍tickTime

3.dataDir:存儲內(nèi)存中數(shù)據(jù)庫快照的位置文黎,如果不設(shè)置參數(shù)惹苗,更新食物的日志將被存儲到默認(rèn)位置。

應(yīng)該謹(jǐn)慎的選擇日志存放的位置耸峭,使用專用的日志存儲設(shè)備能夠大大提高系統(tǒng)的性能桩蓉,如果將日志存儲在比較繁忙的存儲設(shè)備上,那么將會很大程度上影像系統(tǒng)性能劳闹。

2.2 高級配置

下面是高級配置參數(shù)中可選配置參數(shù)院究,用戶可以使用下面的參數(shù)來更好的規(guī)定Zookeeper的行為:

(1)dataLogdDir

這個操作讓管理機(jī)器把事務(wù)日志寫入“dataLogDir”所指定的目錄中,而不是“dataDir”所指定的目錄本涕。這將允許使用一個專用的日志設(shè)備业汰,幫助我們避免日志和快照的競爭。配置如下:

# the directory where the snapshot is stored
dataDir=/usr/local/zk/data

(2)maxClientCnxns

這個操作將限制連接到Zookeeper的客戶端數(shù)量菩颖,并限制并發(fā)連接的數(shù)量样漆,通過IP來區(qū)分不同的客戶端。此配置選項可以阻止某些類別的Dos攻擊晦闰。將他設(shè)置為零或忽略不進(jìn)行設(shè)置將會取消對并發(fā)連接的限制放祟。

例如,此時我們將maxClientCnxns的值設(shè)為1呻右,如下所示:

# set maxClientCnxns
maxClientCnxns=1

啟動Zookeeper之后跪妥,首先用一個客戶端連接到Zookeeper服務(wù)器上。之后如果有第二個客戶端嘗試對Zookeeper進(jìn)行連接声滥,或者有某些隱式的對客戶端的連接操作眉撵,將會觸發(fā)Zookeeper的上述配置。

(3)minSessionTimeout和maxSessionTimeout

即最小的會話超時和最大的會話超時時間醒串。在默認(rèn)情況下执桌,minSession=2tickTime;maxSession=20tickTime芜赌。

2.3 集群配置

(1)initLimit

此配置表示仰挣,允許follower(相對于Leaderer言的“客戶端”)連接并同步到Leader的初始化連接時間,以tickTime為單位缠沈。當(dāng)初始化連接時間超過該值膘壶,則表示連接失敗错蝴。

(2)syncLimit

此配置項表示Leader與Follower之間發(fā)送消息時,請求和應(yīng)答時間長度颓芭。如果follower在設(shè)置時間內(nèi)不能與leader通信顷锰,那么此follower將會被丟棄。

(3)server.A=B:C:D

A:其中 A 是一個數(shù)字亡问,表示這個是服務(wù)器的編號官紫;

B:是這個服務(wù)器的 ip 地址;

C:Leader選舉的端口州藕;

D:Zookeeper服務(wù)器之間的通信端口束世。

(3)myid和zoo.cfg

除了修改 zoo.cfg 配置文件,集群模式下還要配置一個文件 myid床玻,這個文件在 dataDir 目錄下毁涉,這個文件里面就有一個數(shù)據(jù)就是 A 的值,Zookeeper 啟動時會讀取這個文件锈死,拿到里面的數(shù)據(jù)與 zoo.cfg 里面的配置信息比較從而判斷到底是那個 server贫堰。

三、搭建ZooKeeper服務(wù)器集群

搭建要求:

1> zk服務(wù)器集群規(guī)模不小于3個節(jié)點

2> 要求各服務(wù)器之間系統(tǒng)時間要保持一致待牵。

3.1 安裝配置ZK

(1)使用WinScp將Zk傳輸?shù)紿adoop主機(jī)上的/usr/local其屏,我用的版本是zookeeper-3.4.5.tar.gz。

(2)在hadoop的/usr/local目錄下洲敢,解壓縮zk....tar.gz漫玄,設(shè)置環(huán)境變量

a解壓縮:在/usr/local目錄下茄蚯,執(zhí)行命令:tar -zxvf zookeeper-3.4.5.tar.gz压彭,如圖2.1。

[站外圖片上傳中...(image-80be68-1510797174100)]

圖 2.1

b重命名:解壓后將文件夾渗常,重命名為zk壮不,執(zhí)行命令: mv zookeeper-3.4.5 zk如圖2.2。

這里寫圖片描述

圖 2.2

c)設(shè)置環(huán)境變量:執(zhí)行命令: vi /etc/profile 皱碘,添加 :export ZOOKEEPER_HOME=/usr/local/zk询一,如圖2.3所示的內(nèi)容。執(zhí)行命令:source /etc/profile 如圖2.4所示癌椿。

這里寫圖片描述

圖 2.3

[站外圖片上傳中...(image-21eff8-1510797174100)]

圖2.4

3.2 修改ZK配置文件

(1)重命名:將/usr/local/zk/conf目錄下zoo_sample.cfg健蕊,重命名為zoo.cfg,執(zhí)行命令:mv zoo_sample.cfg zoo.cfg踢俄。如圖2.5所示缩功。

[站外圖片上傳中...(image-32209-1510797174100)]

圖 2.5

(2)查看:在/usr/local/zk/conf目錄下,修改文件 vi zoo.cfg都办,文件內(nèi)容如下圖2.6所示嫡锌。在該文件中dataDir表示文件存放目錄虑稼,它的默認(rèn)設(shè)置為/tmp/zookeeper這是一個臨時存放目錄,每次重啟后會丟失势木,在這我們自己設(shè)一個目錄蛛倦,/usr/local/zk/data。

[站外圖片上傳中...(image-918ca0-1510797174100)]

圖 2.6

(2)創(chuàng)建文件夾:mkdir /usr/local/zk/data

(3)創(chuàng)建myid:在data目錄下啦桌,創(chuàng)建文件myid溯壶,值為0;vi myid ;內(nèi)容為0甫男。

(4)編輯:編輯該文件茸塞,執(zhí)行vi zoo.cfg ,修改dataDir=/usr/local/zk/data查剖。

新增:server.0=hadoop:2888:3888

server.1=hadoop0:2888:3888

server.2=hadoop1:2888:3888

tickTime :這個時間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔钾虐,也就是每個 tickTime 時間就會發(fā)送一個心跳;

dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄笋庄,默認(rèn)情況下效扫,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個目錄里;

clientPort:這個端口就是客戶端連接 Zookeeper 服務(wù)器的端口直砂,Zookeeper 會監(jiān)聽這個端口菌仁,接受客戶端的訪問請求。

當(dāng)這些配置項配置好后静暂,就可以啟動 Zookeeper 了济丘,啟動后使用命令echo ruok | nc localhost 2181檢查 Zookeeper 是否已經(jīng)在服務(wù)。

3.3 配置其他節(jié)點

(1)把haooop主機(jī)的zk目錄和/etc/profile目錄洽蛀,復(fù)制到hadoop0和hadoop1中摹迷。執(zhí)行命令:

scp -r /usr/local/zk/ hadoop0:/usr/local/
scp -r /usr/local/zk/ hadoop1:/usr/local/
scp /etc/profile hadoop0:/etc/
scp /etc/profile hadoop1:/etc/

ssh hadoop0
suorce /etc/profile
vi /usr/local/zk/data/myid
exit

ssh hadoop1
suorce /etc/profile
vi /usr/local/zk/data/myid
exit

(2)把hadoop1中相應(yīng)的myid的值改為1,把hadoop2中相應(yīng)的myid的值改為2郊供。

四峡碉、啟動檢驗

(1)啟動,在三個節(jié)點上分別執(zhí)行命令zkServer.sh start

hadoop節(jié)點:如圖3.1所示驮审。

[站外圖片上傳中...(image-c7bc4b-1510797174100)]

圖 3.1

hadoop0節(jié)點:如圖3.2所示鲫寄。

[站外圖片上傳中...(image-ecd7b6-1510797174100)]

圖 3.2

hadoop1節(jié)點:如圖3.3所示。

[站外圖片上傳中...(image-9ed439-1510797174100)]

圖 3.3

(2)檢驗疯淫,在三個節(jié)點上分別執(zhí)行命令zkServer.sh status地来,從下面的圖中我們會發(fā)現(xiàn)hadoop和hadoop1為Follower,hadoop0為Leader熙掺。

hadoop節(jié)點:如圖3.4

[站外圖片上傳中...(image-6ee562-1510797174100)]

圖 3.4

hadoop0節(jié)點:如圖3.5

[站外圖片上傳中...(image-6687ff-1510797174100)]

圖 3.5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末未斑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子适掰,更是在濱河造成了極大的恐慌颂碧,老刑警劉巖荠列,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異载城,居然都是意外死亡肌似,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門诉瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川队,“玉大人,你說我怎么就攤上這事睬澡」潭睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵煞聪,是天一觀的道長斗躏。 經(jīng)常有香客問我,道長昔脯,這世上最難降的妖魔是什么啄糙? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮云稚,結(jié)果婚禮上隧饼,老公的妹妹穿的比我還像新娘。我一直安慰自己静陈,他們只是感情好燕雁,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲸拥,像睡著了一般拐格。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崩泡,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天禁荒,我揣著相機(jī)與錄音猬膨,去河邊找鬼角撞。 笑死,一個胖子當(dāng)著我的面吹牛勃痴,可吹牛的內(nèi)容都是我干的谒所。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼沛申,長吁一口氣:“原來是場噩夢啊……” “哼劣领!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铁材,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤尖淘,失蹤者是張志新(化名)和其女友劉穎奕锌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體村生,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡惊暴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁桃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽话。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卫病,靈堂內(nèi)的尸體忽然破棺而出油啤,到底是詐尸還是另有隱情,我是刑警寧澤蟀苛,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布益咬,位于F島的核電站,受9級特大地震影響帜平,放射性物質(zhì)發(fā)生泄漏础废。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一罕模、第九天 我趴在偏房一處隱蔽的房頂上張望评腺。 院中可真熱鬧,春花似錦淑掌、人聲如沸蒿讥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芋绸。三九已至,卻和暖如春担敌,著一層夾襖步出監(jiān)牢的瞬間摔敛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工全封, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留马昙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓刹悴,卻偏偏與公主長得像行楞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子土匀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容