MySQL-14mysql負(fù)載均衡

大家好,一起來搞一下mysql的負(fù)載均衡這個(gè)技術(shù)點(diǎn)杏节。

mysql負(fù)載均衡集群

1. haproxy介紹與配置
2. keeplived介紹與配置
3. mysql高可用搭建

1. haproxy介紹與配置

HAProxy 是一個(gè)使用C語言編寫的自由及開放源代碼軟件谤民,其提供高可用性慎框、負(fù)載均衡辆影,以及基于 TCP 和HTTP 的應(yīng)用程序代理。

  • HAProxy 特別適用于那些負(fù)載特大的 web 站點(diǎn)黍特,這些站點(diǎn)通常又需要會話保持或七層處理蛙讥。
  • HAProxy 運(yùn)行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接灭衷。并且它的運(yùn)行模式使得它可以很 簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中次慢, 同時(shí)可以保護(hù)你的 web 服務(wù)器不被暴露到網(wǎng)絡(luò)上。
  • HAProxy 實(shí)現(xiàn)了一種事件驅(qū)動翔曲,單一進(jìn)程模型迫像,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模 型受內(nèi)存限制 瞳遍、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制闻妓,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動模型因 為在有更好的資源和時(shí)間管理的用戶空間 (User-Space) 實(shí)現(xiàn)所有這些任務(wù)掠械,所以沒有這些問題由缆。此模 型的弊端是,在多核系統(tǒng)上猾蒂,這些程序通常擴(kuò)展性較差均唉。這就是為什么他們必須進(jìn)行優(yōu)化以使每個(gè) CPU 時(shí)間片 Cycle 做更多的工作。
  • 相較與 Nginx肚菠,HAProxy 更專注與反向代理舔箭,因此它可以支持更多的選項(xiàng)膳犹,更精細(xì)的控制晤碘,更多的健 康狀態(tài)檢測機(jī)制和負(fù)載均衡算法。
  • 包括 GitHub都办、Bitbucket时捌、Stack Overflow怒医、Reddit、Tumblr奢讨、Twitter 和 Tuenti 在內(nèi)的知名網(wǎng)站稚叹,及亞 馬遜網(wǎng)絡(luò)服務(wù)系統(tǒng)都使用了 HAProxy焰薄。

Haproxy的特性:

1. 可靠性與穩(wěn)定性都非常出色,可與硬件級設(shè)備媲美扒袖。
2. 支持連接拒絕塞茅,可以用于防止 DDoS 攻擊
3. 支持長連接、短連接和日志功能季率,可根據(jù)需要靈活配置
4. 路由 HTTP 請求到后端服務(wù)器,基于 cookie 作會話綁定;同時(shí)支持通過獲取指定的 url 來檢測后 端服務(wù)器的狀態(tài)
5. HAProxy 還擁有功能強(qiáng)大的 ACL 支持野瘦,可靈活配置路由功能,實(shí)現(xiàn)動靜分離飒泻,在架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)上 帶來很大方便
6. 可支持四層和七層負(fù)載均衡鞭光,幾乎能為所有服務(wù)常見的提供負(fù)載均衡功能
7. 擁有功能強(qiáng)大的后端服務(wù)器的狀態(tài)監(jiān)控 web 頁面,可以實(shí)時(shí)了解設(shè)備的運(yùn)行狀態(tài) 泞遗,還可實(shí)現(xiàn)設(shè)備上 下線等簡單操作惰许。
8. 支持多種負(fù)載均衡調(diào)度算法,并且也支持 session 保持史辙。
9. Haproxy 七層負(fù)載均衡模式下汹买,負(fù)載均衡與客戶端及后端的服務(wù)器會分別建立一次 TCP連接,而在 四層負(fù)載均衡模式下(DR)聊倔,僅建立一次 TCP 連接;七層負(fù)載均衡對負(fù)載均衡設(shè)備的要求更高晦毙,處理能力 也低于四層負(fù)載均衡。

haproxy 的配置文件由兩部分組成:

  1. 全局設(shè)定(globalsettings)
  2. 對代理的設(shè)定(proxies)

