Keepalive之nginx調(diào)度架構(gòu)

單主模式Keepalive之Nginx 調(diào)度

實驗?zāi)康?/strong>:

實現(xiàn)Nginx調(diào)度的高可用,當(dāng)一臺Nginx調(diào)度器故障時理郑,啟用備用的Nginx調(diào)度,在架構(gòu)中,啟用了kepalive節(jié)點狀態(tài)通知腳本機制怨酝,當(dāng)keepalive的狀態(tài)由MASTER變?yōu)锽ACKUP或由BACKUP變?yōu)镸ASTER時,以郵件通知用戶那先,通過在通知腳本文件中定義BACKUP狀態(tài)的節(jié)點啟用nginx服務(wù)农猬,是為了防止因Nginx服務(wù)故障導(dǎo)致節(jié)點權(quán)重降低從而變?yōu)锽ACKUP狀態(tài),為了避免此種現(xiàn)象售淡,故在轉(zhuǎn)換為BACKUP狀態(tài)時需啟動一次Nginx服務(wù)斤葱。

實驗環(huán)境

keepalive-A 172.16.253.108
keepalive-B 172.16.253.105
Nginx-A     172.16.253.108
Nginx-B     172.16.253.105
LVS-RS1     172.16.250.127
LVS-RS2     172.16.253.193
VIP         172.16.253.150
client      172.16.253.177

web服務(wù)集群

為了更好的觀察實驗結(jié)果,故在此將RS1和RS2的web頁面內(nèi)容設(shè)置不一致揖闸,以致可以更清晰的區(qū)分RS1服務(wù)端和RS2服務(wù)端

LVS-RS1

[root@LVS-RS1 ~]# systemctl restart chronyd  \\多臺服務(wù)器時間同步
[root@LVS-RS1 ~]# iptables -F
[root@LVS-RS1 ~]# setenforce 0
[root@LVS-RS1 ~]# yum -y install nginx
[root@LVS-RS1 ~]# vim /usr/share/nginx/html/index.html 
<h1> Web RS1 </h1>
[root@LVS-RS1 ~]# systemctl start nginx

LVS-RS2

[root@LVS-RS2 ~]# systemctl restart chronyd  \\多臺服務(wù)器時間同步
[root@LVS-RS2 ~]# iptables -F
[root@LVS-RS2 ~]# setenforce 0
[root@LVS-RS2 ~]# yum -y install nginx
[root@LVS-RS2 ~]# vim /usr/share/nginx/html/index.html
<h1> Web RS2 </h1>
[root@LVS-RS2 ~]# systemctl start nginx

nginx調(diào)度集群

nginx-A

[root@nginx-A ~]# yum -y install nginx
[root@nginx-A ~]# vim /usr/share/nginx/html/index.html 
</h1> sorry from keepalive-A </h1>
[root@nginx-A ~]# vim /etc/nginx/nginx.conf
http {
    upstream websrvs {
        server 172.16.250.127:80;
        server 172.16.253.193:80;
    }
}
server {
    listen       80 default_server;
    location / {
        proxy_pass http://websrvs;
    }
}
[root@nginx-A ~]# systemctl start nginx

nginx-B

[root@nginx-B ~]# yum -y install nginx
[root@nginx-B ~]# vim /usr/share/nginx/html/index.html 
</h1> sorry from keepalive-B </h1>
[root@nginx-B ~]# vim /etc/nginx/nginx.conf
http {
    upstream websrvs {
        server 172.16.250.127:80;
        server 172.16.253.193:80;
    }
}
server {
    listen       80 default_server;
    location / {
        proxy_pass http://websrvs;
    }
}
[root@nginx-B ~]# systemctl start nginx

keepalive集群

keepalive-A

