MySQL ( MGR ) 一 - InnoDB Cluster 部署說明(全)

0.環境

ip地址                 主機名           角色                     安裝軟件
192.168.40.211        xag211           節點1               Mysql5.7, mysql-shell
192.168.40.212        xag212           節點1               Mysql5.7, mysql-shell
192.168.40.213        xag213           節點1               Mysql5.7, mysql-shell
192.168.40.214        xag214         管理節點1             mysql-shell, mysql-route
  1. 克隆 MySQL ( MGR ) 05 后的VM & 修改配置(本次為 211節點,其他212、213同理)
[root@xag200 ~]# service mysqld stop
Shutting down MySQL.... SUCCESS!

[root@xag200 ~]# vim /usr/local/mysql/data/auto.cnf
[root@xag200 ~]# cat /usr/local/mysql/data/auto.cnf
[auto]
server-uuid=2116c7e9-63c9-11eb-a1ba-000c299e2211

[root@xag200 ~]# sed -i 's/127.0.0.1/xag211/' /root/.bashrc

[root@xag200 ~]# source  /root/.bash_profile

[root@xag200 ~]# hostname
xag211

[root@xag200 ~]# cat /etc/hostname
xag211

[root@xag200 ~]# cat /etc/sysconfig/network
NETWORKING=yes
NOZEROCONF=yes
HOSTNAME=xag211

[root@xag200 ~]# cat /etc/hosts
...
192.168.40.211 xag211 xag211
192.168.40.212 xag212 xag212
192.168.40.213 xag213 xag213
192.168.40.214 xag214 xag214

[root@xag200 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens33
。。。
IPADDR="192.168.40.211"
。。。

[root@xag200 ~]# reboot
  1. 修改 /etc/my.cnf 中 #復制框架設置 及 #組復制設置 如下(xag212、xag213類似)
    各個MGR節點除了server_id、loose-group_replication_local_address、report_host 三個參數不一樣外,其他保持一致。
#復制框架設置
server-id = 211
# 表示本機的序列號為1,如果做主從,或者多實例,serverid一定不能相同。
log-bin = /usr/local/mysql/binlog/binlog 
# logbin數據庫的操作日志,例如update、delete、create等都會存儲到binlog日志,通過logbin可以實現增量恢復
binlog_format = row
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_slave_updates=ON
master_info_repository =TABLE
relay_log_info_repository=TABLE
 
#組復制設置
#server必須為每個事務收集寫集合,并使用XXHASH64哈希算法將其編碼為散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或創建組命名,UUID
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#server啟動時不自啟組復制,為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。
loose-group_replication_start_on_boot=off
#告訴插件使用IP地址,端口24901用于接收組中其他成員轉入連接
loose-group_replication_local_address="xag211:24901"
#啟動組server,種子server,加入組應該連接這些的ip和端口;其他server要加入組得由組成員同意
loose-group_replication_group_seeds="xag211:24901,xag.212:24901,xag213:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode = on 
loose-group_replication_allow_local_disjoint_gtids_join=on
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_host=xag211
report_port=3306

3.下載軟件(xag214管理節點上)

[root@xag214 src]# pwd
/usr/local/src

wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz

[root@xag214 src]# scp mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz root@xag211:/usr/local/src/

[root@xag214 src]# scp mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz root@xag212:/usr/local/src/

[root@xag214 src]# scp mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz root@xag213:/usr/local/src/

4.安裝MGR插件,設置復制賬號(每個節點)

配置完成后, 要一次啟動數據庫,安裝MGR插件,設置復制賬號(所有MGR節點都要執行)

systemctl restart mysqld

mysql.login

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

SET SQL_LOG_BIN=0;
 
CREATE USER repl@'%' IDENTIFIED BY 'repl';
 
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
 
FLUSH PRIVILEGES;
 
SET SQL_LOG_BIN=1;
  1. 在管理節點(xag214)安裝mysql shell 和 mysql-route
[root@xag214 src]# pwd
/usr/local/src

[root@xag214 src]# ll
-rw-r--r-- 1 root root 15630562 Feb  3 21:47 mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
-rw-r--r-- 1 root root  6584245 Feb  3 21:47 mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

tar -zvxf mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
tar -zvxf mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

mv mysql-router-2.1.6-linux-glibc2.12-x86-64bit mysql-route
mv mysql-shell-1.0.11-linux-glibc2.12-x86-64bit mysql-shell

mv mysql-route /usr/local/
mv mysql-shell /usr/local/

vim /etc/profile
..............
export PATH=$PATH:/usr/local/mysql-shell/bin/:/usr/local/mysql-route/bin/
 
source /etc/profile
 
[root@xag214 local]# mysqlprovision --version
mysqlprovision version 2.1.0

[root@xag214 local]# mysqlsh --version
mysqlsh   Ver 1.0.11 for Linux on x86_64 - for MySQL 5.7.20 (MySQL Community Server (GPL))

[root@xag214 local]# mysqlrouter --version
MySQL Router v2.1.6 on Linux (64-bit) (GPL community edition)
  1. 在三個cluster節點(211,212,213)安裝和部署 mysql-shell
cd /usr/local/src/

[root@xag211 src]# ll
-rw-r--r-- 1 root root  6584245 Feb  3 21:47 mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

tar -zvxf mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

mv mysql-shell-1.0.11-linux-glibc2.12-x86-64bit mysql-shell

mv mysql-shell /usr/local/
 
echo "export PATH=$PATH:/usr/local/mysql-shell/bin/" >> /etc/profile

source /etc/profile
 
mysqlprovision --version                          
 
mysqlsh --version      

  1. 創建Innodb Cluster集群
    7.1 在 211 上創建集群,通過 2111 上的 shell 連接2111 的 mysql
#登錄
mysqlsh --uri root@xag211:3306

mysql-js>  dba.configureLocalInstance();

7.2 通過 xag214(管理節點)上 的 mysql-shell 連接 xag211創建 cluster

[root@xag214 src]# mysqlsh --uri root@xag211:3306

# 創建一個 cluster,命名為 'myCluster'  (此窗口不能關閉,後續要用)
mysql-js>  var cluster = dba.createCluster('myCluster');

mysql-js> cluster.status();
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK_NO_TOLERANCE", 
        "statusText": "Cluster is NOT tolerant to any failures.", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }
    }
}

