ClickHouse集群搭建(一)

滿目山河空念遠,落花風雨更傷春。

java42.jpg

ClickHouse概述

什么是ClickHouse?

ClickHouse 是俄羅斯的Yandex于2016年開源的列式存儲數據庫(DBMS),主要用于在線分析處理查詢(OLAP),能夠使用SQL查詢實時生成分析數據報告。

什么是列式存儲 ?

以下面表為例

id website wechat
1 https://niocoder.com/ java干貨
2 http://www.merryyou.cn/ javaganhuo

采用行式存儲時,數據在磁盤上的組織結構為:

Row1 Row2
1 https://niocoder.com/ java干貨 2 http://www.merryyou.cn/ javaganhuo

好處是想查某條記錄所有的屬性時,可以通過一次磁盤查找加順序讀取就可以。但是當想查所有記錄wechat時,需要不停的查找,或者全表掃描才行,遍歷的很多數據都是不需要的。

而采用列式存儲時,數據在磁盤上的組織結構為:

col1 col2 col3
1 2 https://niocoder.com/ http://www.merryyou.cn/ java干貨 javaganhuo

這時想查所有記錄的wechat只需把col3那一列拿出來即可。

集群環境搭建

在 安裝ClickHouse 具體開始前, 先來搭建一下環境,軟件包下載見末尾。

創建虛擬機

安裝虛擬機 VMWare

安裝Vmware虛擬機

導入 CentOS

將下載的CentOS系統中導入到 VMWare

注意事項:windows系統確認所有的關于VmWare的服務都已經啟動,

確認好VmWare生成的網關地址,另外確認VmNet8網卡已經配置好了IP地址。

更多關于VmWare網絡模式參考VMware虛擬機三種網絡模式詳解

集群規劃

IP 主機名 環境配置 安裝 ClickHouse
192.168.10.100 node01 關防火墻, host映射, 時鐘同步 JDK, Zookeeper clickhouse-server 9000 clickhouse-server 9001
192.168.10.110 node02 關防火墻, host映射, 時鐘同步 JDK, Zookeeper clickhouse-server 9000 clickhouse-server 9001
192.168.10.120 node03 關防火墻, host映射, 時鐘同步 JDK, Zookeeper clickhouse-server 9000 clickhouse-server 9001

配置每臺主機

更改ip地址和HWADDR地址

vim /etc/sysconfig/network-scripts/ifcfg-eth0

[圖片上傳失敗...(image-e9718b-1606616621682)]

HWADDR地址查看

[圖片上傳失敗...(image-765a55-1606616621683)]

修改主機名(重啟后永久生效)

[圖片上傳失敗...(image-2653ed-1606616621683)]

vim /etc/hostname

設置hosts域名映射

image

vim /etc/hosts

關閉防火墻

三臺機器執行以下命令

systemctl status firewalld.service #查看防火墻狀態
systemctl stop firewalld.service #關閉防火墻
systemctl disable firewalld.service #永久關閉防火墻

免密登錄

為了方便傳輸文件,三臺機器之前配置免密登錄.

  • 免密 SSH 登錄的原理
    1. 需要先在 B節點 配置 A節點 的公鑰
    2. A節點 請求 B節點 要求登錄
    3. B節點 使用 A節點 的公鑰, 加密一段隨機文本
    4. A節點 使用私鑰解密, 并發回給 B節點
    5. B節點 驗證文本是否正確
三臺機器生成公鑰與私鑰

在三臺機器執行以下命令,生成公鑰與私鑰

ssh-keygen -t rsa

執行該命令之后,按下三個回車即可

[圖片上傳失敗...(image-5111c8-1606616621683)]

拷貝公鑰到node01機器

三臺機器將拷貝公鑰到node01機器

三臺機器執行命令:

ssh-copy-id node01

復制node01機器的認證到其他機器

將第一臺機器的公鑰拷貝到其他機器上

node01機器上面執行以下命令

scp /root/.ssh/authorized_keys node02:/root/.ssh

scp /root/.ssh/authorized_keys node03:/root/.ssh

[圖片上傳失敗...(image-40ba58-1606616621683)]

設置時鐘同步服務

  • 為什么需要時間同步
    • 因為很多分布式系統是有狀態的, 比如說存儲一個數據, A節點 記錄的時間是 1, B節點 記錄的時間是 2, 就會出問題
## 安裝
yum install -y ntp

## 啟動定時任務
crontab -e

隨后在輸入界面鍵入

*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;

安裝JDK

上傳jdk并解壓然后配置環境變量

所有軟件的安裝路徑

mkdir -p /export/servers #node01,node02,node03機器上執行

所有軟件壓縮包的存放路徑

