八 HDFS HA高可用

8.1 HA概述

1)所謂HA(high available)掌动,即高可用(7*24小時(shí)不中斷服務(wù))。

2)實(shí)現(xiàn)高可用最關(guān)鍵的策略是消除單點(diǎn)故障产弹。HA嚴(yán)格來(lái)說(shuō)應(yīng)該分成各個(gè)組件的HA機(jī)制:HDFS的HA和YARN的HA氏身。

3)Hadoop2.0之前,在HDFS集群中NameNode存在單點(diǎn)故障(SPOF)遗契。

4)NameNode主要在以下兩個(gè)方面影響HDFS集群

NameNode機(jī)器發(fā)生意外,如宕機(jī)病曾,集群將無(wú)法使用牍蜂,直到管理員重啟

NameNode機(jī)器需要升級(jí),包括軟件泰涂、硬件升級(jí)鲫竞,此時(shí)集群也將無(wú)法使用

HDFS HA功能通過(guò)配置Active/Standby兩個(gè)nameNodes實(shí)現(xiàn)在集群中對(duì)NameNode的熱備來(lái)解決上述問(wèn)題。如果出現(xiàn)故障逼蒙,如機(jī)器崩潰或機(jī)器需要升級(jí)維護(hù)从绘,這時(shí)可通過(guò)此種方式將NameNode很快的切換到另外一臺(tái)機(jī)器。

8.2 HDFS-HA工作機(jī)制

1)通過(guò)雙namenode消除單點(diǎn)故障

8.2.1 HDFS-HA****工作要點(diǎn)

1)元數(shù)據(jù)管理方式需要改變:

內(nèi)存中各自保存一份元數(shù)據(jù)是牢;

Edits日志只有Active狀態(tài)的namenode節(jié)點(diǎn)可以做寫(xiě)操作僵井;

兩個(gè)namenode都可以讀取edits;

共享的edits放在一個(gè)共享存儲(chǔ)中管理(qjournal和NFS兩個(gè)主流實(shí)現(xiàn))驳棱;

2)需要一個(gè)狀態(tài)管理功能模塊

實(shí)現(xiàn)了一個(gè)zkfailover驹沿,常駐在每一個(gè)namenode所在的節(jié)點(diǎn),每一個(gè)zkfailover負(fù)責(zé)監(jiān)控自己所在namenode節(jié)點(diǎn)蹈胡,利用zk進(jìn)行狀態(tài)標(biāo)識(shí),當(dāng)需要進(jìn)行狀態(tài)切換時(shí)朋蔫,由zkfailover來(lái)負(fù)責(zé)切換罚渐,切換時(shí)需要防止brain split(腦裂)現(xiàn)象的發(fā)生。

3)必須保證兩個(gè)NameNode之間能夠ssh無(wú)密碼登錄驯妄。

4)隔離(Fence)荷并,即同一時(shí)刻僅僅有一個(gè)NameNode對(duì)外提供服務(wù)

8.2.2 HDFS-HA****自動(dòng)故障轉(zhuǎn)移工作機(jī)制

自動(dòng)故障轉(zhuǎn)移為HDFS部署增加了兩個(gè)新組件:ZooKeeper和ZKFailoverController(ZKFC)進(jìn)程。ZooKeeper是維護(hù)少量協(xié)調(diào)數(shù)據(jù)青扔,通知客戶端這些數(shù)據(jù)的改變和監(jiān)視客戶端故障的高可用服務(wù)源织。HA的自動(dòng)故障轉(zhuǎn)移依賴于ZooKeeper的以下功能:

1****)故障檢測(cè):集群中的每個(gè)NameNode在ZooKeeper中維護(hù)了一個(gè)持久會(huì)話翩伪,如果機(jī)器崩潰,ZooKeeper中的會(huì)話將終止谈息,ZooKeeper通知另一個(gè)NameNode需要觸發(fā)故障轉(zhuǎn)移缘屹。

