linux: Keepalived工作原理以及簡(jiǎn)要安裝

===============================

高性能集群軟件-Keepalived

===============================

keepalived 介紹

keepalived 是 Linux下一個(gè)輕量級(jí)的高可用解決方案
keepalived 主要通過(guò)虛擬路由冗余(VRRP)來(lái)實(shí)現(xiàn)高可用功能

優(yōu)點(diǎn):部署及使用簡(jiǎn)單,只需一個(gè)配置文件即可完成
功能:1. 服務(wù)器狀態(tài)檢測(cè)和故障隔離功能 2. HA(High Available)cluster

keepalived 發(fā)展

keepalived起初是為L(zhǎng)VS(Linux Virtual System)設(shè)計(jì),專門(mén)監(jiān)控集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài)
根據(jù)TCP/IP參考模型 第三、第四、第五層交換機(jī)制檢測(cè)每個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài)

e.g: keepalived檢測(cè)WEB服務(wù)器的狀態(tài)
如果一臺(tái)WEB服務(wù)器死機(jī)/工作出現(xiàn)故障,keepalived檢測(cè)到此狀況后會(huì)將故障服務(wù)器從系統(tǒng)中剔除,
直至該服務(wù)器工作正常后keepalived自動(dòng)將該服務(wù)器加入到服務(wù)器群中.
以上工作keepalived自動(dòng)完成,無(wú)需人工干涉,人工干預(yù)僅是修復(fù)出現(xiàn)故障的服務(wù)節(jié)點(diǎn)

keepalived 后續(xù)加入了VRRP功能
VRRP(Virtaul Router Redunadancy Protocol,虛擬路由器冗余協(xié)議)
目的:解決靜態(tài)路由出現(xiàn)的單點(diǎn)故障問(wèn)題,實(shí)現(xiàn)網(wǎng)絡(luò)不間斷穩(wěn)定運(yùn)行

VRRP 協(xié)議與工作原理

引入VRRP概念


說(shuō)明:圖片來(lái)源百度百科;左側(cè)圖片為局域網(wǎng)組網(wǎng);右側(cè)圖片為VRRP組網(wǎng)

局域網(wǎng)組網(wǎng) e.g:
網(wǎng)絡(luò)內(nèi)的所有主機(jī)會(huì)設(shè)置一條默認(rèn)網(wǎng)關(guān)(10.100.10.1),當(dāng)主機(jī)發(fā)出的目的地址不在本網(wǎng)段(10.100.10.0/24)的報(bào)文,通過(guò)默認(rèn)網(wǎng)關(guān)發(fā)往路由器A,從而實(shí)現(xiàn)主機(jī)與外部網(wǎng)絡(luò)的通信

該組網(wǎng)缺點(diǎn):當(dāng)路由器A壞掉時(shí),本網(wǎng)段內(nèi)通過(guò)以RA為默認(rèn)網(wǎng)關(guān)下一跳的主機(jī)將斷掉與外界的通信,產(chǎn)生單點(diǎn)故障

VRRP組網(wǎng) e.g:
RA:Master 活動(dòng)路由器 10.100.10.2
RB:Backup 備份路由器 10.100.10.3
VRIP : 虛擬路由器IP 10.100.10.1

VRRP將局域網(wǎng)中的一組路由器【 RA和RB】組成一個(gè)虛擬路由器------>>>備份組
虛擬路由器擁有自己的IP地址 10.100.10.1
局域網(wǎng)內(nèi)的主機(jī)僅知道虛擬路由器IP地址為10.100.10.1,不知道具體的Master與Backup路由器IP
局域網(wǎng)內(nèi)的主機(jī)將默認(rèn)網(wǎng)關(guān)下一跳的地址設(shè)置為該虛擬路由器IP地址,通過(guò)該地址與其他網(wǎng)絡(luò)進(jìn)行通信