7.3 添加節點 212、213到上面創建的"myCluster"集群中,通過212本機 mysql-shell 對 mysql 進行配置
如下為212上測試,如213則對應修改

[root@xag212 src]#  mysqlsh --uri root@xag212:3306

mysql-js> dba.configureLocalInstance();

#檢查(創建cluster集群之前)
mysql-js> dba.checkInstanceConfiguration("root@localhost:3306")     

#xag211 上繼續(上次未關閉的窗口)
mysql-js> var cluster = dba.getCluster()
mysql-js> cluster.status()
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK_NO_TOLERANCE", 
        "statusText": "Cluster is NOT tolerant to any failures.", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }
    }
}

cluster.addInstance('root@xag212:3306');

cluster.addInstance('root@xag213:3306');

  1. 檢查
mysql-js> cluster.status()
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag212:3306": {
                "address": "xag212:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag213:3306": {
                "address": "xag213:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }
    }
}
  1. 啟動管理節點的route
進入 db-route01管理節點中mysql-router 安裝目錄,配置并啟動 router

[root@xag214 src]# /usr/local/mysql-route/bin/mysqlrouter --bootstrap root@xag211:3306 -d myrouter --user=root
Please enter MySQL password for root: 

Bootstrapping MySQL Router instance at /usr/local/src/myrouter...
MySQL Router  has now been configured for the InnoDB cluster 'myCluster'.

The following connection information can be used to connect to the cluster.

Classic MySQL protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447

X protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:64460
- Read/Only Connections: localhost:64470

會在當前目錄下產生mysql-router 目錄, 并生成router配置文件,接著把配置文件修改一下
[root@xag214 src]# pwd
/usr/local/src
[root@xag214 src]# ls
myrouter

[root@xag214 myrouter]# pwd
/usr/local/src/myrouter

[root@xag214 myrouter]# cat mysqlrouter.conf  #可以修改配置文件, 也可以默認不修改

