Spider引擎分布式數(shù)據(jù)庫(kù)解決方案(最全的spider教程)

最近開(kāi)始負(fù)責(zé)財(cái)付通的數(shù)據(jù)庫(kù)的相關(guān)維護(hù)工作橱健,其中有幾套系統(tǒng)使用的spider引擎而钞,為了以后能更好地對(duì)這套系統(tǒng)進(jìn)行維護(hù),對(duì)spider做了一些功課拘荡,將spider引擎的功能臼节、使用場(chǎng)景、部署珊皿、實(shí)戰(zhàn)測(cè)試等做個(gè)簡(jiǎn)單的總結(jié)网缝,希望不了解spider引擎的同學(xué)看到這篇文章能對(duì)spider引擎有個(gè)更深入的了解。

先來(lái)說(shuō)兩個(gè)我們DBA經(jīng)常遇到的場(chǎng)景:

場(chǎng)景1:有兩個(gè)分布在不通實(shí)例上的多張不通的表蟋定,想要通過(guò)某個(gè)字段關(guān)聯(lián)粉臊,做一個(gè)統(tǒng)計(jì),或者想將分布在不同實(shí)例的表驶兜,合并到一個(gè)實(shí)例中來(lái)做一些查詢维费。

場(chǎng)景2:由于數(shù)據(jù)庫(kù)容量的瓶頸或者是由于數(shù)據(jù)庫(kù)訪問(wèn)性能的瓶頸果元,將一某一個(gè)大庫(kù)促王、大表或者訪問(wèn)量非常大的表進(jìn)行拆分犀盟,然后分布到不通的實(shí)例中。

這兩種場(chǎng)景覆蓋了我們DBA經(jīng)常接觸的垂直拆分和水平拆分蝇狼,在這種場(chǎng)景下往往面臨著如下幾個(gè)窘境:

1阅畴、這些表的訪問(wèn)和存取需要額外的路由規(guī)則,復(fù)雜度很高

2迅耘、需要做數(shù)據(jù)匯總或者統(tǒng)計(jì)的時(shí)候贱枣,非常麻煩


我們想到的解決辦法可能有如下幾種:

1、使用數(shù)據(jù)庫(kù)中間件(Mysql fabric/TDDL/cobar/Atlas/Heisenberg/Vitess)

這個(gè)似乎是大公司的專(zhuān)用的颤专,由于存在各種各樣的限制纽哥,小公司往往使用起來(lái)非常不方便,對(duì)于里面存在的各種坑也沒(méi)辦法很好的進(jìn)行規(guī)避栖秕。

2春塌、使用mysql分區(qū)表

無(wú)法解決磁盤(pán)空間瓶頸以及服務(wù)器性能瓶頸。

3簇捍、使用Galera?Cluster for MySQL

支持?jǐn)?shù)據(jù)庫(kù)的高可用以及能實(shí)現(xiàn)讀請(qǐng)求的擴(kuò)展只壳,但是對(duì)于寫(xiě)請(qǐng)求無(wú)法實(shí)現(xiàn)性能上的突破。

4暑塑、使用mysql的多源復(fù)制

僅僅適合將多個(gè)實(shí)例的數(shù)據(jù)聚合到一起吼句,用來(lái)做數(shù)據(jù)統(tǒng)計(jì),但還是存在磁盤(pán)空間的瓶頸事格。

5惕艳、使用federated

可以實(shí)現(xiàn)將數(shù)據(jù)聚合,對(duì)于水平分割的場(chǎng)景并不適用驹愚,并且性能方面也存在比較大的問(wèn)題远搪。

6、MySQL Sharding和spider

mysql cluter是mysql sharding的一種么鹤,對(duì)于這種需求是個(gè)比較好的解決方案终娃,不過(guò)使用于生產(chǎn)環(huán)境的案例比較少。還有一個(gè)spider分布式引擎方案蒸甜,非常適合前面我們討論的兩個(gè)場(chǎng)景棠耕,下來(lái)將會(huì)做深入的介紹,該引擎目前已經(jīng)集成到了MariaDB中柠新,目前最新的版本是Spider 3.2.37窍荧。騰訊互娛DBA團(tuán)隊(duì)基于Spider3.1基礎(chǔ)上進(jìn)行開(kāi)發(fā),提高了性能和穩(wěn)定性以及修復(fù)了大量的bug恨憎,形成了非橙锿耍靠譜的TSpider郊楣,目前已經(jīng)在騰訊游戲、支付等領(lǐng)域廣泛使用瓤荔。