mkdir -p /export/softwares # 創建文件夾

安裝rzsz命令

yum -y install lrzsz # 安裝rz sz 命令

上傳jdk安裝包到/export/softwares路徑下去,并解壓

tar -zxvf jdk-8u141-linux-x64.tar.gz -C ../servers/

配置環境變量

vim /etc/profile

export JAVA_HOME=/export/servers/jdk1.8.0_141
export PATH=:$JAVA_HOME/bin:$PATH

執行以下命令將jdk安裝包分發到node02node03節點上

scp -r /export/servers/jdk1.8.0_141/ node02:/export/servers/
scp -r /export/servers/jdk1.8.0_141/ node03:/export/servers/
scp /etc/profile node02:/etc/profile
scp /etc/profile node03:/etc/profile

刷新環境變量

source /etc/profile

安裝Zookeeper

服務器IP 主機名 myid的值
192.168.10.100 node01 1
192.168.10.110 node02 2
192.168.10.120 node03 3

上傳zookeeper安裝包到/export/softwares路徑下去,并解壓

tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers/

node01修改配置文件如下

cd /export/servers/zookeeper-3.4.9/conf/

cp zoo_sample.cfg zoo.cfg
# 創建數據存放節點
mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/

vim zoo.cfg

dataDir=/export/servers/zookeeper-3.4.9/zkdatas
# 保留多少個快照
autopurge.snapRetainCount=3
# 日志多少小時清理一次
autopurge.purgeInterval=1
# 集群中服務器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888

node01機器上

/export/servers/zookeeper-3.4.9/zkdatas/這個路徑下創建一個文件,文件名為myid ,文件內容為1

echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid

安裝包分發到其他機器

node01機器上面執行以下兩個命令

scp -r /export/servers/zookeeper-3.4.9/ node02:/export/servers/

scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/

node02機器上修改myid的值為2

echo 2 > /export/servers/zookeeper-3.4.9/zkdatas/myid

node03機器上修改myid的值為3

echo 3 > /export/servers/zookeeper-3.4.9/zkdatas/myid

啟動zookeeper服務

node01,node02,node03機器都要執行

/export/servers/zookeeper-3.4.9/bin/zkServer.sh start

查看啟動狀態

/export/servers/zookeeper-3.4.9/bin/zkServer.sh status

安裝前準備

CPU是否支持SSE4.2

查看CPU是否支持SSE4.2指令集

grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

安裝必要依賴

yum install -y unixODBC libicudata

yum install -y libxml2-devel expat-devel libicu-devel

安裝ClickHouse

單機模式

上傳4個文件到node01機器/opt/software/
[root@node01 softwares]# ll
total 306776
-rw-r--r--. 1 root root      6384 Nov  2 22:43 clickhouse-client-20.8.3.18-1.el7.x86_64.rpm
-rw-r--r--. 1 root root  69093220 Nov  2 22:48 clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
-rw-r--r--. 1 root root  36772044 Nov  2 22:51 clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
-rw-r--r--. 1 root root     14472 Nov  2 22:43 clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm
分別安裝這4個rpm安裝包
[root@node01 softwares]# rpm -ivh clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:clickhouse-common-static-20.8.3.1################################# [100%]
[root@node01 softwares]# rpm -ivh clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:clickhouse-server-common-20.8.3.1################################# [100%]
[root@node01 softwares]# rpm -ivh clickhouse-server-20.8.3.18-1.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:clickhouse-server-20.8.3.18-1.el7################################# [100%]
Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
[root@node01 softwares]# rpm -ivh clickhouse-client-20.8.3.18-1.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:clickhouse-client-20.8.3.18-1.el7################################# [100%]
Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
rpm安裝完畢后,clickhouse-serverclickhouse-client配置目錄如下
[root@node01 softwares]# ll /etc/clickhouse-server/
total 44
-rw-r--r--. 1 root root 33738 Oct  6 06:05 config.xml
-rw-r--r--. 1 root root  5587 Oct  6 06:05 users.xml
[root@node01 softwares]# ll /etc/clickhouse-client/
total 4
drwxr-xr-x. 2 clickhouse clickhouse    6 Nov 28 22:19 conf.d
-rw-r--r--. 1 clickhouse clickhouse 1568 Oct  6 04:44 config.xml