2****)現(xiàn)役****NameNode****選擇:ZooKeeper提供了一個(gè)簡(jiǎn)單的機(jī)制用于唯一的選擇一個(gè)節(jié)點(diǎn)為active狀態(tài)。如果目前現(xiàn)役NameNode崩潰侠仇,另一個(gè)節(jié)點(diǎn)可能從ZooKeeper獲得特殊的排外鎖以表明它應(yīng)該成為現(xiàn)役NameNode轻姿。

ZKFC是自動(dòng)故障轉(zhuǎn)移中的另一個(gè)新組件,是ZooKeeper的客戶端逻炊,也監(jiān)視和管理NameNode的狀態(tài)互亮。每個(gè)運(yùn)行NameNode的主機(jī)也運(yùn)行了一個(gè)ZKFC進(jìn)程,ZKFC負(fù)責(zé):

1****)健康監(jiān)測(cè):ZKFC使用一個(gè)健康檢查命令定期地ping與之在相同主機(jī)的NameNode余素,只要該NameNode及時(shí)地回復(fù)健康狀態(tài)豹休,ZKFC認(rèn)為該節(jié)點(diǎn)是健康的。如果該節(jié)點(diǎn)崩潰桨吊,凍結(jié)或進(jìn)入不健康狀態(tài)威根,健康監(jiān)測(cè)器標(biāo)識(shí)該節(jié)點(diǎn)為非健康的。

2****)****ZooKeeper****會(huì)話管理:當(dāng)本地NameNode是健康的屏积,ZKFC保持一個(gè)在ZooKeeper中打開(kāi)的會(huì)話医窿。如果本地NameNode處于active狀態(tài),ZKFC也保持一個(gè)特殊的znode鎖炊林,該鎖使用了ZooKeeper對(duì)短暫節(jié)點(diǎn)的支持姥卢,如果會(huì)話終止,鎖節(jié)點(diǎn)將自動(dòng)刪除渣聚。

3****)基于****ZooKeeper****的選擇:如果本地NameNode是健康的独榴,且ZKFC發(fā)現(xiàn)沒(méi)有其它的節(jié)點(diǎn)當(dāng)前持有znode鎖,它將為自己獲取該鎖奕枝。如果成功棺榔,則它已經(jīng)贏得了選擇,并負(fù)責(zé)運(yùn)行故障轉(zhuǎn)移進(jìn)程以使它的本地NameNode為active隘道。

圖片1.png

8.4 HDFS-HA集群配置

8.4.1 環(huán)境準(zhǔn)備

1)修改IP

2)修改主機(jī)名及主機(jī)名和IP地址的映射

3)關(guān)閉防火墻

4)ssh免密登錄

5)安裝JDK症歇,配置環(huán)境變量等

8.4.2 規(guī)劃集群

bigdata111 bigdata112 bigdata113

NameNode NameNode

JournalNode JournalNode JournalNode

DataNode DataNode DataNode

ZK ZK ZK

ResourceManager

NodeManager NodeManager NodeManager

8.4.3 配置****Zookeeper****集群

0)集群規(guī)劃

在bigdata111、bigdata112和bigdata113三個(gè)節(jié)點(diǎn)上部署Zookeeper谭梗。

1)解壓安裝

(1)解壓zookeeper安裝包到/opt/module/目錄下

[itstar@bigdata111 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

(2)在/opt/module/zookeeper-3.4.10/這個(gè)目錄下創(chuàng)建zkData

mkdir -p zkData

(3)重命名/opt/module/zookeeper-3.4.10/conf這個(gè)目錄下的zoo_sample.cfg為zoo.cfg

mv zoo_sample.cfg zoo.cfg

2)配置zoo.cfg文件

(1)具體配置

dataDir=/opt/module/zookeeper-3.4.10/zkData

增加如下配置

#######################cluster##########################

server.1=bigdata111:2888:3888

server.2=bigdata112:2888:3888

server.3=bigdata113:2888:3888

(2)配置參數(shù)解讀

Server.A=B:C:D忘晤。

A是一個(gè)數(shù)字,表示這個(gè)是第幾號(hào)服務(wù)器激捏;

B是這個(gè)服務(wù)器的ip地址设塔;

C是這個(gè)服務(wù)器與集群中的Leader服務(wù)器交換信息的端口;