本文就是基于spider的分布式數(shù)據(jù)庫(kù)解決方案净蚤,下面就來(lái)詳細(xì)介紹:


一、Spider引擎簡(jiǎn)介

1输硝、spider引擎是什么

spider引擎是一個(gè)內(nèi)置的支持?jǐn)?shù)據(jù)分片特性的存儲(chǔ)引擎今瀑,支持分區(qū)和XA事務(wù),該引擎可以在服務(wù)器上建立和遠(yuǎn)程服務(wù)器表之間的鏈接点把,操作起來(lái)就像操作本地的表一樣橘荠。并且后端可以是任何的存儲(chǔ)引擎。spider引擎根據(jù)表的設(shè)置的規(guī)則以及server表的規(guī)則自動(dòng)進(jìn)行智能路由郎逃,實(shí)現(xiàn)對(duì)后端數(shù)據(jù)庫(kù)不通的表或者數(shù)據(jù)分片的訪問(wèn)和修改哥童。因此該引擎對(duì)業(yè)務(wù)是完全透明的。目前spider引擎已經(jīng)集成到了MariaDB中褒翰,安裝使用非常方面贮懈,目前最新的版本是Spider 3.2.37。更多信息可以訪問(wèn):https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/影暴,具體的版本歷史如下圖所示:

2错邦、spider架構(gòu)圖

3、Spider的優(yōu)勢(shì)

a型宙、對(duì)業(yè)務(wù)完全透明撬呢,業(yè)務(wù)不需要做任何的修改

對(duì)于分庫(kù)分表的邏輯業(yè)務(wù)不需要關(guān)心,只需要通過(guò)spider作為代理入口妆兑,訪問(wèn)數(shù)據(jù)對(duì)應(yīng)在后端哪臺(tái)server上spider自動(dòng)幫你處理魂拦。

b、方便橫向擴(kuò)展搁嗓,能解決單臺(tái)mysql得性能和存儲(chǔ)瓶頸問(wèn)題

c芯勘、對(duì)后端的存儲(chǔ)引擎沒(méi)有限制

d、間接實(shí)現(xiàn)垂直拆分和水平拆分功能

通過(guò)spider和后端的數(shù)據(jù)庫(kù)連接腺逛,可以是獨(dú)立的表荷愕,也可以是基于分區(qū)表,分區(qū)表支持哈希棍矛、范圍安疗、列表等算法

e够委、完全兼容mysql協(xié)議

由于MySQL特殊的插件式存儲(chǔ)引擎架構(gòu)荐类,server層負(fù)責(zé)SQL解析、SQL優(yōu)化茁帽、數(shù)據(jù)庫(kù)對(duì)象(視圖玉罐、存儲(chǔ)過(guò)程等)管理屈嗤;存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)存儲(chǔ)、索引支持吊输、事務(wù)饶号、buffer等,兩者之間通過(guò)約定好的handler接口進(jìn)行交互璧亚。SQL解析讨韭、優(yōu)化與執(zhí)行交給server層處理,幾乎支持執(zhí)行任意類(lèi)型SQL訪問(wèn)癣蟋。

4、Spider的劣勢(shì)

a狰闪、spider的表本身不支持查詢緩存和全文索引疯搅,不過(guò)可以將全文索引添加在后端數(shù)據(jù)庫(kù)中;

b埋泵、如果采用物理備份幔欧,spider無(wú)法備份后端的數(shù)據(jù),因?yàn)閿?shù)據(jù)本身是存放在后端丽声〗刚幔可以對(duì)后端的mysql一一做物理備份

c、spider本身是單點(diǎn)雁社,需要自己做容災(zāi)機(jī)器浴井,比如通過(guò)VIP的方式

d、多了一層網(wǎng)絡(luò)霉撵,性能上會(huì)有一些損耗磺浙,尤其是跨分區(qū)、跨表查詢性能會(huì)差一些

5徒坡、Tspider介紹