然后啟動mysqlroute
[root@xag214 ~]# /usr/local/src/myrouter/start.sh

[root@xag214 myrouter]# ps -ef|grep myroute  
root      10436      1  0 17:25 pts/0    00:00:00 sudo ROUTER_PID=/usr/local/src/myrouter/mysqlrouter.pid /usr/local/mysql-route/bin/mysqlrouter -c /usr/local/src/myrouter/mysqlrouter.conf --user=root
root      10437  10436  0 17:25 pts/0    00:00:00 /usr/local/mysql-route/bin/mysqlrouter -c /usr/local/src/myrouter/mysqlrouter.conf --user=root
root      10449   1253  0 17:25 pts/0    00:00:00 grep --color=auto myroute

[root@xag214 myrouter]# netstat -tunlp|grep 10437
tcp        0      0 0.0.0.0:64460           0.0.0.0:*               LISTEN      10437/mysqlrouter   
tcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      10437/mysqlrouter   
tcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      10437/mysqlrouter   
tcp        0      0 0.0.0.0:64470           0.0.0.0:*               LISTEN      10437/mysqlrouter

  1. 測試
這樣就可以使用MySQL客戶端連接router了.  下面驗證下連接router:
a) 管理節點本機mysql-shell連接:
[root@xag214 myrouter]# mysqlsh --uri root@localhost:6446

 管理節點本機mysql連接:
[root@xag213 src]#  mysql -u root -h xag214 -P 6446 -p

測試cluster節點數據同步. 這里選擇xag213 節點作為遠程客戶端連接router
[root@xag213 src]#  mysql -u root -h xag214 -P 6446 -p

root@xag214:(none) [:40: ] 1 SQL->show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema            |
| mysql                         |
| mysql_innodb_cluster_metadata |
| performance_schema            |
| sys                           |
+-------------------------------+

root@xag214:(none) [:46: ] 5 SQL->create database testdb default character set utf8mb4 collate utf8mb4_general_ci;


root@xag214:(none) [:46: ] 7 SQL->use testdb;

root@xag214:testdb [:46: ] 8 SQL->CREATE TABLE t1(Id int(11) NOT NULL,TestName varchar(30) NOT NULL DEFAULT '',PRIMARY KEY (Id)) ENGINE=InnoDB;

SQL->
insert into t1 values(1,'a');
insert into t1 values(2,'b');
commit;

root@xag214:testdb [:49: ] 12 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
|  2 | b        |
+----+----------+

  1. 分別登錄三個cluster節點的mysql, 發現測試庫testdb已經完成同步了, 其中:
root@xag213:testdb [:52: ] 2 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
|  2 | b        |
+----+----------+

root@xag213:testdb [:52: ] 3 SQL->delete from t1 where Id=2;
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
-------------------------------------------------------------------------
root@xag212:testdb [:53: ] 2 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
|  2 | b        |
+----+----------+
2 rows in set (0.00 sec)

root@xag212:testdb [:53: ] 3 SQL->delete from t1 where Id=2;
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
-----------------------------------------------------------------------------
root@xag211:testdb [:54: ] 5 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
|  2 | b        |
+----+----------+

root@xag211:testdb [:54: ] 6 SQL->delete from t1 where Id=2;
Query OK, 1 row affected (0.03 sec)

  1. InnoDB Cluster集群 日常維護命令
比如在上面創建Innodb cluster集群過程中, 再次登錄mysqlsh (從客戶端遠程登錄, 或任意節點本地登錄), 怎么獲得并查看集群狀態
[root@xag212 src]# mysqlsh --uri root@xag212:3306

mysql-js> cluster=dba.getCluster();
WARNING: The session is on a Read Only instance.
         Write operations on the InnoDB cluster will not be allowed

<Cluster:myCluster>
mysql-js> cluster.status();
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag212:3306": {
                "address": "xag212:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag213:3306": {
                "address": "xag213:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }
    }
}

  1. help
[root@xag214 myrouter]# mysqlsh --uri root@xag211:3306

mysql-js> dba.help();

The global variable 'dba' is used to access the AdminAPI functionality and
perform DBA operations. It is used for managing MySQL InnoDB clusters.