D是萬(wàn)一集群中的Leader服務(wù)器掛了远舅,需要一個(gè)端口來(lái)重新進(jìn)行選舉闰蛔,選出一個(gè)新的Leader痕钢,而這個(gè)端口就是用來(lái)執(zhí)行選舉時(shí)服務(wù)器相互通信的端口。

集群模式下配置一個(gè)文件myid序六,這個(gè)文件在dataDir目錄下任连,這個(gè)文件里面有一個(gè)數(shù)據(jù)就是A的值,Zookeeper啟動(dòng)時(shí)讀取此文件难咕,拿到里面的數(shù)據(jù)與zoo.cfg里面的配置信息比較從而判斷到底是哪個(gè)server课梳。

3)集群操作

(1)在/opt/module/zookeeper-3.4.10/zkData目錄下創(chuàng)建一個(gè)myid的文件

touch myid

添加myid文件,注意一定要在linux里面創(chuàng)建余佃,在notepad++里面很可能亂碼

(2)編輯myid文件

vi myid

在文件中添加與server對(duì)應(yīng)的編號(hào):如2

(3)拷貝配置好的zookeeper到其他機(jī)器上

scp -r zookeeper-3.4.10/ <u>root@bigdata112.itstar.com:/opt/app/</u>

scp -r zookeeper-3.4.10/ <u>root@bigdata113.itstar.com:/opt/app/</u>

并分別修改myid文件中內(nèi)容為3暮刃、4

(4)分別啟動(dòng)zookeeper

[root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh start

[root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh start

[root@bigdata113 zookeeper-3.4.10]# bin/zkServer.sh start

(5)查看狀態(tài)

[root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: follower

[root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: leader

[root@bigdata113 zookeeper-3.4.5]# bin/zkServer.sh status

JMX enabled by default

Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: follower

8.4.4 配置****HDFS-HA****集群

1)官方地址:<u>http://hadoop.apache.org/</u>

2)在opt目錄下創(chuàng)建一個(gè)ha文件夾

mkdir HA

3)將/opt/app/下的 hadoop-2.8.4拷貝到/opt/ha目錄下

cp -r hadoop-2.8.4/ /opt/HA/

4)配置hadoop-env.sh

|

export JAVA_HOME=/opt/module/jdk1.8.0_144

|

5)配置core-site.xml

|

<configuration>

<property>

<name>fs.defaultFS</name>

      <value>hdfs://mycluster</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/HA/hadoop-2.8.4/data</value>

</property>

</configuration>

|

6)配置hdfs-site.xml

|

<configuration>

<property>

<name>dfs.nameservices</name>

<value>mycluster</value>

</property>

<property>

<name>dfs.ha.namenodes.mycluster</name>

<value>nn1,nn2</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn1</name>

<value>bigdata111:9000</value>

</property>

<property>

<name>dfs.namenode.rpc-address.mycluster.nn2</name>

<value>bigdata112:9000</value>

</property>

<property>

<name>dfs.namenode.http-address.mycluster.nn1</name>

<value>bigdata111:50070</value>

</property>

<property>

<name>dfs.namenode.http-address.mycluster.nn2</name>

<value>bigdata112:50070</value>

</property>

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://bigdata111:8485;bigdata112:8485;bigdata113:8485/mycluster</value>

</property>

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/root/.ssh/id_rsa</value>

</property>

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/opt/HA/hadoop-2.8.4/data/jn</value>

</property>

<property>

<name>dfs.permissions.enable</name>

<value>false</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.mycluster</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

    <!--secondary NameNode的地址,端口號(hào)是50090-->

    <property>

            <name>dfs.namenode.secondary.http-address</name>

            <value>bigdata112:50090</value>

    </property>

</configuration>

|

7) 拷貝配置好的hadoop環(huán)境到其他節(jié)點(diǎn)

注意需要scp到其他節(jié)點(diǎn)

8.4.5 啟動(dòng)****HDFS-HA****集群

1)在各個(gè)JournalNode節(jié)點(diǎn)上,輸入以下命令啟動(dòng)journalnode服務(wù):

Journalnode主要是用來(lái)做數(shù)據(jù)之間共享的爆土。