騰訊互娛DBA團(tuán)隊(duì)在spider 3.1的基礎(chǔ)上進(jìn)行深入優(yōu)化和定制開(kāi)發(fā)撕氧,形成了Tspider,極大地提高了spider性能喇完、穩(wěn)定性和兼容性伦泥,在性能上比spider至少提升30%,目前Tspider已經(jīng)發(fā)展到了Tspider 1.9版本锦溪,Tspider經(jīng)過(guò)了騰訊游戲海量訪問(wèn)以及高數(shù)據(jù)安全性的考驗(yàn)不脯,整體解決方案已經(jīng)非常成熟,目前財(cái)付通也有部分服務(wù)器使用了互娛的Tspider海洼,騰訊互娛DBA團(tuán)隊(duì)修復(fù)的部分優(yōu)化點(diǎn)如下:

二跨新、Spider的使用場(chǎng)景解析

1、垂直分表的場(chǎng)景和解析

a坏逢、垂直分表場(chǎng)景圖

b域帐、垂直分表場(chǎng)景解析

從上圖可以看出赘被,spider后面接4臺(tái)DB server,可以將不通功能的表分布到后端不通的DB server中肖揣,比如user_info的表專(zhuān)門(mén)存放在HostA中民假,user_msg表存放在了HostB中,user_detail表存放在了HostC中龙优,user_log表存放在了HostD中羊异。在圖中的紅色部分彤断,當(dāng)我們執(zhí)行紅色部分的SQL的時(shí)候野舶,spider會(huì)通過(guò)user_info表的映射關(guān)系以及HostA的IP映射關(guān)系,將查詢user_info表的請(qǐng)求都轉(zhuǎn)發(fā)到HostA上宰衙,HostA查詢完成后再將結(jié)果發(fā)給spider服務(wù)器平道,spider再轉(zhuǎn)發(fā)給客戶端。

2供炼、采用水平分表的場(chǎng)景

a一屋、水平分表場(chǎng)景圖

b、水平分表場(chǎng)景解析

spider支持多種水平分表的模式袋哼,目前支持hash分表(hash)冀墨、范圍分表(range)、列表分表(list)涛贯,我這里用range來(lái)說(shuō)明水平分表的工作原理诽嘉。從上圖中可以看出spider對(duì)user_info表針對(duì)id進(jìn)行了分區(qū),將0~100000的記錄存儲(chǔ)在了HostA疫蔓,100000~200000的記錄存儲(chǔ)在了HostB含懊,200000~300000的記錄存儲(chǔ)在了HostC,300000~400000的記錄存儲(chǔ)在了HostD衅胀。當(dāng)用戶訪問(wèn)user_info的某條或者多條記錄的時(shí)候岔乔,spider會(huì)根據(jù)分區(qū)的情況,對(duì)相關(guān)的記錄落在某臺(tái)或者多臺(tái)DB server上滚躯,再進(jìn)行轉(zhuǎn)發(fā)雏门。比如select * from user_info where id=1這個(gè)SQL,spider在收到這個(gè)請(qǐng)求后掸掏,會(huì)跟進(jìn)分區(qū)情況選擇對(duì)應(yīng)的DB server進(jìn)行轉(zhuǎn)發(fā)茁影。這里會(huì)將該請(qǐng)求轉(zhuǎn)發(fā)到HostA中。HostA處理完成后丧凤,再將結(jié)果返回給spider server募闲,spider再將結(jié)果轉(zhuǎn)發(fā)給發(fā)起請(qǐng)求的客戶端。

三愿待、Spider引擎實(shí)戰(zhàn)

(一)浩螺、spider的安裝部署

從spider 10.0.0.4版本開(kāi)始靴患,spider引擎就集成到了MariaDB中,集成后安裝就非常的簡(jiǎn)單要出,安裝步驟如下:

1鸳君、安裝mariaDB到spider server以及后端多臺(tái)DB server上;

安裝方法非常簡(jiǎn)單患蹂,這里不在贅述或颊,具體可以參考:https://mariadb.com/kb/en/mariadb/getting-installing-and-upgrading-mariadb/

2、安裝spider引擎到spider server上(后端的DB server不需要安裝spider引擎)

mysql?-uroot?-p?< install_spider.sql

或者登錄mysql后執(zhí)行

source?/path/install_spider.sql

備注:install_spider.sql在share目錄下面

這個(gè)命令所做的事情如下:

創(chuàng)建spider相關(guān)的系統(tǒng)表