該組網(wǎng)優(yōu)點(diǎn):當(dāng)備份組內(nèi)的Master路由器DOWN掉,會(huì)進(jìn)行選舉策略選出一個(gè)新的Master路由器,繼續(xù)往網(wǎng)絡(luò)內(nèi)的主機(jī)提供路由服務(wù),從而實(shí)現(xiàn)網(wǎng)絡(luò)內(nèi)的主機(jī)不間斷地與外部網(wǎng)絡(luò)進(jìn)行通信

VRRP 協(xié)議
VRRP:解決局域網(wǎng)中配置靜態(tài)網(wǎng)關(guān)出現(xiàn)單點(diǎn)失效的路由協(xié)議
設(shè)計(jì)目標(biāo):網(wǎng)絡(luò)發(fā)生故障時(shí)透明地進(jìn)行設(shè)備切換而不影響主機(jī)間的數(shù)據(jù)通信

VRRP 工作原理
VRRP協(xié)議將兩臺(tái)或多臺(tái)路由器設(shè)備虛擬成一個(gè)虛擬路由器,對(duì)外提供虛擬路由器IP(一個(gè)或多個(gè))
而在路由器組內(nèi)部,如果實(shí)際擁有這個(gè)對(duì)外IP的路由器如果工作正常的話就是MASTER, 或者是通 過(guò)算法選舉產(chǎn)生
MASTER實(shí)現(xiàn)針對(duì)虛擬路由器IP的各種網(wǎng)絡(luò)功能,如ARP請(qǐng)求,ICMP,以及數(shù)據(jù)的轉(zhuǎn)發(fā)等
其他設(shè)備不擁有該IP,狀態(tài)是BACKUP,除了接收MASTER的VRRP狀態(tài)通告信息外,不執(zhí)行對(duì)外 的網(wǎng)絡(luò)功能
當(dāng)主機(jī)失效時(shí),BACKUP將接管原先MASTER的網(wǎng)絡(luò)功能

如何判定多個(gè)路由器在同一組虛擬路由器中?
VRID:每個(gè)虛擬路由器都有一個(gè)唯一標(biāo)識(shí)(VRID是一個(gè)0~255的正整數(shù))
配置VRRP協(xié)議時(shí)需要配置每個(gè)路由器的虛擬路由器ID(VRID)和優(yōu)先權(quán)值
使用VRID將路由器進(jìn)行分組,具有相同VRID值的路由器為同一個(gè)組

BACKUP 為什么沒(méi)有發(fā)生搶占?
VRRP通告:它使用IP多播數(shù)據(jù)包進(jìn)行封裝,組地址為224.0.0.18,發(fā)布范圍只限于同一局域網(wǎng)內(nèi)
在一個(gè)虛擬路由器中,只有處于MASTER角色的路由器會(huì)一直發(fā)送VRRP通告信息
處于BACKUP狀態(tài)的路由器只接收MASTER發(fā)過(guò)來(lái)的報(bào)文信息,用來(lái)監(jiān)控MASTER運(yùn)行狀態(tài), 除非它的優(yōu)先級(jí)比MASTER更高

什么時(shí)候發(fā)生選舉?
當(dāng)MASTER不可用時(shí),BACKUP無(wú)法收到MASTER發(fā)過(guò)來(lái)的報(bào)文信息
認(rèn)定MASTER出現(xiàn)故障,然后多臺(tái)BACKUP就開(kāi)始進(jìn)行選舉

Master選舉
虛擬路由器IP=路由器本身配置IP
該路由器始終將是MASTER;IP地址所有者自動(dòng)具有最高優(yōu)先級(jí):255
優(yōu)先級(jí)選舉主控路由器(優(yōu)先級(jí)范圍是0—255)
優(yōu)先級(jí)0一般用在IP地址所有者主動(dòng)放棄主控者角色時(shí)使用??膳渲玫膬?yōu)先級(jí)范圍為1—254
優(yōu)先級(jí)相等,則比較路由器的實(shí)際IP,IP值較大的優(yōu)先權(quán)高