sbin/hadoop-daemon.sh start journalnode

2)在[nn1]上椭懊,對(duì)其進(jìn)行格式化,并啟動(dòng):

bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

3)在[nn2]上步势,同步nn1的元數(shù)據(jù)信息:

bin/hdfs namenode -bootstrapStandby

4)啟動(dòng)[nn2]:

sbin/hadoop-daemon.sh start namenode

5)查看web頁(yè)面顯示


圖片3.png

圖片2.png

6)在[nn1]上氧猬,啟動(dòng)所有datanode

sbin/hadoop-daemons.sh start datanode

7)查看是否Active

bin/hdfs haadmin -getServiceState nn1

8)將[nn1]切換為Active

切換為Active:bin/hdfs haadmin -transitionToActive nn1

切換為Standby:bin/hdfs haadmin -transitionToStandby nn1

8.4.6 配置****HDFS-HA****自動(dòng)故障轉(zhuǎn)移

1)具體配置

(1)在hdfs-site.xml中增加

|

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>

|

(2)在core-site.xml文件中增加

<property>

<name>ha.zookeeper.quorum</name>

<value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>

</property>

2)啟動(dòng)

坑:如果是非可視化界面,需要執(zhí)行這個(gè)命令:yum -y install psmisc,不然無(wú)法自動(dòng)切換HA

(1)關(guān)閉所有HDFS服務(wù):

sbin/stop-dfs.sh

(2)啟動(dòng)Zookeeper集群:

bin/zkServer.sh start

(3)初始化HA在Zookeeper中狀態(tài):

bin/hdfs zkfc -formatZK

(4)啟動(dòng)HDFS服務(wù):

sbin/start-dfs.sh

(5)在各個(gè)NameNode節(jié)點(diǎn)上啟動(dòng)DFSZK Failover Controller,先在哪臺(tái)機(jī)器啟動(dòng)坏瘩,哪個(gè)機(jī)器的NameNode就是Active NameNode

sbin/hadoop-daemon.sh start zkfc

3)驗(yàn)證()

(1)將Active NameNode進(jìn)程kill

kill -9 namenode的進(jìn)程id

(2)將Active NameNode機(jī)器斷開(kāi)網(wǎng)絡(luò)

service network stop

8.5 YARN-HA配置

8.5.1 YARN-HA****工作機(jī)制

1)官方文檔:

<u>http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html</u>

2)YARN-HA工作機(jī)制


圖片4.png

8.5.2 配置****YARN-HA****集群

0)環(huán)境準(zhǔn)備

(1)修改IP

(2)修改主機(jī)名及主機(jī)名和IP地址的映射

(3)關(guān)閉防火墻

(4)ssh免密登錄

(5)安裝JDK盅抚,配置環(huán)境變量等

(6)配置Zookeeper集群

1)規(guī)劃集群

bigdata111 bigdata112 bigdata113

NameNode NameNode

JournalNode JournalNode JournalNode

DataNode DataNode DataNode

ZK ZK ZK

ResourceManager ResourceManager

NodeManager NodeManager NodeManager

2)具體配置

(1)yarn-site.xml

|

<configuration>

<property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

</property>

<!--啟用resourcemanager ha-->

<property>

    <name>yarn.resourcemanager.ha.enabled</name>

    <value>true</value>

</property>

<!--聲明兩臺(tái)resourcemanager的地址-->

<property>

    <name>yarn.resourcemanager.cluster-id</name>

    <value>cluster-yarn1</value>

</property>

<property>

    <name>yarn.resourcemanager.ha.rm-ids</name>

    <value>rm1,rm2</value>

</property>

<property>

    <name>yarn.resourcemanager.hostname.rm1</name>

    <value>bigdata111</value>

</property>

<property>

    <name>yarn.resourcemanager.hostname.rm2</name>

    <value>bigdata112</value>

</property>

<!--指定zookeeper集群的地址-->

<property>

    <name>yarn.resourcemanager.zk-address</name>

    <value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>

</property>

<!--啟用自動(dòng)恢復(fù)-->

<property>

    <name>yarn.resourcemanager.recovery.enabled</name>

    <value>true</value>

</property>