spider_link_failed_log

spider_link_mon_servers

spider_tables

spider_xa

spider_xa_failed_log

spider_xa_member

創(chuàng)建spider相關(guān)的表結(jié)構(gòu)

加載spider引擎

3传于、檢查spider引擎是否安裝成功

如果出現(xiàn)上圖所示的結(jié)果就說(shuō)明已經(jīng)支持了spider引擎了

(二)囱挑、spider的使用實(shí)戰(zhàn)

備注:本實(shí)踐環(huán)境基于tspider-1.8.5環(huán)境全部驗(yàn)證通過(guò)

1、spider實(shí)戰(zhàn)拓?fù)鋱D

在實(shí)戰(zhàn)部分格了,我使用了2臺(tái)DB server看铆,部署圖如下:

2、實(shí)戰(zhàn)前準(zhǔn)備

a盛末、創(chuàng)建spider server訪問(wèn)后端DB server的權(quán)限(后面配置中需要用到)

grant all on *.* tospider_db_all@'10.128.128.91' identified by 'tospider_db_all';

b、創(chuàng)建spider后端DB server的配置

可以通過(guò)執(zhí)行如下SQL的形式直接創(chuàng)建

create server backend1 foreign data wrapper mysql options?(host '10.128.128.60', database 'test', user 'spider_db_all', password 'spider_db_all', port 3306);

create server backend2 foreign data wrapper mysql options?(host '10.128.128.88', database 'test', user 'spider_db_all', password 'spider_db_all', port 3306);

也可以通過(guò)直接給mysql.servers表中直接插入相關(guān)的記錄否淤,不過(guò)后面執(zhí)行flush hosts才能生效

insert into mysql.servers(Server_name,Host,Db,Username,Password,Port,Socket,Wrapper,Owner)values ('backend1','10.128.128.60','test','spider_db_all','spider_db_all',3306,'','mysql','');

insert into mysql.servers(Server_name,Host,Db,Username,Password,Port,Socket,Wrapper,Owner)values ('backend2','10.128.128.88','test','spider_db_all','spider_db_all',3306,'','mysql','');

創(chuàng)建完成后可以直接查詢mysql.servers表悄但,確認(rèn)是否添加成功,如下截圖所示:

b石抡、創(chuàng)建基礎(chǔ)測(cè)試表

在后端兩臺(tái)DB server上創(chuàng)建基礎(chǔ)測(cè)試表(在60和88上執(zhí)行)

create table test_spider (

id int,

username varchar(20),

address varchar(128),

primary key (id),

key (username)

) engine=InnoDB default charset=utf8 comment 'spider test base table';

3檐嚣、spider引擎實(shí)戰(zhàn)

a、建立垂直表(遠(yuǎn)程表進(jìn)行測(cè)試)

create table test_spider (

id int,

username varchar(20),

address varchar(128),

primary key (id),

key (username)

) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='server "backend1"';

創(chuàng)建之后啰扛,執(zhí)行對(duì)應(yīng)增刪改查嚎京,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1對(duì)應(yīng)的DB server上?

測(cè)試完成后隐解,刪除掉spider 服務(wù)器上的test_spider表鞍帝,你會(huì)發(fā)現(xiàn)drop掉spider上的表,不會(huì)導(dǎo)致后端DB server上的表被刪除煞茫。

b帕涌、建立hash分區(qū)表

create table test_spider (

id int,

username varchar(20),

address varchar(128),

primary key (id),

key (username)

) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "test_spider"'

PARTITION BY HASH (id)

( PARTITION pt1 COMMENT = 'srv "backend1"',

PARTITION pt2 COMMENT = 'srv "backend2"') ;

創(chuàng)建之后,執(zhí)行對(duì)應(yīng)增刪改查续徽,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1和backend2對(duì)應(yīng)的DB server上蚓曼?

測(cè)試完成后,刪除掉spider 服務(wù)器上的test_spider表钦扭,你會(huì)發(fā)現(xiàn)drop掉spider上的表纫版,不會(huì)導(dǎo)致后端DB server上的表被刪除。

c客情、建立range分區(qū)表

create table test_spider (

id int,

username varchar(20),

address varchar(128),

primary key (id),

key (username)

) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "test_spider"'

PARTITION BY range columns (id)