[root@keepalive-A ~]# yum -y install keepalived
[root@keepalive-A ~]# vim /etc/keepalived/notify.sh  \\定義狀態(tài)檢測通知腳本揍堕,當(dāng)節(jié)點變?yōu)锽ACKUP時,啟動nginx服務(wù)
#!/bin/bash 
    #
    contact='root@localhost'  \\通知的聯(lián)系者汤纸,即本地郵件服務(wù)器的通知郵件接受者

    notify() {
       local mailsubject="$(hostname) to be $1, vip floating" \\指定郵件標(biāo)題
       local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"  \\指定郵件正文
       echo "$mailbody" | mail -s "$mailsubject" $contact  \\發(fā)送通知信息郵件到郵件接收者
    }

    case $1 in
        master)
           notify master
           ;;
        backup)
            notify backup
            systemctl start nginx
            ;;      
        fault)
            notify fault    
            ;;
        *)
            echo "Usage: $(basename $0) {master|backup|fault}"
            exit 1
            ;;
        esac
[root@keepaliveA ~]# vim /etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        jevon@danran.com
    }
    notification_email_from ka_admin@danran.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id keepaliveA
    vrrp_mcast_group4 224.103.5.5
}
vrrp_script chk_mant_down { \\定義檢測腳本
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" \\檢測/etc/keepalived/down文件是否存在衩茸,若文件存在,則weight權(quán)重-10贮泞,若文件不存在楞慈,則每隔一秒檢測
    interval 1 \\每隔一秒檢測
    weight -10
    fall 2 \\檢測兩次故障則表示節(jié)點故障
    rise 1 \\檢測一次正常則表示節(jié)點正常
}
vrrp_script chk_nginx { \\檢測nginx服務(wù)是否運行腳本
    script "killall -0 nginx" \\-0為探測信號,當(dāng)nginx進程存在時隙畜,返回值$?=0,當(dāng)nginx進程不存在時抖部,返回值$?為非零,則權(quán)重減10
    interval 2
    weight -10
    fall 2
    rise 2
}

vrrp_instance VI_A {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qr8hQHuL
    }
    virtual_ipaddress {
    172.16.253.150/32
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
    track_script { \\腳本調(diào)用
        chk_mant_down
        chk_nginx \\調(diào)用chk_nginx腳本
    }
}
[root@keepalive-A ~]# systemctl start keepalived
[root@keepalive-A ~]# systemctl status keepalived

keepalive-B

[root@keepalive-B ~]# yum -y install keepalived
[root@keepalive-A ~]# vim /etc/keepalived/notify.sh  \\定義狀態(tài)檢測通知腳本
#!/bin/bash 
    #
    contact='root@localhost'  \\通知的聯(lián)系者议惰,即本地郵件服務(wù)器的通知郵件接受者

    notify() {
       local mailsubject="$(hostname) to be $1, vip floating" \\指定郵件標(biāo)題
       local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"  \\指定郵件正文
       echo "$mailbody" | mail -s "$mailsubject" $contact  \\發(fā)送通知信息郵件到郵件接收者
    }

    case $1 in
        master)
           notify master
           ;;
        backup)
            notify backup
            systemctl start nginx
            ;;      
        fault)
            notify fault    
            ;;
        *)
            echo "Usage: $(basename $0) {master|backup|fault}"
            exit 1
            ;;
        esac
[root@keepalive-B ~]# vim /etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        jevon@danran.com
    }
    notification_email_from ka_admin@danran.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id keepaliveA
    vrrp_mcast_group4 224.103.5.5
} 
vrrp_script chk_mant_down { \\定義檢測腳本
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" \\檢測/etc/keepalived/down文件是否存在慎颗,若文件存在,則weight權(quán)重-10言询,若文件不存在俯萎,則每隔一秒檢測
    interval 1 \\每隔一秒檢測
    weight -10
    fall 2 \\檢測兩次故障則表示節(jié)點故障
    rise 1 \\檢測一次正常則表示節(jié)點正常
}
vrrp_script chk_nginx { \\檢測nginx服務(wù)是否運行腳本
    script "killall -0 nginx" \\-0為探測信號,當(dāng)nginx進程存在時运杭,返回值$?=0,當(dāng)nginx進程不存在時夫啊,返回值$?為非零,則權(quán)重減10
    interval 2
    weight -10
    fall 2
    rise 2
}