VRRP 應(yīng)用實(shí)例

            +-----------+      +-----------+
            |   Rtr1    |      |   Rtr2    |
            |(MR VRID=1)|      |(BR VRID=1)|
            |(BR VRID=2)|      |(MR VRID=2)|
    VRID=1  +-----------+      +-----------+  VRID=2
    IP A ---------->*            *<---------- IP B
                    |            |
                    |            |
  ------------------+------------+-----+--------+--------+--------+--
                                       ^        ^        ^        ^
                                       |        |        |        |
                                     (IP A)   (IP A)   (IP B)   (IP B)
                                       |        |        |        |
                                    +--+--+  +--+--+  +--+--+  +--+--+
                                    |  H1 |  |  H2 |  |  H3 |  |  H4 |
                                    +-----+  +-----+  +--+--+  +--+--+
     Legend:
              ---+---+---+--  =  Ethernet, Token Ring, or FDDI
                           H  =  Host computer
                          MR  =  Master Router
                          BR  =  Backup Router
                           *  =  IP Address
                        (IP)  =  default router for hosts

+   VRID 1       |   Rtr1(Master)     |    Rtr2(Backup) +  正常情況下  H1與H2走R1;反之 走R2

-------------------------------------------------------------------------------------------------------------

 +   VRID 2       |   Rtr1(Backup)    |    Rtr2 (Master) +  正常情況下  H3與H4走R2;反之 走R1

------------------------------------------------------------------------------------------------------------

Keepalived 工作原理

根據(jù)TCP/IP參考模型各層所能實(shí)現(xiàn)的功能,Keepalived運(yùn)行機(jī)制如下:

網(wǎng)絡(luò)層

協(xié)議:    
IP(Internet Protocol網(wǎng)際協(xié)議)  
ARP(Address Resolution Protoco 地址轉(zhuǎn)換協(xié)議) 
RARP(Reverse Address Resolution Protocol  反向地址轉(zhuǎn)換協(xié)議 )
ICMP(Internet Control Message Protocol 網(wǎng)絡(luò)控制報(bào)文協(xié)議)  

常用:
通過(guò)ICMP協(xié)議向服務(wù)器集群中的每個(gè)節(jié)點(diǎn)發(fā)送一個(gè)ICMP的數(shù)據(jù)包(類似ping實(shí)現(xiàn))
如果某個(gè)節(jié)點(diǎn)沒(méi)有返回響應(yīng)數(shù)據(jù)包,那么認(rèn)為此節(jié)點(diǎn)發(fā)生了故障
keepalived將報(bào)告該節(jié)點(diǎn)失效,并從服務(wù)器集群中剔除故障節(jié)點(diǎn)

傳輸層

協(xié)議:  
TCP (傳輸控制協(xié)議)(三次握手、安全可靠)
UDP (用戶數(shù)據(jù)協(xié)議)
------------------------------------------------------------------------------------
TCP提供可靠的數(shù)據(jù)傳輸服務(wù)、IP地址和端口,代表TCP的一個(gè)連接端
獲取TCP服務(wù),需要在發(fā)送機(jī)的一個(gè)端口上和接收機(jī)上一個(gè)端口上建立連接
-------------------------------------------------------------------------------------
常用:利用TCP協(xié)議的端口連接和掃描技術(shù)來(lái)判斷集群節(jié)點(diǎn)是否正常
e.g: SSH服務(wù)默認(rèn)22端口,WEB服務(wù)器80端口····Keepalived在傳輸層探測(cè)某端口沒(méi)有響應(yīng)數(shù)據(jù)
判定端口異常,強(qiáng)制將此端口對(duì)應(yīng)的節(jié)點(diǎn)從服務(wù)器及群組中移除

應(yīng)用層

協(xié)議:
FTP、TELNET、SMTP、DNS ····
-----------------------------------------------------------------------
用戶可以通過(guò)自定義Keepalived的工作方式
-----------------------------------------------------------------------
e.g:用戶編輯程序運(yùn)行Keepalived,而Keepalived 根據(jù)用戶設(shè)定檢測(cè)各種程序或服務(wù)是否允許正常