( PARTITION pt1 values less than (100000) COMMENT = 'srv "backend1"',

PARTITION pt2 values less than (200000) COMMENT = 'srv "backend2"') ;

創(chuàng)建之后其弊,執(zhí)行對(duì)應(yīng)增刪改查癞己,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1和backend2對(duì)應(yīng)的DB server上?

測(cè)試完成后瑞凑,刪除掉spider 服務(wù)器上的test_spider表末秃,你會(huì)發(fā)現(xiàn)drop掉spider上的表,不會(huì)導(dǎo)致后端DB server上的表被刪除籽御。

d练慕、建立list分區(qū)表測(cè)試

create table test_spider (

id int,

username varchar(20),

address varchar(128),

primary key (id),

key (username)

) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "test_spider"'

PARTITION BY list columns (id)

( PARTITION pt1 values in (1,3,5,7,9) COMMENT = 'srv "backend1"',

PARTITION pt2 values in (2,4,6,8,10) COMMENT = 'srv "backend2"') ;

創(chuàng)建之后,執(zhí)行對(duì)應(yīng)增刪改查技掏,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1和backend2對(duì)應(yīng)的DB server上铃将?

測(cè)試完成后,刪除掉spider 服務(wù)器上的test_spider表哑梳,你會(huì)發(fā)現(xiàn)drop掉spider上的表劲阎,不會(huì)導(dǎo)致后端DB server上的表被刪除。

四鸠真、性能測(cè)試

性能測(cè)試可以采用sysbench來(lái)測(cè)試悯仙,和mysql單臺(tái)以及后端掛多臺(tái)DB的場(chǎng)景進(jìn)行對(duì)比,確認(rèn)spider引擎的性能和優(yōu)勢(shì)吠卷,由于手頭沒(méi)有合適的設(shè)備這部分等以后有時(shí)間再進(jìn)行測(cè)試锡垄,maria'DB的官網(wǎng)已經(jīng)有對(duì)應(yīng)的測(cè)試方法和結(jié)果,有興趣的可以去https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/查閱祭隔。

五货岭、參考資料

為了撰寫(xiě)本文,翻閱了不少資料疾渴,感謝前輩們的貢獻(xiàn)千贯,羅列如下:

https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/

https://mariadb.com/kb/en/mariadb/spider/

https://mysqlstepbystep.com/2015/04/03/spider-for-mysql-overview/

http://km.oa.com/group/18974/articles/show/143399?kmref=search&from_page=1&no=2

http://km.oa.com/group/17613/articles/show/217681?kmref=search&from_page=1&no=1

http://www.chriscalender.com/getting-started-with-the-spider-storage-engine/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搞坝,隨后出現(xiàn)的幾起案子搔谴,更是在濱河造成了極大的恐慌,老刑警劉巖瞄沙,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件己沛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡距境,警方通過(guò)查閱死者的電腦和手機(jī)申尼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垫桂,“玉大人师幕,你說(shuō)我怎么就攤上這事。” “怎么了霹粥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵灭将,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我后控,道長(zhǎng)庙曙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任浩淘,我火速辦了婚禮捌朴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘张抄。我一直安慰自己砂蔽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布署惯。 她就那樣靜靜地躺著左驾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪极谊。 梳的紋絲不亂的頭發(fā)上诡右,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音轻猖,去河邊找鬼稻爬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜕依,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琉雳,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼样眠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罩阵!你這毒婦竟也來(lái)了最欠?” 一聲冷哼從身側(cè)響起酷勺,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤医瘫,失蹤者是張志新(化名)和其女友劉穎晦溪,沒(méi)想到半個(gè)月后胰伍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體儿礼,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡板祝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年绪妹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甥桂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邮旷,死狀恐怖黄选,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婶肩,我是刑警寧澤办陷,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布貌夕,位于F島的核電站,受9級(jí)特大地震影響民镜,放射性物質(zhì)發(fā)生泄漏啡专。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一制圈、第九天 我趴在偏房一處隱蔽的房頂上張望们童。 院中可真熱鬧,春花似錦离唐、人聲如沸病附。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)完沪。三九已至,卻和暖如春嵌戈,著一層夾襖步出監(jiān)牢的瞬間覆积,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工熟呛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宽档,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓庵朝,卻偏偏與公主長(zhǎng)得像吗冤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子九府,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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