The following properties are currently supported.

 - verbose Enables verbose mode on the Dba operations.


The following functions are currently supported.

 - checkInstanceConfiguration      Validates an instance for cluster usage.
 - configureLocalInstance          Validates and configures an instance for
                                   cluster usage.
 - createCluster                   Creates a MySQL InnoDB cluster.
 - deleteSandboxInstance           Deletes an existing MySQL Server instance on
                                   localhost.
 - deploySandboxInstance           Creates a new MySQL Server instance on
                                   localhost.
 - dropMetadataSchema              Drops the Metadata Schema.
 - getCluster                      Retrieves a cluster from the Metadata Store.
 - help                            Provides help about this class and it's
                                   members
 - killSandboxInstance             Kills a running MySQL Server instance on
                                   localhost.
 - rebootClusterFromCompleteOutage Brings a cluster back ONLINE when all
                                   members are OFFLINE.
 - resetSession                    Sets the session object to be used on the
                                   Dba operations.
 - startSandboxInstance            Starts an existing MySQL Server instance on
                                   localhost.
 - stopSandboxInstance             Stops a running MySQL Server instance on
                                   localhost.

For more help on a specific function use: dba.help('<functionName>')

e.g. dba.help('deploySandboxInstance')

root@xag211:testdb [:44: ] 9 SQL-> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 2119f22b-6136-11eb-a433-000c29905211 | xag211      |        3306 | ONLINE       |
| group_replication_applier | 2129f22b-6136-11eb-a433-000c29905212 | xag212      |        3306 | ONLINE       |
| group_replication_applier | 2139f22b-6136-11eb-a433-000c29905213 | xag213      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

SELECT a.member_id,a.member_host,member_port,member_state
,if(b.variable_name is not null,'PRIMARY','SECONDDARY') as MEMBER_ROLE 
FROM performance_schema.replication_group_members a left join performance_schema.global_status b
on b.variable_name='grooup_replication_primary_member' and b.variable_value=.a.member_id;

+--------------------------------------+-------------+-------------+--------------+-------------+
| member_id                            | member_host | member_port | member_state | MEMBER_ROLE |
+--------------------------------------+-------------+-------------+--------------+-------------+
| 2119f22b-6136-11eb-a433-000c29905211 | xag211      |        3306 | ONLINE       | PRIMARY     |
| 2129f22b-6136-11eb-a433-000c29905212 | xag212      |        3306 | ONLINE       | SECONDARY   |
| 2139f22b-6136-11eb-a433-000c29905213 | xag213      |        3306 | ONLINE       | SECONDARY   |
+--------------------------------------+-------------+-------------+--------------+-------------+
dba.checkInstanceConfiguration("root@hostname:3306")     #檢查節點配置實例,用于加入cluster之前
 
dba.rebootClusterFromCompleteOutage('myCluster');        #重啟
 
dba.dropMetadataSchema();                                #刪除schema
 
var cluster = dba.getCluster('myCluster')                #獲取當前集群
 
cluster.checkInstanceState("root@hostname:3306")         #檢查cluster里節點狀態
 
cluster.rejoinInstance("root@hostname:3306")             #重新加入節點,我本地測試的時候發現rejoin一直無效,每次是delete后
 
addcluster.dissolve({force:true})                       #刪除集群
 
cluster.addInstance("root@hostname:3306")                #增加節點
 
cluster.removeInstance("root@hostname:3306")             #刪除節點
 
cluster.removeInstance('root@host:3306',{force:true})    #強制刪除節點
 
cluster.dissolve({force:true})                           #解散集群
 
cluster.describe();                                      #集群描述
 
集群節點狀態
- ONLINE:  The instance is online and participating in the cluster.
- OFFLINE:  The instance has lost connection to the other instances.
- RECOVERING:  The instance is attempting to synchronize with the cluster by retrieving transactions it needs before it can become an ONLINE member.
- UNREACHABLE:  The instance has lost communication with the cluster.
- ERROR:  The instance has encountered an error during the recovery phase or while applying a transaction

參考:https://www.cnblogs.com/hzcya1995/p/13311679.html

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

推薦閱讀更多精彩內容