vrrp_instance VI_A {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qr8hQHuL
    }
    virtual_ipaddress {
    172.16.253.150/32
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
    
    track_script { \\腳本調(diào)用
        chk_mant_down
        chk_nginx \\調(diào)用chk_nginx腳本
    }
}
[root@keepalive-B ~]# systemctl start keepalived
[root@keepalive-A ~]# systemctl start keepalived

測試

訪問測試調(diào)度

[root@client ~]# for i in {1..10};do curl http://172.16.253.150;done
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>

測試檢測監(jiān)控Nginx服務(wù)資源的外部腳本

[root@keepalive-A ~]# ip a l
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:dc:3c brd ff:ff:ff:ff:ff:ff
    inet 172.16.253.150/32 scope global ens33
        valid_lft forever preferred_lft forever

手動停止Nginx服務(wù)辆憔,keepalive-A變成了BACKUP節(jié)點

[root@keepalive-A ~]# systemctl stop nginx
[root@keepalive-A ~]# ip a l
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:dc:3c brd ff:ff:ff:ff:ff:ff

幾秒種后撇眯,Nginx服務(wù)再次自動啟動报嵌,則Keepalive-A再次成為MASTER節(jié)點

[root@keepalive-A ~]# ip a l
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:dc:3c brd ff:ff:ff:ff:ff:ff
    inet 172.16.253.150/32 scope global ens33
        valid_lft forever preferred_lft forever

當(dāng)Nginx的80端口占用時,Nginx服務(wù)停止之后不會再次啟動熊榛,則keepalive-A變?yōu)锽ACKUP

[root@keepalive-A ~]# yum -y install httpd 
[root@keepalive-A ~]# systemctl stop nginx && systemctl start httpd \\停止nginx的同時啟動httpd
[root@keepalive-A ~]# ip a l
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:dc:3c brd ff:ff:ff:ff:ff:ff
[root@keepalive-A ~]# systemctl status keepalived.service 
Sep 05 21:21:14 cxjing.com Keepalived_vrrp[24153]: VRRP_Script(chk_nginx) failed

在HTTP進程停止之后锚国,80端口被釋放,則keepalive-A上的Nginx也不會再次重啟

雙主模式的Nginx調(diào)度(一般不會做會話綁定)

雙主模式的目的是為了解決訪問路徑的單點故障玄坦,當(dāng)一個web虛擬路由故障時血筑,可使用另外一個web路徑訪問,最終是實現(xiàn)集群的高可用性

實驗環(huán)境

keepalive-A 172.16.253.108
keepalive-B 172.16.253.105
Nginx-A     172.16.253.108
Nginx-B     172.16.253.105
LVS-RS1     172.16.250.127
LVS-RS2     172.16.253.193
VI-A        172.16.253.150
VI-B        172.16.253.140
client      172.16.253.177

環(huán)境拓撲圖

實現(xiàn)過程

keepalive-A

[root@keepalive-A ~]# vim /etc/keepalived/notify.sh 
#!/bin/bash
#
contact='root@localhost'

notify() {
    local mailsubject="$(hostname) to be $1, vip floating"
    local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    systemctl start nginx
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac
[root@keepalive-A ~]# systemctl stop keepalived  
[root@keepalive-A ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
    jevon@danran.com
}
notification_email_from ka_admin@danran.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id keepaliveA
vrrp_mcast_group4 224.103.5.5
}
vrrp_script chk_mant_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
    interval 1
    weight -10
    fall 2
    rise 1
}
vrrp_script chk_nginx {
    script "killall -0 nginx"
    interval 2
    weight -10
    fall 2
    rise 2
}
vrrp_instance VI_A {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qr8hQHuL
    }
    virtual_ipaddress {
        172.16.253.150/32
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
    track_script {
        chk_mant_down
        chk_nginx
    }
}
vrrp_instance VI_B {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qr8hQH99
    }
    virtual_ipaddress {
        172.16.253.140/32
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
    track_script {
        chk_mant_down
        chk_nginx
    }
}
[root@keepalive-A ~]# systemctl start keepalived

keepalive-B