全局設(shè)定
global settings:主要用于定義 haproxy 進(jìn)程管理安全及性能相關(guān)的參數(shù)耙蔑。
代理設(shè)定
proxies 共分為4段:defaults见妒,frontend,backend甸陌,listen

  • proxies:代理相關(guān)的配置可以有如下幾個(gè)配置端組成
  • defaults:為除了 global 以外的其它配置段提供默認(rèn)參數(shù)徐鹤,默認(rèn)配置參數(shù)可由下一個(gè) “defaults” 重新設(shè)定。
  • frontend:定義一系列監(jiān)聽的套接字邀层,這些套接字可接受客戶端請求并與之建立連接返敬。
  • backend:定義 “后端” 服務(wù)器,前端代理服務(wù)器將會把客戶端的請求調(diào)度至這些服務(wù)器寥院。
  • listen:定義監(jiān)聽的套接字和后端的服務(wù)器劲赠。類似于將 frontend 和 backend 段放在一起 所有代理的名稱只能使用大寫字母、小寫字母秸谢、數(shù)字凛澎、-(中線)、_(下劃線)估蹄、.(點(diǎn)號)和:(冒號)塑煎。此 外,ACL 名稱會區(qū)分字母大小寫臭蚁。

1.2 配置文件詳細(xì)介紹

注意:此處只做配置文件介紹最铁,不做為后期負(fù)載均衡配置

global
    log 127.0.0.1 local0                                        # 定義全局的 syslog 服務(wù)器讯赏,最多可定義2個(gè),格式:log <address> <facility> [max level [min level]]
    chroot /var/lib/haproxy                                     # 修改 haproxy 的工作目錄至指定的目錄并在放棄權(quán)限之前執(zhí)行,保證haproxy的安全,使用配置文件默認(rèn)值即可
    pidfile /var/run/haproxy.pid
    maxconn 10000                                               # 設(shè)定每個(gè)haproxy進(jìn)程所接受的最大并發(fā)連接數(shù)冷尉,其等同于命令行選項(xiàng)“-n”漱挎;“ulimit -n”自動計(jì)算的結(jié)果正是參照此參數(shù)設(shè)定的;
    user haproxy                                                # 以指定的 user 運(yùn)行haproxy雀哨,建議使用專用于運(yùn)行 haproxy 的 user, 以免因權(quán)限問題帶來風(fēng)險(xiǎn)磕谅;
    group haproxy                                               # 以指定的 group 運(yùn)行haproxy,建議使用專用于運(yùn)行 haproxy 的 group雾棺, 以免因權(quán)限問題帶來風(fēng)險(xiǎn)膊夹;
    daemon                                                      # 讓 haproxy 以守護(hù)進(jìn)程的方式工作于后臺,其等同于 “-D” 選項(xiàng)的功能捌浩, 當(dāng)然割疾,也可以在命令行中以 “-db” 選項(xiàng)將其禁用;
    ulimit-n 100000                                             # 設(shè)定每進(jìn)程所能夠打開的最大文件描述符數(shù)目嘉栓,默認(rèn)情況下其會自動進(jìn)行計(jì)算,因此不推薦修改此選項(xiàng)拓诸;Linux默認(rèn)單進(jìn)程打開文件數(shù)為1024個(gè)
    stats socket /var/lib/haproxy/stats level admin process 1   # 開啟一個(gè) socket 管理接口
    nbproc 12                                                   # 指定啟動的 haproxy 進(jìn)程個(gè)數(shù)侵佃,只能用于守護(hù)進(jìn)程模式的 haproxy;默認(rèn)只啟動一個(gè)進(jìn)程奠支,
    cpu-map 1 0                                                 # 綁定 cpu,和 nbproc 數(shù)量相對馋辈。進(jìn)程號從1開始,cpu 核數(shù)從0開始倍谜;

defaults
    log global
    option tcplog                                               # 啟用日志記錄迈螟;tcplog 請求;
    option dontlognull                                          # 日志中將不會記錄空連接尔崔;
    retries 3                                                   # 定義連接后端服務(wù)器的失敗重連次數(shù)
    timeout connect 2s                                          # 定義 haproxy 將客戶端請求轉(zhuǎn)發(fā)至后端服務(wù)器所等待的超時(shí)時(shí)長
    timeout client 3600s                                        # 客戶端非活動狀態(tài)的超時(shí)時(shí)長
    timeout server 3600s                                        # 客戶端與服務(wù)器端建立連接后答毫,等待服務(wù)器端的超時(shí)時(shí)長
    maxconn 10000                                               # 默認(rèn)和前段的最大連接數(shù),但不能超過 global 中的 maxconn 限制數(shù)