keepalived 結(jié)構(gòu)體系


keepalived 安裝

?實(shí)驗(yàn)需求:
*安裝keepalived(僅安裝)
?實(shí)驗(yàn)實(shí)現(xiàn):?
*服務(wù)器:CentOS 6.5-minimal
*?軟 件:Keepalived ( V_1.2.19 )
?安裝過(guò)程:
>>>下載安裝包并解壓,查看相關(guān)參數(shù)

[root@lucia tmp]# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz    # 下載Keepalived安裝包
[root@lucia tmp]# tar -zxf keepalived-1.2.19.tar.gz   #解壓安裝包
[root@lucia tmp]# cd keepalived-1.2.19
[root@lucia keepalived-1.2.19]# ./configure --help    #查看confiure編譯參數(shù)
 
#================================================
# 指定安裝在/etc/ {--sysconfdir=/etc}
# 指定使用內(nèi)核源碼中的頭文件 {--with-kernel-dir}
# 注:使用LVS時(shí),需要用到"--with-kernel-dir"
#===============================================

>>>編譯安裝

[root@lucia keepalived-1.2.19]# [ -z /usr/src/kernels/ ] && yum -y install kernel-headers kernel-devel || echo "The kernel file already exists"
The kernel file already exists
 
#===========================
# 判斷kernels目錄是否存在文件
#===========================
 
[root@lucia keepalived-1.2.19]# ./configure --sysconfdir=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64
 
#============================================================================
# ./configure 對(duì)即將安裝的軟件進(jìn)行配置,檢查當(dāng)前的環(huán)境是否滿足要安裝軟件的依賴關(guān)系
#============================================================================