[root@keepalive-A ~]# vim /etc/keepalived/notify.sh 
#!/bin/bash
#
contact='root@localhost'

notify() {
    local mailsubject="$(hostname) to be $1, vip floating"
    local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    systemctl start nginx
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac
[root@keepalive-B ~]# systemctl stop keepalived  
[root@keepalive-B ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
    jevon@danran.com
}
notification_email_from ka_admin@danran.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id keepaliveA
vrrp_mcast_group4 224.103.5.5
}
vrrp_script chk_mant_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
    interval 1
    weight -10
    fall 2
    rise 1
}
vrrp_script chk_nginx {
    script "killall -0 nginx"
    interval 2
    weight -10
    fall 2
    rise 2
}
vrrp_instance VI_A {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qr8hQHuL
    }
    virtual_ipaddress {
        172.16.253.150/32
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
    track_script {
        chk_mant_down
        chk_nginx
    }
}
vrrp_instance VI_B {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qr8hQH99
    }
    virtual_ipaddress {
        172.16.253.140/32
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
    track_script {
        chk_mant_down
        chk_nginx
    }
}
[root@keepalive-B ~]# systemctl start keepalived

查看keepalive-A和keepalive-B IP地址煎楣,確認(rèn)虛擬路由配置正確

[root@keepalive-A ~]# ip a l
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:dc:3c brd ff:ff:ff:ff:ff:ff
    inet 172.16.253.150/32 scope global ens33
   valid_lft forever preferred_lft forever
[root@keepalive-B ~]# ip a l
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0e:47:87 brd ff:ff:ff:ff:ff:ff
    inet 172.16.253.140/32 scope global ens33
   valid_lft forever preferred_lft forever

測試Nginx調(diào)度

[root@client ~]# for i in {1..10};do curl http://172.16.253.150;done
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>
[root@client ~]# for i in {1..10};do curl http://172.16.253.140;done
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>
<h1> Web RS2 </h1>
<h1> Web RS1 </h1>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豺总,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子择懂,更是在濱河造成了極大的恐慌喻喳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件困曙,死亡現(xiàn)場離奇詭異沸枯,居然都是意外死亡,警方通過查閱死者的電腦和手機赂弓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門绑榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盈魁,你說我怎么就攤上這事翔怎。” “怎么了杨耙?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵赤套,是天一觀的道長。 經(jīng)常有香客問我珊膜,道長容握,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任车柠,我火速辦了婚禮剔氏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竹祷。我一直安慰自己谈跛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布塑陵。 她就那樣靜靜地躺著感憾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪令花。 梳的紋絲不亂的頭發(fā)上阻桅,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天凉倚,我揣著相機與錄音,去河邊找鬼嫂沉。 笑死占遥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的输瓜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼芬萍,長吁一口氣:“原來是場噩夢啊……” “哼尤揣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柬祠,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤北戏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漫蛔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜愈,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年莽龟,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠕嫁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡毯盈,死狀恐怖剃毒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搂赋,我是刑警寧澤赘阀,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站脑奠,受9級特大地震影響基公,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宋欺,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一轰豆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧齿诞,春花似錦秒咨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吠式,卻和暖如春陡厘,著一層夾襖步出監(jiān)牢的瞬間抽米,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工糙置, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留云茸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓谤饭,卻偏偏與公主長得像标捺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子揉抵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx亡容?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,649評論 24 1,002
  • 《老男孩Linux運維》Nginx Documentation 集群簡介 集群就是指一組(若干)相互獨立的計算機冤今,...
    Zhang21閱讀 3,379評論 0 51
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》闺兢,我們講述了瀏覽器端請求發(fā)起過程,通過DNS域名解析服務(wù)器IP戏罢,并建...
    七寸知架構(gòu)閱讀 80,942評論 21 356
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務(wù)都無法達到并發(fā)響應(yīng)量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 1,993評論 0 9
  • 斑妃淚灑池塘邊屋谭, 夜里來風(fēng)影相連。 幾度明滅歲月老龟糕, 溪聲有情伴人眠桐磁。
    霑露飲冰小先生閱讀 214評論 0 0