listen admin_stats                                              # 開啟一個(gè)統(tǒng)計(jì)報(bào)告服務(wù)
    bind *:1080                                                 # 監(jiān)聽1080端口
    mode http                                                   # 基于http協(xié)議
    maxconn 10
    stats refresh 10s                                           # 統(tǒng)計(jì)頁面自動刷新時(shí)間間隔
    stats uri /haproxy                                          # url 地址
    stats realm Haproxy                                         # 統(tǒng)計(jì)頁面密碼框上提示文本
    stats auth admin:admin                                      # 賬號:密碼
    stats hide-version                                          # 隱藏統(tǒng)計(jì)報(bào)告版本信息
    stats admin if TRUE                                         # 在制定條件下開啟admin 功能

frontend haproxy                                                # 前端應(yīng)用
    bind *:40000                                                # 端口
    mode tcp                                                    # tcp 模式
    default_backend tidb                                        # 此前端對應(yīng)的后端應(yīng)用

backend tidb                                                    # 后端應(yīng)用
    balance leastconn                                           # balance 基于最少連接數(shù)
    mode tcp                                                    # tcp 模式
    # acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1  定義一條ACL季春,ACL是根據(jù)數(shù)據(jù)包的指定屬性以指定表達(dá)式計(jì)算出的true/false值洗搂。
    # tcp-request content reject if ! internal_networks
    # option mysql-check user haproxy post-41
    server tidb1 10.0.1.4:4000 check                            # 后端應(yīng)用地址,代理將會將對應(yīng)客戶端的請求轉(zhuǎn)發(fā)至這些服務(wù)器载弄。
    server tidb2 10.0.1.10:4000 check

1.3 haproxy安裝與環(huán)境配置

在192.168.199.175與192.168.199.172(負(fù)載均衡服務(wù)器)中安裝與配置如下

    1. 安裝haproxy負(fù)載均衡器

yum install haproxy -y

    1. 配置haproxy配置文件耘拇,目錄:/etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                   tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option http-server-close
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend    mysql
    bind        0.0.0.0:3307
    mode       tcp
    log             global
    default_backend         mysql_server

backend     mysql_server
    balance     roundrobin
    server  mysql1 192.168.199.172:3306 check inter 5s rise 2 fall 3
    server  mysql2 192.168.199.175:3306 check inter 5s rise 2 fall 3

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri /haproxyadmin?stats
    stats realm Haproxy\ Statistics
    stats auth admin:admin
    stats admin if TRUE
  • 3.啟動haproxy負(fù)載均衡
./usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg

2. keeplived介紹與配置

2.1 Keepalived介紹

Keepalived的作用是檢測服務(wù)器的狀態(tài),如果有一臺服務(wù)器宕機(jī)宇攻,或工作出現(xiàn)故障惫叛,Keepalived將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除逞刷,同時(shí)使用其它服務(wù)器代替該服務(wù)器的工作嘉涌,當(dāng)服務(wù)器工作 正常后Keepalived自動將服務(wù)器加入到服務(wù)器群中妻熊,這些工作全部自動完成,不需要人工干涉洛心,需要人工做的只是修復(fù)故障的服務(wù)器固耘。

2.2 Keepalived安裝

安裝Keepalived需要的擴(kuò)展