<!--指定resourcemanager的狀態(tài)信息存儲(chǔ)在zookeeper集群-->

<property>

    <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>

</property>

</configuration>

|

(2)同步更新其他節(jié)點(diǎn)的配置信息

3)啟動(dòng)hdfs(如果已經(jīng)做過(guò),不需要重復(fù)執(zhí)行)

(1)在各個(gè)JournalNode節(jié)點(diǎn)上倔矾,輸入以下命令啟動(dòng)journalnode服務(wù):

sbin/hadoop-daemon.sh start journalnode

(2)在[nn1]上妄均,對(duì)其進(jìn)行格式化,并啟動(dòng):

bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

(3)在[nn2]上哪自,同步nn1的元數(shù)據(jù)信息:

bin/hdfs namenode -bootstrapStandby

(4)啟動(dòng)[nn2]:

sbin/hadoop-daemon.sh start namenode

(5)啟動(dòng)所有datanode

sbin/hadoop-daemons.sh start datanode

(6)將[nn1]切換為Active

bin/hdfs haadmin -transitionToActive nn1

4)啟動(dòng)yarn

(1)在bigdata111中執(zhí)行:

sbin/start-yarn.sh

(2)在bigdata112中執(zhí)行:

sbin/yarn-daemon.sh start resourcemanager

(3)查看服務(wù)狀態(tài)

bin/yarn rmadmin -getServiceState rm1


圖片5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丰包,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壤巷,更是在濱河造成了極大的恐慌邑彪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧华,死亡現(xiàn)場(chǎng)離奇詭異寄症,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)矩动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門有巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人铅忿,你說(shuō)我怎么就攤上這事×橥簦” “怎么了檀训?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵柑潦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我峻凫,道長(zhǎng)渗鬼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任荧琼,我火速辦了婚禮譬胎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘命锄。我一直安慰自己堰乔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布脐恩。 她就那樣靜靜地躺著镐侯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驶冒。 梳的紋絲不亂的頭發(fā)上苟翻,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音骗污,去河邊找鬼崇猫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛需忿,可吹牛的內(nèi)容都是我干的诅炉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贴谎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汞扎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起擅这,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤澈魄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仲翎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痹扇,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年溯香,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲫构。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玫坛,死狀恐怖结笨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤炕吸,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布伐憾,位于F島的核電站,受9級(jí)特大地震影響赫模,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胸嘴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驾讲。 院中可真熱鬧吮铭,春花似錦谓晌、人聲如沸纸肉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谬俄。三九已至溃论,卻和暖如春钥勋,著一層夾襖步出監(jiān)牢的瞬間算灸,已是汗流浹背乎婿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留森逮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像歪脏,于是被迫代替她去往敵國(guó)和親婿失。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豪硅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 上個(gè)月中旬,偶然的因素加入了英語(yǔ)打卡群嵌溢,雖然還只堅(jiān)持了十幾天赖草,但是每每看到群里的大神堅(jiān)持幾百天甚至一千多天的打卡秧骑,...
    張曉婕xiaojie閱讀 516評(píng)論 0 1
  • 光陰似流水绒疗,漫長(zhǎng)的暑假一晃而過(guò)吓蘑,似乎才剛開(kāi)始就結(jié)束了磨镶。 這個(gè)暑假我參加了華夏學(xué)宮的傳統(tǒng)文化夏令營(yíng)琳猫,我在那...
    匕它米米米米米米米閱讀 363評(píng)論 1 1
  • 今夜的雨 淅淅瀝瀝 嘩嘩啦啦 下個(gè)不停 沒(méi)有風(fēng)的陪伴 沒(méi)有夜的星空 只有低吟和琴聲 浪漫和留連 無(wú)助和傷心 也是雨...
    情愛(ài)千秋閱讀 2,288評(píng)論 34 49
  • objc_msgSend()實(shí)現(xiàn) 2.動(dòng)態(tài)解析階段: 1. 判斷之前是否動(dòng)態(tài)解析過(guò): 沒(méi)解析紊遵,進(jìn)入判斷暗膜,并在解析完...
    南城同學(xué)閱讀 111評(píng)論 0 0