/etc/clickhouse-server/config.xmlClickHouse核心配置文件,主要內容如下
<?xml version="1.0"?>
<yandex>
   <!-- 日志 -->
   <logger>
       <level>trace</level>
       <log>/data1/clickhouse/log/server.log</log>
       <errorlog>/data1/clickhouse/log/error.log</errorlog>
       <size>1000M</size>
       <count>10</count>
   </logger>

   <!-- 端口 -->
   <http_port>8123</http_port>
   <tcp_port>9000</tcp_port>
   <interserver_http_port>9009</interserver_http_port>

   <!-- 本機域名 -->
   <interserver_http_host>這里需要用域名,如果后續用到復制的話</interserver_http_host>

   <!-- 監聽IP -->
   <listen_host>0.0.0.0</listen_host>
   <!-- 最大連接數 -->
   <max_connections>64</max_connections>

   <!-- 沒搞懂的參數 -->
   <keep_alive_timeout>3</keep_alive_timeout>

   <!-- 最大并發查詢數 -->
   <max_concurrent_queries>16</max_concurrent_queries>

   <!-- 單位是B -->
   <uncompressed_cache_size>8589934592</uncompressed_cache_size>
   <mark_cache_size>10737418240</mark_cache_size>

   <!-- 存儲路徑 -->
   <path>/data1/clickhouse/</path>
   <tmp_path>/data1/clickhouse/tmp/</tmp_path>

   <!-- user配置 -->
   <users_config>users.xml</users_config>
   <default_profile>default</default_profile>

   <log_queries>1</log_queries>

   <default_database>default</default_database>

   <remote_servers incl="clickhouse_remote_servers" />
   <zookeeper incl="zookeeper-servers" optional="true" />
   <macros incl="macros" optional="true" />

   <!-- 沒搞懂的參數 -->
   <builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval>

   <!-- 控制大表的刪除 -->
   <max_table_size_to_drop>0</max_table_size_to_drop>

   <include_from>/data1/clickhouse/metrika.xml</include_from>
</yandex>
啟動ClickHouse
[root@node01 softwares]# service clickhouse-server start
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE
[root@node01 softwares]# 

使用client鏈接server

[root@node01 softwares]# clickhouse-client -m
ClickHouse client version 20.8.3.18.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.8.3 revision 54438.

node01 :) show databases;

SHOW DATABASES

┌─name───────────────────────────┐
│ _temporary_and_external_tables │
│ default                        │
│ system                         │
└────────────────────────────────┘

3 rows in set. Elapsed: 0.007 sec. 

node01 :) select 1;

SELECT 1

┌─1─┐
│ 1 │
└───┘

1 rows in set. Elapsed: 0.005 sec. 

node01 :) 

分布式集群安裝

node02node03上面執行之前的所有的操作
node01機器修改配置文件config.xml
[root@node01 softwares]# vim /etc/clickhouse-server/config.xml
<!-- 打開這個 -->
 <listen_host>::</listen_host>
    <!-- Same for hosts with disabled ipv6: -->
    <!-- <listen_host>0.0.0.0</listen_host> -->
    <!-- 新增外部配置文件metrika.xml  -->
<include_from>/etc/clickhouse-server/metrika.xml</include_from>

將修改后的配置分發到node02,node03機器上

scp config.xml node02:/etc/clickhouse-server/config.xml

scp config.xml node03:/etc/clickhouse-server/config.xml

node01機器/etc/clickhouse-server/目錄下創建metrika.xml文件
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
    <!-- 3分片1備份 -->
    <cluster_3shards_1replicas>
        <!-- 數據分片1  -->
        <shard>
            <replica>
                <host>node01</host>
                <port>9000</port>
            </replica>
        </shard>
        <!-- 數據分片2  -->
        <shard>
            <replica>
                <host>node02</host>
                <port> 9000</port>
            </replica>
        </shard>
        <!-- 數據分片3  -->
        <shard>
            <replica>
                <host>node03</host>
                <port>9000</port>
            </replica>
        </shard>
    </cluster_3shards_1replicas>
</clickhouse_remote_servers>
</yandex>

配置說明

  • cluster_3shards_1replicas 集群名稱,可隨意定義
  • 共設置3個分片,每個分片只有1個副本;

metrika.xml配置文件分發到node02,node03機器上

scp metrika.xml node02:/etc/clickhouse-server/metrika.xml

scp metrika.xml node03:/etc/clickhouse-server/metrika.xml

重啟ClickHouse-server 打開client查看集群
[root@node01 clickhouse-server]# service clickhouse-server restart
Stop clickhouse-server service: DONE
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE
[root@node01 clickhouse-server]# clickhouse-client -m
ClickHouse client version 20.8.3.18.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.8.3 revision 54438.

node01 :) select * from system.clusters;

SELECT *
FROM system.clusters