[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel
[root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz

解壓Keepalived并安裝

[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz
[root@localhost home]# cd keepalived-1.2.18
[root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-1.2.18]# make && make install

將 keepalived 安裝成 Linux 系統(tǒng)服務(wù)
因?yàn)闆]有使用 keepalived 的默認(rèn)路徑安裝(默認(rèn)是/usr/local) ,安裝完成之后,需要做一些工作 復(fù)制默認(rèn)配置文件到默認(rèn)路徑

[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

復(fù)制 keepalived 服務(wù)腳本到默認(rèn)的地址

[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

設(shè)置 keepalived 服務(wù)開機(jī)啟動

[root@localhost keepalived-1.2.18]# chkconfig keepalived on

3. mysql高可用搭建

  • 3.1 Keepalived配置

keepalived主機(jī)配置

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態(tài)的腳本路徑
    interval 2 ## 檢測時(shí)間間隔
    weight 2 ## 如果條件成立词身,權(quán)重+2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 79
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 寫VIP virtual_server厅目,只配置本地機(jī)器
virtual_server 192.168.29.101 3307 {# 定義虛擬服務(wù)器,地址與上面的virtual_ipaddress相同
    delay_loop 3 # 健康檢查時(shí)間間隔法严,3秒
    lb_algo rr # 負(fù)載均衡調(diào)度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則:NAT|DR|TUN
    # persistence_timeout 5 # 會話保持時(shí)間5秒损敷,動態(tài)服務(wù)建議開啟
    protocol TCP # 轉(zhuǎn)發(fā)協(xié)議protocol,一般有tcp和udp兩種
    real_server 192.168.29.106 3307 {
        weight 1 # 權(quán)重越大負(fù)載分越大深啤,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

Keepalived從機(jī)配置

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態(tài)的腳本路徑
    interval 2 ## 檢測時(shí)間間隔
    weight 2 ## 如果條件成立拗馒,權(quán)重+2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 79
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 寫VIP virtual_server,只配置本地機(jī)器
virtual_server 192.168.29.101 3307 {# 定義虛擬服務(wù)器溯街,地址與上面的virtual_ipaddress相同
    delay_loop 3 # 健康檢查時(shí)間間隔诱桂,3秒
    lb_algo rr # 負(fù)載均衡調(diào)度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則:NAT|DR|TUN
    # persistence_timeout 5 # 會話保持時(shí)間5秒,動態(tài)服務(wù)建議開啟
    protocol TCP # 轉(zhuǎn)發(fā)協(xié)議protocol呈昔,一般有tcp和udp兩種
    real_server 192.168.29.107 3307 {
        weight 1 # 權(quán)重越大負(fù)載分越大挥等,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

haproxy狀態(tài)檢測腳本

#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy啟動命令
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日志文件
HAPS=`ps -C haproxy --no-header |wc -l` # 檢測haproxy的狀態(tài),0代表未啟動,1已經(jīng)啟動
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日志文件當(dāng)中記錄檢測時(shí)間
echo "check haproxy status" >> $LOG_FILE # 記錄haproxy的狀態(tài)
if [ $HAPS -eq 0 ];then #執(zhí)行haproxy判斷
  echo $START_HAPROXY >> $LOG_FILE #記錄啟動命令
  /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #啟動haproxy
  sleep 3
  if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "start haproxy failed, killall keepalived" >> $LOG_FILE
    killall keepalived
    service keepalived stop
  fi
fi

haproxy狀態(tài)檢測腳本不執(zhí)行問題堤尾,如果是使用的service keeplived start 或者是 systemctl 方式啟動肝劲,腳本可能會不執(zhí)行,可以使用 Keepalived -f /etc/keepalived/keepalived.conf方式啟動Keepalived

keepalived配置注意點(diǎn) - 配置完成但是ip不生效郭宝;

  • 1.查看虛擬機(jī)/機(jī)器系統(tǒng)時(shí)間是否一致
  • 2.virtual_router_id路由id不對辞槐,不能沖突≌呈遥可以通過/var/log/messages查看此錯(cuò)誤

3.2 測試

在本地通過(IP根據(jù)自己的來)192.168.199.101去連接mysql榄檬,查詢sever_id,端口使用haproxy定義的3307

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衔统,隨后出現(xiàn)的幾起案子丙号,更是在濱河造成了極大的恐慌,老刑警劉巖缰冤,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬缨,死亡現(xiàn)場離奇詭異,居然都是意外死亡棉浸,警方通過查閱死者的電腦和手機(jī)怀薛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迷郑,“玉大人枝恋,你說我怎么就攤上這事创倔。” “怎么了焚碌?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵畦攘,是天一觀的道長。 經(jīng)常有香客問我十电,道長知押,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任鹃骂,我火速辦了婚禮台盯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畏线。我一直安慰自己静盅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布寝殴。 她就那樣靜靜地躺著蒿叠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚣常。 梳的紋絲不亂的頭發(fā)上市咽,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音史隆,去河邊找鬼。 笑死曼验,一個(gè)胖子當(dāng)著我的面吹牛泌射,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鬓照,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼熔酷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了豺裆?” 一聲冷哼從身側(cè)響起拒秘,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臭猜,沒想到半個(gè)月后躺酒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔑歌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年羹应,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次屠。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡园匹,死狀恐怖雳刺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裸违,我是刑警寧澤掖桦,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站供汛,受9級特大地震影響枪汪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜紊馏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一料饥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朱监,春花似錦岸啡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擂送,卻和暖如春悦荒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘹吨。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工搬味, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蟀拷。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓碰纬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親问芬。 傳聞我的和親對象是個(gè)殘疾皇子悦析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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