configure: error: in `/tmp/keepalived-1.2.19':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
 
#============================================================================
# 報(bào)錯(cuò):gcc編譯器沒(méi)有安裝
# [root@lucia keepalived-1.2.19]# yum -y install gcc
#=============================================================================
      
繼續(xù)返回上一步預(yù)安裝./configure
[root@lucia keepalived-1.2.19]# ./configure --sysconfdir=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64
 
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files.            !!!
 
#=========================================================================
# 報(bào)錯(cuò):OpenSSL 沒(méi)有安裝
# [root@lucia keepalived-1.2.19]# yum -y install openssl*
#=========================================================================

./configure 成功后,顯示是Keepalived 輸出的加載模塊信息

Keepalived configuration
------------------------
Keepalived version       : 1.2.19                         
Compiler                 : gcc
Compiler flags           : -g -O2
Extra Lib                : -lssl -lcrypto -lcrypt 
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
IPVS use libnl           : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
SNMP support             : No
SHA1 support             : No
Use Debug flags          : No

[root@lucia keepalived-1.2.19]# make && make install                     #編譯&&安裝
[root@lucia keepalived-1.2.19]# ln -s /usr/local/sbin/keepalived /sbin/  #軟鏈接到系統(tǒng)使用的管理程序目錄中
[root@lucia keepalived-1.2.19]# chkconfig --add keepalived               #添加到系統(tǒng)服務(wù)
[root@lucia keepalived-1.2.19]# chkconfig --level 35 keepalived on       #添加到開(kāi)機(jī)啟動(dòng)

? Keepalived 配置詳解

[root@lucia keepalived-1.2.19]# cd /etc/keepalived/
[root@lucia keepalived-1.2.19]# ls
keepalived.conf  samples

# ================================================================
# Keepalived 配置文件路徑為/etc/keepalived/keepalived.conf
# samples 目錄下存放著keepalived配置的示例
# ================================================================
#============================================================
# keepalived.conf 配置
#------------------------------------------------------------
# 1、Keepalived 配置文件以block形式組織,每個(gè)塊內(nèi)容都包含在{}
# 2、“#”   “!” 開(kāi)頭行為注釋
# 3、keepalived 配置為三類:
#      全局配置:對(duì)整個(gè)keepalived都生效的配置 
#    VRRPD 配置:核心配置,主要實(shí)現(xiàn)keepalived高可用功能
#      LVS配置
#============================================================


! Configuration File for keepalived   

    
########################
#  全局配置
########################

 
global_defs {                               # global_defs 全局配置標(biāo)識(shí) 
                                            ------------------------------------------
   notification_email {                     # notification_email用于設(shè)置報(bào)警郵件地址
     acassen@firewall.loc                   # 可以設(shè)置多個(gè),每行一個(gè)
     failover@firewall.loc                  # 設(shè)置郵件報(bào)警,需開(kāi)啟本機(jī)Sendmail 服務(wù)
     sysadmin@firewall.loc                  # yum -y install mailx sendmail
   }                                        ----------------------------------------------

   notification_email_from Alexandre.Cassen@firewall.loc  # 設(shè)置郵件發(fā)送地址
   smtp_server 192.168.200.1                              # 設(shè)置郵件的smtp server地址
   smtp_connect_timeout 30                                # 設(shè)置連接smtp sever超時(shí)時(shí)間
   router_id LVS_DEVEL                                    # 表示運(yùn)行keepalived服務(wù)器標(biāo)識(shí),發(fā)郵件時(shí)顯示在郵件主題中的信息
}

######################
#  VRRPD配置
######################

vrrp_instance VI_1 {         # VRRPD 配置標(biāo)識(shí) VI_1是實(shí)例名稱

    state MASTER             # 指定Keepalvied角色 MASTER表示此主機(jī)為主服務(wù)器 BACKUP則是表示為備用服務(wù)器
    interface eth0           # 指定 HA 監(jiān)測(cè)網(wǎng)絡(luò)的接口
    virtual_router_id 51     # 虛擬路由標(biāo)識(shí),標(biāo)識(shí)為數(shù)字,同一個(gè)VRRP實(shí)例使用唯一的標(biāo)識(shí),即可表示在同一個(gè)vrrp_instance下 MASTER_ID = BACKUP_ID
    priority 100             # 定義節(jié)點(diǎn)優(yōu)先級(jí),數(shù)字越大表示節(jié)點(diǎn)的優(yōu)先級(jí)越高,同一個(gè)VRRP_instance下,MASTE_PRIORITY > BACKUP_PRIORITY 
    advert_int 1             # 設(shè)定MASTER與BACKUP主機(jī)質(zhì)檢同步檢查的時(shí)間間隔,單位為秒
             
    authentication {         # 設(shè)定節(jié)點(diǎn)間通信驗(yàn)證類型和密碼,驗(yàn)證類型主要有PASS和AH兩種
        auth_type PASS       # 同一個(gè)vrrp_instance,MASTER驗(yàn)證密碼和BACKUP保持一致
        auth_pass 1111
    }

    virtual_ipaddress {      # 設(shè)置虛擬IP地址 (VIP),又叫做漂移IP地址
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }

#-------------------------------------------------------------------------------
# 問(wèn):為什么叫漂移IP地址?
# 答:當(dāng)Keepalived切換到MASTER狀態(tài)時(shí),IP地址會(huì)自動(dòng)添加到系統(tǒng)中
#    當(dāng)Keepalvied切換到BACKUP狀態(tài)時(shí),IP地址將自動(dòng)從系統(tǒng)中刪除
#    
#    keepalived通過(guò)“ip address add”命令的形式將VIP添加到系統(tǒng)
#    通過(guò)“ip add”查看系統(tǒng)中添加的VIP地址
#--------------------------------------------------------------------------------

}

######################
# LVS配置
######################


virtual_server 192.168.200.100 443 {              # virtual_server LVS配置標(biāo)識(shí) 
                                                  # 格式:virtual_server VIP port [IP 和 port 之間空格隔開(kāi)]
 
    delay_loop 6                                  # 設(shè)置健康檢查時(shí)間間隔,單位為秒                      
    lb_algo rr                                    # 設(shè)置負(fù)載調(diào)度算法,可用的調(diào)度算法有:rr、wlc、lc、lblc、sh、dh等
    lb_kind NAT                                   # 設(shè)置LVS實(shí)現(xiàn)負(fù)載均衡的機(jī)制,有NAT、TUN和DR三種模式可選
    nat_mask 255.255.255.0                        # NAT子網(wǎng)掩碼
    persistence_timeout 50                        # 會(huì)話保持時(shí)間 
    protocol TCP                                  # 指定轉(zhuǎn)發(fā)協(xié)議類型
#----------------------------------------------------------------------------------------------------
# persistence_timeout 會(huì)話保持時(shí)間對(duì)動(dòng)態(tài)網(wǎng)頁(yè)非常有用,為集群系統(tǒng)中的seesion共享提供了一個(gè)很好的解決方案
# 用戶的請(qǐng)求會(huì)一直分發(fā)到某個(gè)服務(wù)節(jié)點(diǎn),直至超過(guò)這個(gè)會(huì)話的保持時(shí)間(指最大無(wú)響應(yīng)超時(shí)時(shí)間)
# =[用戶操作動(dòng)態(tài)頁(yè)面如果在50s沒(méi)有執(zhí)行任何操作則被分發(fā)到另外的節(jié)點(diǎn)]
#----------------------------------------------------------------------------------------------------

    real_server 192.168.201.100 443 {                          # 設(shè)置real server段開(kāi)始的標(biāo)識(shí) [ IP為真實(shí)IP地址]
                                                               # 格式:real_server realIP port [IP 和 port 之間空格隔開(kāi)]
                                                               -----------------------------------------------------------------
        weight 1                                               # 用于配置real server節(jié)點(diǎn)的權(quán)值,權(quán)值大小用數(shù)字表示,數(shù)字越大,權(quán)值越高
                                                               # 設(shè)置權(quán)值大小可以為不同性能的服務(wù)器分配不同的負(fù)載
                                                               ------------------------------------------------------------------

        SSL_GET {                                              # 健康檢查 SSL_GET    
            url {                                              # 指定SSL檢查的URL信息,可以指定多個(gè)
              path /index.html                                 # 后跟詳細(xì)的URL路徑
              digest ff20ad2481f97b1754ef3e12ecd3a9cc          # SSL檢查后的摘要信息,可以通過(guò)genhash命令工具獲取
#-----------------------------------------------------------------
# [root@lucia keepalived]# genhash -s 192.168.201.100 -p 80 -u /index.html
#-----------------------------------------------------------------
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3                                  # 表示無(wú)響應(yīng)超時(shí)時(shí)間,單位為秒
            nb_get_retry 3                                     # 表示重試次數(shù)
            delay_before_retry 3                               # 表示充實(shí)間隔
        } 
    }
}
 
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
 
    sorry_server 192.168.200.200 1358                          # 備份節(jié)點(diǎn),在所有real serer失效后,啟用備份節(jié)點(diǎn)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 集群工作原理 一:集群基礎(chǔ) 1、系統(tǒng)的擴(kuò)展方式 scale up向上擴(kuò)展:提高單臺(tái)服務(wù)器的性能 scale out...
    芷_念閱讀 5,086評(píng)論 0 0
  • 一、高可用集群 (一)提升系統(tǒng)高可用性的解決方案:冗余(redundant) 工作模式active/passive...
    哈嘍別樣閱讀 1,806評(píng)論 2 5
  • Nginx+Keepalived實(shí)現(xiàn)站點(diǎn)高可用 公司內(nèi)部 OA 系統(tǒng)要做線上高可用,避免單點(diǎn)故障,所以計(jì)劃使用2臺(tái)...
    meng_philip123閱讀 1,981評(píng)論 2 18
  • 前些天,Jenny發(fā)了一條朋友圈,附上兩張照片,第一張是一個(gè)男生的背影,他牽著她的手;第二張,是兩張紅本本。配文是...
    TF_Java閱讀 205評(píng)論 0 1
  • 獨(dú)婦弱,憐之。婦心很,可恨。
    常青滕閱讀 183評(píng)論 1 1

友情鏈接更多精彩內(nèi)容