国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種實(shí)現(xiàn)Redis集群高可用的方法及系統(tǒng)的制作方法

      文檔序號(hào):10572761閱讀:599來(lái)源:國(guó)知局
      一種實(shí)現(xiàn)Redis集群高可用的方法及系統(tǒng)的制作方法
      【專利摘要】本發(fā)明公開一種實(shí)現(xiàn)Redis集群高可用的方法及系統(tǒng),所述集群包括中間件、至少兩個(gè)與所述中間件連接的代理節(jié)點(diǎn),與所述代理節(jié)點(diǎn)連接的Redis服務(wù)器,該方法包括:所述中間件為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路;所述中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路;所述中間件確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值;若是,則所述中間件將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信,用以解決傳統(tǒng)的Redis集群無(wú)法自動(dòng)隔離掉故障代理節(jié)點(diǎn)的問(wèn)題。
      【專利說(shuō)明】
      一種實(shí)現(xiàn)Red i s集群高可用的方法及系統(tǒng)
      技術(shù)領(lǐng)域
      [0001]本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種實(shí)現(xiàn)Redis集群高可用的方法及系統(tǒng)。
      【背景技術(shù)】
      [0002]目前web應(yīng)用系統(tǒng)為了解決高并發(fā)帶來(lái)的性能問(wèn)題,都會(huì)在web應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)之間采取緩存層,使用最為廣泛的就是RediS(RediS本質(zhì)上是一個(gè)鍵-值類型的內(nèi)存數(shù)據(jù)庫(kù)KRedis作為軟件和傳統(tǒng)數(shù)據(jù)庫(kù)之間的緩沖層,操作命令簡(jiǎn)單,在保證了數(shù)據(jù)有效性的情況下,同時(shí)也保證了高性能。
      [0003]傳統(tǒng)的Redis集群如圖1所示,包括:中間件、代理節(jié)點(diǎn)和服務(wù)器,其中,Redis集群中至少包含兩臺(tái)代理節(jié)點(diǎn)、三臺(tái)主服務(wù)器和三臺(tái)從服務(wù)器,中間件發(fā)起的每個(gè)工作線程隨機(jī)直連一臺(tái)代理節(jié)點(diǎn),而代理節(jié)點(diǎn)再與主服務(wù)器連接,每個(gè)代理節(jié)點(diǎn)之間連接的主服務(wù)器相同,這種方式可以有效地實(shí)現(xiàn)負(fù)載均衡,但是在任意一個(gè)代理節(jié)點(diǎn)發(fā)生故障時(shí),傳統(tǒng)的集群并不能及時(shí)地隔離掉故障代理節(jié)點(diǎn),因此導(dǎo)致在人工隔離故障代理節(jié)點(diǎn)前存在部分中間件發(fā)出的請(qǐng)求處理失敗,可見,傳統(tǒng)的Redis集群無(wú)法自動(dòng)隔離掉故障代理節(jié)點(diǎn),影響了正常地業(yè)務(wù)處理請(qǐng)求。

      【發(fā)明內(nèi)容】

      [0004]本發(fā)明實(shí)施例提供一種實(shí)現(xiàn)Redis集群高可用的方法及系統(tǒng),用以解決傳統(tǒng)的Redis集群無(wú)法自動(dòng)隔離掉故障代理節(jié)點(diǎn)的問(wèn)題。
      [0005]本發(fā)明方法包括一種實(shí)現(xiàn)Redis集群高可用的方法,所述集群包括中間件、至少兩個(gè)與所述中間件連接的代理節(jié)點(diǎn),與所述代理節(jié)點(diǎn)連接的Redis服務(wù)器,該方法包括:所述中間件為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路;
      [0006]所述中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路;
      [0007]所述中間件確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值;
      [0008]若是,則所述中間件將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信。
      [0009]基于同樣地發(fā)明構(gòu)思,本發(fā)明實(shí)施例進(jìn)一步地提供一種實(shí)現(xiàn)Redis集群高可用的系統(tǒng),所述系統(tǒng)包括中間件、至少兩個(gè)與所述中間件連接的代理節(jié)點(diǎn),與所述代理節(jié)點(diǎn)連接的Redis服務(wù)器,所述中間件包括:
      [0010]連接池生成單元,用于為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路;
      [0011]偵測(cè)單元,用于通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路;
      [0012]判斷單元,用于確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值;
      [0013]若是,處理單元,用于將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信。
      [0014]本發(fā)明實(shí)施例中間件建立與所述每個(gè)代理節(jié)點(diǎn)通信的連接池,其中,所述連接池中包含所述中間件與所述每個(gè)代理節(jié)點(diǎn)通信的各條連接鏈路,一方面,中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)所述連接池中的連接鏈路,并將標(biāo)記發(fā)生故障的連接鏈路,當(dāng)所述中間件確定對(duì)應(yīng)任意一個(gè)代理節(jié)點(diǎn)被標(biāo)記的連接鏈路條數(shù)大于設(shè)定閾值時(shí),將對(duì)應(yīng)的代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn)并隔離,以使所述中間件停止與所述故障代理節(jié)點(diǎn)的通信。也就是說(shuō),對(duì)于任意一個(gè)代理節(jié)點(diǎn)來(lái)說(shuō),若中間件主動(dòng)檢測(cè)到與該代理節(jié)點(diǎn)對(duì)應(yīng)連接的設(shè)定數(shù)量的連接鏈路均失效,則證明該代理節(jié)點(diǎn)發(fā)生故障,因此主動(dòng)將該代理節(jié)點(diǎn)定義為故障代理節(jié)點(diǎn),停止與該故障代理節(jié)點(diǎn)的通信,從而實(shí)現(xiàn)了自動(dòng)隔離故障節(jié)點(diǎn)的功能,保證了中間件與代理節(jié)點(diǎn)之間的業(yè)務(wù)處理不受影響。
      【附圖說(shuō)明】
      [0015]為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
      [0016]圖1為現(xiàn)有技術(shù)提供的一種Redis集群架構(gòu);
      [0017]圖2為本發(fā)明實(shí)施例提供一種實(shí)現(xiàn)Redis集群高可用的方法流程示意圖;
      [0018]圖3為本發(fā)明實(shí)施例提供一種偵測(cè)線程和正常工作線程的處理過(guò)程;
      [0019]圖4為本發(fā)明實(shí)施例提供一種代理節(jié)點(diǎn)進(jìn)行主從切換的過(guò)程;
      [0020]圖5為本發(fā)明實(shí)施例還提供一種實(shí)現(xiàn)Redis集群高可用的系統(tǒng)。
      【具體實(shí)施方式】
      [0021]為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部份實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
      [0022]參見圖2所示,本發(fā)明實(shí)施例提供一種實(shí)現(xiàn)Redis集群高可用的方法流程示意圖,具體地實(shí)現(xiàn)方法包括:
      [0023]步驟SlOl,所述中間件為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路。
      [0024]步驟S102,所述中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路。
      [0025]步驟S103,所述中間件確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值。
      [0026]步驟S104,若是,則將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信。
      [0027]因?yàn)橹虚g件與代理節(jié)點(diǎn)之間是通過(guò)各條連接鏈路進(jìn)行通信的,當(dāng)代理節(jié)點(diǎn)發(fā)生故障,與該代理節(jié)點(diǎn)連接的各條連接鏈路是無(wú)法進(jìn)行正常通信的,所以本發(fā)明實(shí)施例通過(guò)監(jiān)測(cè)每個(gè)代理節(jié)點(diǎn)對(duì)應(yīng)的連接池中連接鏈路的運(yùn)行狀態(tài),當(dāng)發(fā)現(xiàn)某一個(gè)代理節(jié)點(diǎn)對(duì)應(yīng)的連接池中有大部分的連接鏈路都發(fā)生故障了,或者說(shuō)當(dāng)發(fā)現(xiàn)全部都發(fā)生故障了,則證明該代理節(jié)點(diǎn)是故障代理節(jié)點(diǎn),否則,如果只是某幾條鏈路發(fā)生故障,很可能是因?yàn)闀簳r(shí)的網(wǎng)絡(luò)不穩(wěn)定等原因造成的,因此仍然認(rèn)定該代理節(jié)點(diǎn)是正常的。
      [0028]在步驟S104之后,本發(fā)明實(shí)施例進(jìn)一步地幀測(cè)連接池中的被標(biāo)記的連接鏈路是否恢復(fù)正常,若發(fā)現(xiàn)對(duì)應(yīng)同一個(gè)代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路有設(shè)定數(shù)量恢復(fù)正常了,或者全部恢復(fù)正常了,則認(rèn)為該代理節(jié)點(diǎn)恢復(fù)正常,將該代理節(jié)點(diǎn)從故障狀態(tài)修復(fù)為正常狀態(tài),即恢復(fù)通信。
      [0029]進(jìn)一步地,所述標(biāo)記發(fā)生故障的連接鏈路之后,還包括:
      [0030]將被標(biāo)記的連接鏈路從所述連接池轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中;
      [0031]所述中間件確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值,包括:所述中間件確定所述不可用服務(wù)鏈表中對(duì)應(yīng)同一代理節(jié)點(diǎn)的連接鏈路條數(shù)是否大于設(shè)定閾值。
      [0032]也就是說(shuō),預(yù)先建立一個(gè)不可用服務(wù)鏈表,該鏈表用于存儲(chǔ)被標(biāo)記的連接鏈路,通過(guò)判斷不可用服務(wù)鏈表中對(duì)應(yīng)同一代理節(jié)點(diǎn)的連接鏈路個(gè)數(shù)確定故障代理節(jié)點(diǎn)。需要說(shuō)明的是,每條連接鏈路均具有標(biāo)識(shí)屬于哪個(gè)代理節(jié)點(diǎn)的屬性,所以在不可用服務(wù)鏈表中的故障連接鏈路是可以通過(guò)這樣屬性確定屬于哪個(gè)代理節(jié)點(diǎn)的。
      [0033]進(jìn)一步地,所述中間件通過(guò)所述偵測(cè)線程偵測(cè)所述不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常;
      [0034]若是,則所述中間件將恢復(fù)正常的連接鏈路從所述不可用服務(wù)鏈表轉(zhuǎn)移至所述恢復(fù)正常的連接鏈路對(duì)應(yīng)的連接池中;
      [0035]當(dāng)所述故障代理節(jié)點(diǎn)對(duì)應(yīng)的恢復(fù)正常的連接鏈路大于設(shè)定閾值時(shí),所述中間件恢復(fù)所述故障代理節(jié)點(diǎn)的通信。
      [0036]上述過(guò)程指的是中間件的偵測(cè)線程監(jiān)測(cè)不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常,若發(fā)現(xiàn)連接鏈路恢復(fù)正常,則可以將該部分恢復(fù)正常的連接鏈路從不可用服務(wù)鏈表轉(zhuǎn)移至連接池中,若對(duì)應(yīng)同一個(gè)故障代理節(jié)點(diǎn),有設(shè)定數(shù)量個(gè)的連接鏈路被轉(zhuǎn)移至連接池中,則說(shuō)明該故障代理節(jié)點(diǎn)恢復(fù)正常,因此將該代理節(jié)點(diǎn)從故障狀態(tài)修復(fù)為正常狀態(tài),即恢復(fù)通?目O
      [0037]需要說(shuō)明的是,上述監(jiān)測(cè)不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常的過(guò)程與偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路是否發(fā)生故障的過(guò)程可以是先后進(jìn)行的,也可以同時(shí)進(jìn)行的,具體選擇根據(jù)實(shí)際需要確定。另外,中間件判斷對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值,該設(shè)定閾值與上文判斷有設(shè)定數(shù)量個(gè)的連接鏈路被轉(zhuǎn)移至連接池中的設(shè)定數(shù)量,可以是相同的,也可以是不同的,設(shè)定閾值的大小和設(shè)定數(shù)量的大小是在具體應(yīng)用場(chǎng)景下的的經(jīng)驗(yàn)值。
      [0038]進(jìn)一步地,所述中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,包括:
      [0039]所述中間件運(yùn)行偵測(cè)線程,所述偵測(cè)線程執(zhí)行如下動(dòng)作:
      [0040]從所述連接池中輪詢獲取每條連接鏈路;
      [0041 ]針對(duì)獲取的每條連接鏈路,向每條連接鏈路發(fā)起心跳檢測(cè);
      [0042]若心跳檢測(cè)成功,則確定所述連接鏈路正常,否則將所述連接鏈路確定為發(fā)生故障的連接鏈路。
      [0043]假設(shè)說(shuō)對(duì)應(yīng)一個(gè)代理節(jié)點(diǎn)的連接池中有100條連接鏈路,偵測(cè)線程周期性從所述連接池中輪詢獲取每條連接鏈路,向連接池中連接鏈路發(fā)送心跳檢測(cè),當(dāng)收到心跳檢測(cè)的響應(yīng)時(shí),證明該條連接鏈路是可以正常通信的,否則,則說(shuō)明該條連接鏈路不能正常相同心跳報(bào)文,因此是發(fā)生故障的連接鏈路。
      [0044]考慮到所述中間件的偵測(cè)線程在工作的同時(shí),也在運(yùn)行讀寫請(qǐng)求的工作線程,所以,本發(fā)明實(shí)施例進(jìn)一步地,所述中間件接收應(yīng)用發(fā)送的讀寫請(qǐng)求;
      [0045]所述中間件根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn);
      [0046]利用所述所述代理節(jié)點(diǎn)的連接池中的連接鏈路將所述讀寫請(qǐng)求發(fā)送給所述對(duì)應(yīng)的代理節(jié)點(diǎn);
      [0047]若發(fā)送失敗,則所述讀寫請(qǐng)求對(duì)應(yīng)的連接鏈路從所述連接池中轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中。
      [0048]也就是說(shuō),中間件收到應(yīng)用程序發(fā)來(lái)的讀寫請(qǐng)求,首先確定本條讀寫請(qǐng)求對(duì)應(yīng)的哪個(gè)代理節(jié)點(diǎn),當(dāng)確定好代理節(jié)點(diǎn)之后,因?yàn)樗鲋虚g件為各代理節(jié)點(diǎn)設(shè)置有連接池,每個(gè)連接池中包括多個(gè)連接鏈路;因此利用所述連接池中所述代理節(jié)點(diǎn)的連接鏈路將所述讀寫請(qǐng)求發(fā)送給所述對(duì)應(yīng)的代理節(jié)點(diǎn),當(dāng)發(fā)生失敗時(shí),證明該條連接鏈路屬于故障的連接鏈路,因此將它轉(zhuǎn)移至不可用服務(wù)鏈表中,然后再?gòu)倪B接池中獲取其它的連接鏈路再次發(fā)送所述讀寫請(qǐng)求,這樣就可以在工作線程處理任務(wù)的同時(shí)也對(duì)連接鏈路的運(yùn)行狀態(tài)進(jìn)行偵測(cè),也保證了讀寫請(qǐng)求可以被正常的發(fā)送。
      [0049]如圖3所示,示例性地描述了偵測(cè)線程和正常工作線程的處理過(guò)程,步驟如下:
      [0050]步驟S201,中間件為每個(gè)代理節(jié)點(diǎn)建立對(duì)應(yīng)的連接池,連接池中包含若干個(gè)連接鏈路。
      [0051 ]步驟S202,中間件發(fā)起一個(gè)偵測(cè)線程,該線程首先從連接池中獲取每條連接鏈路,向每條連接鏈路發(fā)送心跳報(bào)文,若沒(méi)有響應(yīng),則把該條連接鏈路插入到不可用服務(wù)鏈表中;同時(shí)偵測(cè)線程監(jiān)測(cè)不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常,若是,則把不可用服務(wù)鏈表中該條恢復(fù)正常的連接鏈路從鏈表轉(zhuǎn)移至連接池中。
      [0052]步驟S203,中間件運(yùn)行工作線程處理來(lái)自應(yīng)用程序的讀寫請(qǐng)求時(shí),每條工作線程在處理每條連接鏈路的同時(shí),判斷該條連接鏈路是否發(fā)送請(qǐng)求成功,若不成功,則把該條連接鏈路轉(zhuǎn)移至不可用服務(wù)鏈表中。
      [0053]進(jìn)一步地,所述Redi s服務(wù)器包括Redi s主服務(wù)器和Redi s從服務(wù)器;該方法還包括:
      [0054]針對(duì)連接同一個(gè)Redis主服務(wù)器的各代理節(jié)點(diǎn),所述各代理節(jié)點(diǎn)向共同連接的主服務(wù)器發(fā)送心跳檢測(cè);
      [0055]若心跳檢測(cè)失敗,則從所述各代理節(jié)點(diǎn)中確定第一代理節(jié)點(diǎn)進(jìn)行主從服務(wù)器的切換,所述第一代理節(jié)點(diǎn)為所述各代理節(jié)點(diǎn)中的任意一個(gè);
      [0056]當(dāng)所述第一代理節(jié)點(diǎn)的Redis主服務(wù)器和Redis從服務(wù)器切換成功之后,所述第一代理節(jié)點(diǎn)將切換之后的Redis主服務(wù)器的IP地址通知至連接所述主服務(wù)器的其余的代理節(jié)點(diǎn),以使所述其余的代理節(jié)點(diǎn)完成主從切換。
      [0057]因?yàn)楣餐ぷ鞯拇砉?jié)點(diǎn)之間連接的主服務(wù)的IP地址是完全相同的,所以要進(jìn)行主從切換時(shí),可以先選擇一個(gè)代理節(jié)點(diǎn)進(jìn)行主從服務(wù)器的切換,然后再將切換之后的主服務(wù)器的IP地址通知給其它的代理節(jié)點(diǎn)。
      [0058]進(jìn)一步地,所述當(dāng)切換成功之后,包括:所述各代理節(jié)點(diǎn)更新各自的內(nèi)存參數(shù)和配置文件的配置信息,其中,所述內(nèi)存參數(shù)包含的主服務(wù)器和從服務(wù)器的屬性信息與所述配置文件的配置信息中主服務(wù)器和從服務(wù)器的屬性信息一致。其中,所述主服務(wù)器和從服務(wù)器的屬性信息包括:主服務(wù)器的IP地址、主服務(wù)器的端口信息、從服務(wù)器的IP地址、從服務(wù)器的端口信息。
      [0059]因?yàn)楝F(xiàn)有的代理節(jié)點(diǎn)對(duì)服務(wù)端的高可用一般采用Sentinel+腳本的方式,Sentinel需要單獨(dú)部署,即需要在代理節(jié)點(diǎn)之外單獨(dú)啟動(dòng)一個(gè)線程,在檢測(cè)到主服務(wù)器節(jié)點(diǎn)發(fā)生故障時(shí),采用事件的方式通知腳本,由腳本負(fù)責(zé)更新代理的配置文件并重啟該代理節(jié)點(diǎn)??梢娺@種主從切換方式,代理節(jié)點(diǎn)不得不進(jìn)行重啟的操作,為了解決這一問(wèn)題,本發(fā)明實(shí)施例通過(guò)在代理節(jié)點(diǎn)的內(nèi)部集成監(jiān)聽和腳本事件通知的功能,即不需要再代理節(jié)點(diǎn)之外再啟用一個(gè)線程,只是運(yùn)行代理節(jié)點(diǎn)的線程就可以完成腳本和監(jiān)聽的功能,具體地,如圖4所示,假設(shè)有兩個(gè)代理節(jié)點(diǎn)在同時(shí)工作,兩個(gè)代理節(jié)點(diǎn)均連接同一個(gè)主服務(wù)器,當(dāng)主服務(wù)器發(fā)生故障時(shí),通過(guò)上述方法進(jìn)行主從切換的具體過(guò)程如下:
      [0060]步驟S301,代理節(jié)點(diǎn)I和代理節(jié)點(diǎn)2均周期性地向該主服務(wù)器發(fā)送心跳報(bào)文
      [0061 ] 步驟S302,若代理節(jié)點(diǎn)I和代理節(jié)點(diǎn)2均多次沒(méi)有收到響應(yīng),則選擇代理節(jié)點(diǎn)2進(jìn)行優(yōu)先進(jìn)行主從切換。
      [0062]步驟S303,代理節(jié)點(diǎn)2進(jìn)行主從切換,將從服務(wù)器更新為主服務(wù)器。
      [0063]步驟S304,代理節(jié)點(diǎn)2將修改之后的主服務(wù)器的IP地址和端口號(hào)通知給代理節(jié)點(diǎn)I,代理節(jié)點(diǎn)I收到通知之后將該IP地址對(duì)應(yīng)的服務(wù)器更新為主服務(wù)器。
      [0064]步驟S305,代理節(jié)點(diǎn)2更新配置文件和該地阿里節(jié)點(diǎn)內(nèi)部的內(nèi)存參數(shù),即更新主服務(wù)器的IP地址和主服務(wù)器的端口信息。
      [0065]步驟S306,代理節(jié)點(diǎn)I也更新配置文件和該地阿里節(jié)點(diǎn)內(nèi)部的內(nèi)存參數(shù),即更新主服務(wù)器的IP地址和主服務(wù)器的端口信息。
      [0066]基于相同的技術(shù)構(gòu)思,本發(fā)明實(shí)施例還提供一種實(shí)現(xiàn)Redis集群高可用的系統(tǒng),該系統(tǒng)可執(zhí)行上述方法實(shí)施例。本發(fā)明實(shí)施例提供的系統(tǒng)如圖5所示,包括:連接池生成單元501、偵測(cè)單元502、判斷單元503、處理單元504,其中,所述中間件包括:
      [0067]連接池生成單元501,用于為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路;
      [0068]偵測(cè)單元502,用于通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路;
      [0069]判斷單元503,用于確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值;
      [0070]若是,處理單元504,用于將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信。
      [0071]進(jìn)一步地,所述偵測(cè)單元502還用于將被標(biāo)記的連接鏈路從所述連接池轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中;
      [0072]所述判斷單元503還用于:確定所述不可用服務(wù)鏈表中對(duì)應(yīng)同一代理節(jié)點(diǎn)的連接鏈路條數(shù)是否大于設(shè)定閾值。
      [0073]所述偵測(cè)單元502還用于:通過(guò)所述偵測(cè)線程偵測(cè)所述不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常;
      [0074]若是,所述處理單元504還用于:將恢復(fù)正常的連接鏈路從所述不可用服務(wù)鏈表轉(zhuǎn)移至所述恢復(fù)正常的連接鏈路對(duì)應(yīng)的連接池中;所述判斷單元503還用于判斷當(dāng)所述故障代理節(jié)點(diǎn)對(duì)應(yīng)的恢復(fù)正常的連接鏈路大于設(shè)定閾值時(shí),所述處理單元504恢復(fù)所述故障代理節(jié)點(diǎn)的通信。
      [0075]進(jìn)一步地,所述偵測(cè)單元502具體用于:運(yùn)行偵測(cè)線程,所述偵測(cè)線程執(zhí)行如下動(dòng)作:
      [0076]從所述連接池中輪詢獲取每條連接鏈路;
      [0077]針對(duì)獲取的每條連接鏈路,向每條連接鏈路發(fā)起心跳檢測(cè);
      [0078]若心跳檢測(cè)成功,則確定所述連接鏈路正常,否則將所述連接鏈路確定為發(fā)生故障的連接鏈路。
      [0079]進(jìn)一步地,對(duì)于所述中間件來(lái)說(shuō),還包括:讀寫處理單元505:用于接收應(yīng)用發(fā)送的讀寫請(qǐng)求;
      [0080]所述處理單元504還用于:根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn);利用所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn)的連接池中的連接鏈路將所述讀寫請(qǐng)求發(fā)送給對(duì)應(yīng)的代理節(jié)點(diǎn);若發(fā)送失敗,則將所述讀寫請(qǐng)求對(duì)應(yīng)的連接鏈路從所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn)的連接池中轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中。
      [0081]進(jìn)一步地,所述Redis服務(wù)器包括Redis主服務(wù)器和Redis從服務(wù)器;該系統(tǒng)還包括:
      [0082]針對(duì)連接同一個(gè)Redis主服務(wù)器的各代理節(jié)點(diǎn),所述代理節(jié)點(diǎn)向共同連接的主服務(wù)器發(fā)送心跳檢測(cè);
      [0083]若各代理節(jié)點(diǎn)心跳檢測(cè)失敗,則代理節(jié)點(diǎn)的主從切換單元506從所述各代理節(jié)點(diǎn)中確定第一代理節(jié)點(diǎn)進(jìn)行主從服務(wù)器的切換,所述第一代理節(jié)點(diǎn)為所述各代理節(jié)點(diǎn)中的任意一個(gè);
      [0084]當(dāng)所述第一代理節(jié)點(diǎn)的Redis主服務(wù)器和Redis從服務(wù)器切換成功之后,將切換之后的Redis主服務(wù)器的IP地址通知至連接所述主服務(wù)器的其余的代理節(jié)點(diǎn),以使所述其余的代理節(jié)點(diǎn)完成主從切換。
      [0085]進(jìn)一步地,還包括配置更新單元507,用于更新各代理節(jié)點(diǎn)的內(nèi)存參數(shù)和配置文件的配置信息,其中,所述內(nèi)存參數(shù)包含的主服務(wù)器和從服務(wù)器的屬性信息與所述配置文件的配置信息中主服務(wù)器和從服務(wù)器的屬性信息一致。
      [0086]其中,所述主服務(wù)器和從服務(wù)器的屬性信息包括:主服務(wù)器的IP地址、主服務(wù)器的端口信息、從服務(wù)器的IP地址、從服務(wù)器的端口信息。
      [0087]綜上所述,本發(fā)明實(shí)施例中間件建立與所述每個(gè)代理節(jié)點(diǎn)通信的連接池,其中,所述連接池中包含所述中間件與所述每個(gè)代理節(jié)點(diǎn)通信的各條連接鏈路,一方面,中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)所述連接池中的連接鏈路,并將發(fā)生故障的連接鏈路從所述連接池轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中,當(dāng)所述中間件確定所述不可用服務(wù)鏈表中對(duì)應(yīng)任意一個(gè)代理節(jié)點(diǎn)的連接鏈路條數(shù)大于設(shè)定閾值時(shí),將對(duì)應(yīng)的代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn)并隔離,以使所述中間件停止與所述故障代理節(jié)點(diǎn)的通信。也就是說(shuō),對(duì)于任意一個(gè)代理節(jié)點(diǎn)來(lái)說(shuō),若中間件主動(dòng)檢測(cè)到與該代理節(jié)點(diǎn)對(duì)應(yīng)連接的設(shè)定數(shù)量的連接鏈路均失效,則證明該代理節(jié)點(diǎn)發(fā)生故障,因此主動(dòng)將該代理節(jié)點(diǎn)定義為故障代理節(jié)點(diǎn),隔離掉與該故障代理節(jié)點(diǎn)的通信。從而實(shí)現(xiàn)了自動(dòng)隔離故障節(jié)點(diǎn)的功能,保證了中間件與代理節(jié)點(diǎn)之間的業(yè)務(wù)處理不受影響。同時(shí)中間件的偵測(cè)線程還檢測(cè)不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常,將恢復(fù)正常的連接鏈路轉(zhuǎn)移至連接池中。另外,代理節(jié)點(diǎn)內(nèi)部通過(guò)集成腳本和監(jiān)聽的功能,使得主從切換的過(guò)程更加便捷,不需要在切換之后再重啟代理節(jié)點(diǎn),提高了系統(tǒng)運(yùn)行的效率。
      [0088]本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
      [0089]這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
      [0090]這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
      [0091]盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
      [0092]顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。
      【主權(quán)項(xiàng)】
      1.一種實(shí)現(xiàn)RediS集群高可用的方法,其特征在于,所述集群包括中間件、至少兩個(gè)與所述中間件連接的代理節(jié)點(diǎn),與所述代理節(jié)點(diǎn)連接的Redis服務(wù)器,該方法包括: 所述中間件為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路; 所述中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路; 所述中間件確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值;若是,則所述中間件將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信。2.如權(quán)利要求1所述的方法,其特征在于,所述標(biāo)記發(fā)生故障的連接鏈路之后,還包括: 所述中間件將被標(biāo)記的連接鏈路從所述連接池轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中; 所述中間件確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值,包括: 所述中間件確定所述不可用服務(wù)鏈表中對(duì)應(yīng)同一代理節(jié)點(diǎn)的連接鏈路條數(shù)是否大于設(shè)定閾值。3.如權(quán)利要求2所述的方法,其特征在于,還包括: 所述中間件通過(guò)所述偵測(cè)線程偵測(cè)所述不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常;若是,則所述中間件將恢復(fù)正常的連接鏈路從所述不可用服務(wù)鏈表轉(zhuǎn)移至所述恢復(fù)正常的連接鏈路對(duì)應(yīng)的連接池中; 當(dāng)所述故障代理節(jié)點(diǎn)對(duì)應(yīng)的恢復(fù)正常的連接鏈路大于設(shè)定閾值時(shí),所述中間件恢復(fù)所述故障代理節(jié)點(diǎn)的通信。4.權(quán)利要求1所述的方法,其特征在于,所述中間件通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,包括: 所述中間件運(yùn)行偵測(cè)線程,所述偵測(cè)線程執(zhí)行如下動(dòng)作: 從所述連接池中輪詢獲取每條連接鏈路; 針對(duì)獲取的每條連接鏈路,向每條連接鏈路發(fā)起心跳檢測(cè); 若心跳檢測(cè)成功,則確定所述連接鏈路正常,否則將所述連接鏈路確定為發(fā)生故障的連接鏈路。5.如權(quán)利要求1所述的方法,其特征在于,還包括: 所述中間件接收應(yīng)用發(fā)送的讀寫請(qǐng)求; 所述中間件根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn); 利用所述代理節(jié)點(diǎn)的連接池中的連接鏈路將所述讀寫請(qǐng)求發(fā)送給所述對(duì)應(yīng)的代理節(jié)占.V , 若發(fā)送失敗,則所述中間件將所述讀寫請(qǐng)求對(duì)應(yīng)的連接鏈路從所述連接池中轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中。6.如權(quán)利要求1?4所述的方法,其特征在于,所述Redis服務(wù)器包括Redis主服務(wù)器和Redis從服務(wù)器; 該方法還包括: 針對(duì)連接同一個(gè)Redis主服務(wù)器的各代理節(jié)點(diǎn),所述各代理節(jié)點(diǎn)向共同連接的主服務(wù)器發(fā)送心跳檢測(cè); 若心跳檢測(cè)失敗,則從所述各代理節(jié)點(diǎn)中確定第一代理節(jié)點(diǎn)進(jìn)行主從服務(wù)器的切換,所述第一代理節(jié)點(diǎn)為所述各代理節(jié)點(diǎn)中的任意一個(gè); 當(dāng)所述第一代理節(jié)點(diǎn)的Redis主服務(wù)器和Redis從服務(wù)器切換成功之后,所述第一代理節(jié)點(diǎn)將切換之后的Redis主服務(wù)器的IP地址通知至連接所述主服務(wù)器的其余的代理節(jié)點(diǎn),以使所述其余的代理節(jié)點(diǎn)完成主從切換。7.如權(quán)利要求6所述的方法,其特征在于,所述當(dāng)切換成功之后,包括: 所述各代理節(jié)點(diǎn)更新各自的內(nèi)存參數(shù)和配置文件的配置信息,其中,所述內(nèi)存參數(shù)包含的主服務(wù)器和從服務(wù)器的屬性信息與所述配置文件的配置信息中主服務(wù)器和從服務(wù)器的屬性信息一致。8.如權(quán)利要求7所述的方法,其特征在于,所述主服務(wù)器和從服務(wù)器的屬性信息包括:主服務(wù)器的IP地址、主服務(wù)器的端口信息、從服務(wù)器的IP地址、從服務(wù)器的端口信息。9.一種實(shí)現(xiàn)Redis集群高可用的系統(tǒng),其特征在于,所述系統(tǒng)包括中間件、至少兩個(gè)與所述中間件連接的代理節(jié)點(diǎn),與所述代理節(jié)點(diǎn)連接的Redi s服務(wù)器,所述中間件包括: 連接池生成單元,用于為每個(gè)代理節(jié)點(diǎn)建立用于通信的連接池,其中,每個(gè)代理節(jié)點(diǎn)的連接池中配置了中間件與代理節(jié)點(diǎn)間的多條連接鏈路; 偵測(cè)單元,用于通過(guò)發(fā)起偵測(cè)線程偵測(cè)每個(gè)代理節(jié)點(diǎn)的連接池中的連接鏈路,并標(biāo)記發(fā)生故障的連接鏈路; 判斷單元,用于確定對(duì)應(yīng)同一代理節(jié)點(diǎn)的被標(biāo)記的連接鏈路的條數(shù)是否大于設(shè)定閾值; 若是,處理單元,用于將對(duì)應(yīng)的同一代理節(jié)點(diǎn)確定為故障代理節(jié)點(diǎn),并停止與所述故障代理節(jié)點(diǎn)的通信。10.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述偵測(cè)單元還用于將被標(biāo)記的連接鏈路從所述連接池轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中; 所述判斷單元還用于:確定所述不可用服務(wù)鏈表中對(duì)應(yīng)同一代理節(jié)點(diǎn)的連接鏈路條數(shù)是否大于設(shè)定閾值。11.如權(quán)利要求10所述的系統(tǒng),其特征在于,所述偵測(cè)單元還用于:通過(guò)所述偵測(cè)線程偵測(cè)所述不可用服務(wù)鏈表中的連接鏈路是否恢復(fù)正常; 若是,所述處理單元還用于:將恢復(fù)正常的連接鏈路從所述不可用服務(wù)鏈表轉(zhuǎn)移至所述恢復(fù)正常的連接鏈路對(duì)應(yīng)的連接池中; 所述判斷單元還用于判斷當(dāng)所述故障代理節(jié)點(diǎn)對(duì)應(yīng)的恢復(fù)正常的連接鏈路大于設(shè)定閾值時(shí),所述處理單元恢復(fù)所述故障代理節(jié)點(diǎn)的通信。12.權(quán)利要求9所述的系統(tǒng),其特征在于,所述偵測(cè)單元具體用于:運(yùn)行偵測(cè)線程,所述偵測(cè)線程執(zhí)行如下動(dòng)作: 從所述連接池中輪詢獲取每條連接鏈路; 針對(duì)獲取的每條連接鏈路,向每條連接鏈路發(fā)起心跳檢測(cè); 若心跳檢測(cè)成功,則確定所述連接鏈路正常,否則將所述連接鏈路確定為發(fā)生故障的連接鏈路。13.如權(quán)利要求9所述的系統(tǒng),其特征在于,還包括:讀寫請(qǐng)求處理單元:用于接收應(yīng)用發(fā)送的讀寫請(qǐng)求; 所述處理單元還用于:根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn);利用所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn)的連接池中的連接鏈路將所述讀寫請(qǐng)求發(fā)送給對(duì)應(yīng)的代理節(jié)點(diǎn);若發(fā)送失敗,則將所述讀寫請(qǐng)求對(duì)應(yīng)的連接鏈路從所述讀寫請(qǐng)求對(duì)應(yīng)的代理節(jié)點(diǎn)的連接池中轉(zhuǎn)移至預(yù)設(shè)的不可用服務(wù)鏈表中。14.如權(quán)利要求9?13所述的系統(tǒng),其特征在于,所述Redis服務(wù)器包括Redis主服務(wù)器和Redis從服務(wù)器; 針對(duì)連接同一個(gè)Redis主服務(wù)器的各代理節(jié)點(diǎn),各代理節(jié)點(diǎn)向共同連接的主服務(wù)器發(fā)送心跳檢測(cè); 所述代理節(jié)點(diǎn)還包括: 若各代理節(jié)點(diǎn)心跳檢測(cè)失敗,主從切換單元,用于從所述各代理節(jié)點(diǎn)中確定第一代理節(jié)點(diǎn)進(jìn)行主從服務(wù)器的切換,所述第一代理節(jié)點(diǎn)為所述各代理節(jié)點(diǎn)中的任意一個(gè);當(dāng)所述第一代理節(jié)點(diǎn)的Redis主服務(wù)器和Redis從服務(wù)器切換成功之后,將切換之后的Redis主服務(wù)器的IP地址通知至連接所述主服務(wù)器的其余的代理節(jié)點(diǎn),以使所述其余的代理節(jié)點(diǎn)完成主從切換。15.如權(quán)利要求14所述的系統(tǒng),其特征在于,還包括配置更新單元,用于更新各代理節(jié)點(diǎn)的內(nèi)存參數(shù)和配置文件的配置信息,其中,所述內(nèi)存參數(shù)包含的主服務(wù)器和從服務(wù)器的屬性信息與所述配置文件的配置信息中主服務(wù)器和從服務(wù)器的屬性信息一致。16.如權(quán)利要求15所述的系統(tǒng),其特征在于,所述主服務(wù)器和從服務(wù)器的屬性信息包括:主服務(wù)器的IP地址、主服務(wù)器的端口信息、從服務(wù)器的IP地址、從服務(wù)器的端口信息。
      【文檔編號(hào)】H04L29/08GK105933407SQ201610248471
      【公開日】2016年9月7日
      【申請(qǐng)日】2016年4月20日
      【發(fā)明人】李代立, 唐旭東, 陳卓
      【申請(qǐng)人】中國(guó)銀聯(lián)股份有限公司
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1