┌─cluster───────────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address───┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ cluster_3shards_1replicas         │         1 │            1 │           1 │ node01    │ 192.168.10.100 │ 9000 │        1 │ default │                  │            0 │                       0 │
│ cluster_3shards_1replicas         │         2 │            1 │           1 │ node02    │ 192.168.10.110 │ 9000 │        0 │ default │                  │            0 │                       0 │
│ cluster_3shards_1replicas         │         3 │            1 │           1 │ node03    │ 192.168.10.120 │ 9000 │        0 │ default │                  │            0 │                       0 │
│ test_cluster_two_shards           │         1 │            1 │           1 │ 127.0.0.1 │ 127.0.0.1      │ 9000 │        1 │ default │                  │            0 │                       0 │
│ test_cluster_two_shards           │         2 │            1 │           1 │ 127.0.0.2 │ 127.0.0.2      │ 9000 │        0 │ default │                  │            0 │                       0 │
│ test_cluster_two_shards_localhost │         1 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 │
│ test_cluster_two_shards_localhost │         2 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 │
│ test_shard_localhost              │         1 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 │
│ test_shard_localhost_secure       │         1 │            1 │           1 │ localhost │ ::1            │ 9440 │        0 │ default │                  │            0 │                       0 │
│ test_unavailable_shard            │         1 │            1 │           1 │ localhost │ ::1            │ 9000 │        1 │ default │                  │            0 │                       0 │
│ test_unavailable_shard            │         2 │            1 │           1 │ localhost │ ::1            │    1 │        0 │ default │                  │            0 │                       0 │
└───────────────────────────────────┴───────────┴──────────────┴─────────────┴───────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

11 rows in set. Elapsed: 0.008 sec.                │            0 │                      

可以看到cluster_3shards_1replicas就是我們定義的集群名稱,一共有三個分片,每個分片有一份數據。剩下的為配置文件默認自帶的集群配置.

測試分布式集群

node01,node02,node03上分別創建本地表cluster3s1r_local

CREATE TABLE default.cluster3s1r_local
(
    `id` Int32,
    `website` String,
    `wechat` String,
    `FlightDate` Date,
    Year UInt16
)
ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);

node01節點上創建分布式表

CREATE TABLE default.cluster3s1r_all AS cluster3s1r_local
ENGINE = Distributed(cluster_3shards_1replicas, default, cluster3s1r_local, rand());

往分布式表cluster3s1r_all插入數據,cluster3s1r_all會隨機插入到三個節點的cluster3s1r_local

插入數據

INSERT INTO default.cluster3s1r_all (id,website,wechat,FlightDate,Year)values(1,'https://niocoder.com/','java干貨','2020-11-28',2020);
INSERT INTO default.cluster3s1r_all (id,website,wechat,FlightDate,Year)values(2,'http://www.merryyou.cn/','javaganhuo','2020-11-28',2020);
INSERT INTO default.cluster3s1r_all (id,website,wechat,FlightDate,Year)values(3,'http://www.xxxxx.cn/','xxxxx','2020-11-28',2020);

查詢分布式表和本地表

node01 :) select * from cluster3s1r_all; # 查詢總量查分布式表

SELECT *
FROM cluster3s1r_all

┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐
│  2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28 │ 2020 │
└────┴─────────────────────────┴────────────┴────────────┴──────┘
┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐
│  3 │ http://www.xxxxx.cn/ │ xxxxx  │ 2020-11-28 │ 2020 │
└────┴──────────────────────┴────────┴────────────┴──────┘
┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐
│  1 │ https://niocoder.com/ │ java干貨 │ 2020-11-28 │ 2020 │
└────┴───────────────────────┴──────────┴────────────┴──────┘

3 rows in set. Elapsed: 0.036 sec. 

node01 :) select * from cluster3s1r_local; # node01本地表

SELECT *
FROM cluster3s1r_local

┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐
│  2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-28 │ 2020 │
└────┴─────────────────────────┴────────────┴────────────┴──────┘

1 rows in set. Elapsed: 0.012 sec.

node02 :) select * from cluster3s1r_local; # node02本地表

SELECT *
FROM cluster3s1r_local

Ok.

0 rows in set. Elapsed: 0.016 sec. 

node03 :) select * from cluster3s1r_local; ## node03 本地表

SELECT *
FROM cluster3s1r_local

┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐
│  3 │ http://www.xxxxx.cn/ │ xxxxx  │ 2020-11-28 │ 2020 │
└────┴──────────────────────┴────────┴────────────┴──────┘
┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐
│  1 │ https://niocoder.com/ │ java干貨 │ 2020-11-28 │ 2020 │
└────┴───────────────────────┴──────────┴────────────┴──────┘

2 rows in set. Elapsed: 0.006 sec. 

下載

[圖片上傳失敗...(image-6fd8de-1606616746222)]

關注微信公眾號java干貨回復 【clickhouse】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容