搭建高可用MongoDB集群(Replicaset)-創(chuàng)新互聯(lián)

MongoDB基礎(chǔ)可參考https://blog.51cto.com/kaliarch/2044423

運(yùn)城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

一、概述

1.1 MongoDB副本集

通俗來(lái)講,mongodb的副本集相當(dāng)于具有自動(dòng)故障恢復(fù)的主從集群,主從集群和副本集最明顯的特征為副本集沒(méi)有固定的“主節(jié)點(diǎn)”,整個(gè)集群會(huì)通過(guò)一定的算法選舉出主節(jié)點(diǎn),目前MongoDB官方已經(jīng)不建議使用主從模式了,在主從模式下,如果主數(shù)據(jù)庫(kù)宕機(jī),從數(shù)據(jù)庫(kù)無(wú)法自動(dòng)接管主數(shù)據(jù)庫(kù),從而無(wú)法接入數(shù)據(jù),取而代之的就是MongoDB副本集模式,主服務(wù)器負(fù)責(zé)整個(gè)副本集的讀寫(xiě),副本集定期同步數(shù)據(jù)備份,副本集中的副本節(jié)點(diǎn)在主節(jié)點(diǎn)掛掉后通過(guò)心跳機(jī)制檢測(cè)到后副本節(jié)點(diǎn)就會(huì)選舉一個(gè)新的主服務(wù)器,這一切對(duì)于應(yīng)用服務(wù)器無(wú)需關(guān)心。

1.2 架構(gòu)圖

搭建高可用MongoDB集群(Replica set)搭建高可用MongoDB集群(Replica set)

搭建高可用MongoDB集群(Replica set)1.3 復(fù)制原理

  • mongodb的復(fù)制至少需要兩個(gè)節(jié)點(diǎn)。其中一個(gè)是主節(jié)點(diǎn),負(fù)責(zé)處理客戶(hù)端請(qǐng)求,其余的都是從節(jié)點(diǎn),負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)。

  • mongodb各個(gè)節(jié)點(diǎn)常見(jiàn)的搭配方式為:一主一從、一主多從。

  • 主節(jié)點(diǎn)記錄在其上的所有操作oplog,從節(jié)點(diǎn)定期輪詢(xún)主節(jié)點(diǎn)獲取這些操作,然后對(duì)自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致。

搭建高可用MongoDB集群(Replica set)1.4 副本集特征:

  • N 個(gè)節(jié)點(diǎn)的集群

  • 任何節(jié)點(diǎn)可作為主節(jié)點(diǎn)

  • 所有寫(xiě)入操作都在主節(jié)點(diǎn)上

  • 自動(dòng)故障轉(zhuǎn)移

  • 自動(dòng)恢復(fù)

1.5 Bully算法

如果副本集中主節(jié)點(diǎn)宕掉后,需要使用bully算法進(jìn)行選舉主節(jié)點(diǎn),其主要思想為每個(gè)成員均可以聲明自己為主節(jié)點(diǎn)并通知其他節(jié)點(diǎn),別的節(jié)點(diǎn)可以選擇接受這個(gè)聲明或是拒絕并進(jìn)入主節(jié)點(diǎn)競(jìng)爭(zhēng),只有被其他節(jié)點(diǎn)接受的節(jié)點(diǎn)才可以當(dāng)主節(jié)點(diǎn),

節(jié)點(diǎn)按照一些屬性來(lái)判斷誰(shuí)應(yīng)該勝出。這個(gè)屬性可以是一個(gè)靜態(tài)ID,也可以是更新的度量像最近一次事務(wù)ID(最新的節(jié)點(diǎn)會(huì)勝出)

官方描述:

  1. 得到每個(gè)服務(wù)器節(jié)點(diǎn)的最后操作時(shí)間戳。每個(gè)mongodb都有oplog機(jī)制會(huì)記錄本機(jī)的操作,方便和主服務(wù)器進(jìn)行對(duì)比數(shù)據(jù)是否同步還可以用于錯(cuò)誤恢復(fù)。

  2. 如果集群中大部分服務(wù)器down機(jī)了,保留活著的節(jié)點(diǎn)都為 secondary狀態(tài)并停止,不選舉了。

  3. 如果集群中選舉出來(lái)的主節(jié)點(diǎn)或者所有從節(jié)點(diǎn)最后一次同步時(shí)間看起來(lái)很舊了,停止選舉等待人來(lái)操作。

  4. 如果上面都沒(méi)有問(wèn)題就選擇最后操作時(shí)間戳最新(保證數(shù)據(jù)是最新的)的服務(wù)器節(jié)點(diǎn)作為主節(jié)點(diǎn)。

1.6 Replica Set成員

一個(gè)Replica Set中的成員角色有三種:Primary,Secondary和Arbiter。

  • Primary:接收來(lái)自客戶(hù)端的所有的寫(xiě)操作,一個(gè)Replica Set中有且只有一個(gè)Primary。Primary如果宕掉,Replica Set會(huì)自動(dòng)選舉一個(gè)Secondary成為Primary。Primary將它data sets的所有操作都記錄到oplog中。

  • Secondary:Secondary從Primary復(fù)制oplog,然后將oplog中的操作應(yīng)用到自己的data sets。Secondary和Primary之間是異步復(fù)制,也就是Secondary中的數(shù)據(jù)可能不是最新的。默認(rèn)情況下,Secondary不可讀不可寫(xiě),但是可以通過(guò)設(shè)置運(yùn)行客戶(hù)端從Secondary讀。

        Secondary配置的三種用途:

        1.在選舉中阻止其成為Primary,只用作備份數(shù)據(jù)。通過(guò)設(shè)置優(yōu)先級(jí)priority為0來(lái)實(shí)現(xiàn)

        2.阻止應(yīng)用程序從它讀,通過(guò)設(shè)置優(yōu)先級(jí)priority為0和設(shè)置hidden為true來(lái)實(shí)現(xiàn)。(一個(gè)隱藏的成員同樣復(fù)制Primary的數(shù)據(jù),但是對(duì)于客戶(hù)端應(yīng)用程序來(lái)講,它不可見(jiàn)。)

        3.保留歷史鏡像數(shù)據(jù)用于數(shù)據(jù)回檔,比如如果誤刪除數(shù)據(jù),可以使用Delayed Replica Set成員中的數(shù)據(jù)恢復(fù)。

  • Arbiter:Arbiter不需要維護(hù)自己的data sets,只是當(dāng)Primary掛掉之后參與投票選擇哪個(gè)Secondary可以升級(jí)為Primary

Replica Set中的成員個(gè)數(shù)為偶數(shù)個(gè)時(shí),就需要添加一個(gè)Arbiter用于投票選舉哪個(gè)可以升級(jí)為Primary,不能在Primary或者Secondary主機(jī)上運(yùn)行Arbiter

一個(gè)Replica Set可以最多擁有12個(gè)成員,但是只有7個(gè)成員可以同時(shí)參與投票選舉成為Primary,如果成員數(shù)量超過(guò)12,就需要使用Master-Slave主從復(fù)制方式。

部署一個(gè)Replica Set至少需要三個(gè)成員,一個(gè)Arbiter,一個(gè)Secondary和一個(gè)Primary或者一個(gè)Primary,兩個(gè)Secondary。

二、搭建部署

2.1 基礎(chǔ)環(huán)境

主機(jī)名
IP地址
系統(tǒng)
mongodb-1
172.20.6.10CentOS release 6.9
mongodb-2172.20.6.11CentOS release 6.9
mongodb-3172.20.6.10CentOS release 6.9

2.2 軟件安裝

在三臺(tái)服務(wù)器上依次安裝mongodb

wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgz tar -zxvf mongodb-linux-x86_64-rhel62-3.4.10.tgz ln -sv mongodb-linux-x86_64-rhel62-3.4.10 mongodb mkdir /usr/local/mongodb/{conf,mongoData,mongoLog} touch /usr/local/mongodb/mongoLog/mongodb.log echo "export PATH=$PAHT:/usr/local/mongodb/bin">/etc/profile.d/mongodb.sh source etc/profile.d/mongodb.sh

定義配置文件

cat >/usr/local/mongodb/conf/mongodb.conf<<EOF dbpath=/usr/local/mongodb/mongoData logpath=/usr/local/mongodb/mongoLog/mongodb.log logappend=true  journal=true quiet=true port=27017 replSet=RS                            #副本集名稱(chēng) maxConns=20000 httpinterface=true fork=true EOF

依次啟動(dòng)三個(gè)mongodb

mongodb -f /usr/local/mongodb/conf/mongodb.conf

搭建高可用MongoDB集群(Replica set)

2.3 副本集部署

挑選任意一臺(tái)mongodb進(jìn)行登錄

use admin                #切換到admin數(shù)據(jù)庫(kù) config = {_id:"RS",members:[                #定義副本集配置 {_id:0,host:"172.20.6.10:27017"}, {_id:1,host:"172.20.6.11:27017"}, {_id:2,host:"172.20.6.12:27017"},] } rs.initiate(config);        #初始化副本集配置

搭建高可用MongoDB集群(Replica set)

RS:PRIMARY> rs.status();                #查看副本集狀態(tài) {     "set" : "RS",     "date" : ISODate("2017-11-26T14:09:00.054Z"),     "myState" : 1,     "term" : NumberLong(1),     "heartbeatIntervalMillis" : NumberLong(2000),     "optimes" : {         "lastCommittedOpTime" : {             "ts" : Timestamp(1511705333, 1),             "t" : NumberLong(1)         },         "appliedOpTime" : {             "ts" : Timestamp(1511705333, 1),             "t" : NumberLong(1)         },         "durableOpTime" : {             "ts" : Timestamp(1511705333, 1),             "t" : NumberLong(1)         }     },     "members" : [         {             "_id" : 0,             "name" : "172.20.6.10:27017",             "health" : 1,             "state" : 1,             "stateStr" : "PRIMARY",                        #主節(jié)點(diǎn)             "uptime" : 377,             "optime" : {                 "ts" : Timestamp(1511705333, 1),                 "t" : NumberLong(1)             },             "optimeDate" : ISODate("2017-11-26T14:08:53Z"),             "infoMessage" : "could not find member to sync from",             "electionTime" : Timestamp(1511705241, 1),             "electionDate" : ISODate("2017-11-26T14:07:21Z"),             "configVersion" : 1,             "self" : true         },         {             "_id" : 1,             "name" : "172.20.6.11:27017",             "health" : 1,             "state" : 2,             "stateStr" : "SECONDARY",                #secondary節(jié)點(diǎn)             "uptime" : 109,             "optime" : {                 "ts" : Timestamp(1511705333, 1),                 "t" : NumberLong(1)             },             "optimeDurable" : {                 "ts" : Timestamp(1511705333, 1),                 "t" : NumberLong(1)             },             "optimeDate" : ISODate("2017-11-26T14:08:53Z"),             "optimeDurableDate" : ISODate("2017-11-26T14:08:53Z"),             "lastHeartbeat" : ISODate("2017-11-26T14:09:00.053Z"),             "lastHeartbeatRecv" : ISODate("2017-11-26T14:08:59.072Z"),             "pingMs" : NumberLong(0),             "syncingTo" : "172.20.6.10:27017",             "configVersion" : 1         },         {             "_id" : 2,             "name" : "172.20.6.12:27017",                             "health" : 1,             "state" : 2,             "stateStr" : "SECONDARY",                    #secondary節(jié)點(diǎn)             "uptime" : 109,             "optime" : {                 "ts" : Timestamp(1511705333, 1),                 "t" : NumberLong(1)             },             "optimeDurable" : {                 "ts" : Timestamp(1511705333, 1),                 "t" : NumberLong(1)             },             "optimeDate" : ISODate("2017-11-26T14:08:53Z"),             "optimeDurableDate" : ISODate("2017-11-26T14:08:53Z"),             "lastHeartbeat" : ISODate("2017-11-26T14:09:00.053Z"),             "lastHeartbeatRecv" : ISODate("2017-11-26T14:08:59.054Z"),             "pingMs" : NumberLong(0),             "syncingTo" : "172.20.6.10:27017",             "configVersion" : 1         }     ],     "ok" : 1 }

此時(shí)replica set集群已結(jié)搭建成功

三、副本集測(cè)試

3.1 數(shù)據(jù)復(fù)制測(cè)試

在主節(jié)點(diǎn)創(chuàng)建數(shù)據(jù)庫(kù),并創(chuàng)建集合,插入文檔,在secondary查看文檔

搭建高可用MongoDB集群(Replica set)

此時(shí)已經(jīng)完成在主節(jié)點(diǎn)創(chuàng)建數(shù)據(jù),接下來(lái)在secondary查看數(shù)據(jù)是否已經(jīng)同步過(guò)去。

mongodb默認(rèn)是從主節(jié)點(diǎn)讀寫(xiě)數(shù)據(jù)的,副本節(jié)點(diǎn)上不允許讀,需要設(shè)置副本節(jié)點(diǎn)可以讀。

db.getMongo().setSlaveOk();            #設(shè)置副本節(jié)點(diǎn)可讀

搭建高可用MongoDB集群(Replica set)

此時(shí)我們可以測(cè)試得到數(shù)據(jù),數(shù)據(jù)已經(jīng)同步到secondary上,但是無(wú)法在secondary上進(jìn)行數(shù)據(jù)的增刪改操作。

3.2 故障轉(zhuǎn)移測(cè)試

目前mongodb-1為主節(jié)點(diǎn),mongdb-2、mongodb-3為副本集節(jié)點(diǎn),此時(shí)停掉主節(jié)點(diǎn)的mongod服務(wù),進(jìn)行故障轉(zhuǎn)移測(cè)試。

搭建高可用MongoDB集群(Replica set)

宕掉主節(jié)點(diǎn)mongodb-1的服務(wù)后,我們登錄mongodb-2,查看副本集狀態(tài):

RS:PRIMARY> rs.status() {     "set" : "RS",     "date" : ISODate("2017-11-26T14:35:03.422Z"),     "myState" : 1,     "term" : NumberLong(2),     "heartbeatIntervalMillis" : NumberLong(2000),     "optimes" : {         "lastCommittedOpTime" : {             "ts" : Timestamp(1511706901, 1),             "t" : NumberLong(2)         },         "appliedOpTime" : {             "ts" : Timestamp(1511706901, 1),             "t" : NumberLong(2)         },         "durableOpTime" : {             "ts" : Timestamp(1511706901, 1),             "t" : NumberLong(2)         }     },     "members" : [         {             "_id" : 0,             "name" : "172.20.6.10:27017",             "health" : 0,             "state" : 8,             "stateStr" : "(not reachable/healthy)",                #mongodb-1已經(jīng)失去連接             "uptime" : 0,             "optime" : {                 "ts" : Timestamp(0, 0),                 "t" : NumberLong(-1)             },             "optimeDurable" : {                 "ts" : Timestamp(0, 0),                 "t" : NumberLong(-1)             },             "optimeDate" : ISODate("1970-01-01T00:00:00Z"),             "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),             "lastHeartbeat" : ISODate("2017-11-26T14:35:02.502Z"),             "lastHeartbeatRecv" : ISODate("2017-11-26T14:32:20.434Z"),             "pingMs" : NumberLong(0),             "lastHeartbeatMessage" : "Connection refused",             "configVersion" : -1         },         {             "_id" : 1,             "name" : "172.20.6.11:27017",             "health" : 1,             "state" : 1,             "stateStr" : "PRIMARY",                        #mongodb-2為新的主節(jié)點(diǎn)             "uptime" : 1842,             "optime" : {                 "ts" : Timestamp(1511706901, 1),                 "t" : NumberLong(2)             },             "optimeDate" : ISODate("2017-11-26T14:35:01Z"),             "electionTime" : Timestamp(1511706750, 1),             "electionDate" : ISODate("2017-11-26T14:32:30Z"),             "configVersion" : 1,             "self" : true         },         {             "_id" : 2,             "name" : "172.20.6.12:27017",             "health" : 1,             "state" : 2,             "stateStr" : "SECONDARY",                    #mongodb-3為secondary節(jié)點(diǎn)             "uptime" : 1671,             "optime" : {                 "ts" : Timestamp(1511706901, 1),                 "t" : NumberLong(2)             },             "optimeDurable" : {                 "ts" : Timestamp(1511706901, 1),                 "t" : NumberLong(2)             },             "optimeDate" : ISODate("2017-11-26T14:35:01Z"),             "optimeDurableDate" : ISODate("2017-11-26T14:35:01Z"),             "lastHeartbeat" : ISODate("2017-11-26T14:35:02.354Z"),             "lastHeartbeatRecv" : ISODate("2017-11-26T14:35:02.730Z"),             "pingMs" : NumberLong(0),             "syncingTo" : "172.20.6.11:27017",             "configVersion" : 1         }     ],     "ok" : 1 }

查看mongodb-2的日志,發(fā)現(xiàn)mongodb-1心跳檢查已經(jīng)失去連接,重新進(jìn)行了主節(jié)點(diǎn)選舉

搭建高可用MongoDB集群(Replica set)

此時(shí)在新節(jié)點(diǎn)mongodb-2進(jìn)行文檔插入操作

搭建高可用MongoDB集群(Replica set)

此時(shí)上線mongodb-1,查看集群狀態(tài)與數(shù)據(jù)是否正常同步到mongodb-1上。

啟動(dòng)mongodb-1的服務(wù),查看集群狀態(tài),此時(shí)mongodb-1已結(jié)成為新的secondary節(jié)點(diǎn)。

RS:PRIMARY> rs.status() {     "set" : "RS",     "date" : ISODate("2017-11-27T02:13:41.683Z"),     "myState" : 1,     "term" : NumberLong(2),     "heartbeatIntervalMillis" : NumberLong(2000),     "optimes" : {         "lastCommittedOpTime" : {             "ts" : Timestamp(1511748812, 1),             "t" : NumberLong(2)         },         "appliedOpTime" : {             "ts" : Timestamp(1511748812, 1),             "t" : NumberLong(2)         },         "durableOpTime" : {             "ts" : Timestamp(1511748812, 1),             "t" : NumberLong(2)         }     },     "members" : [         {             "_id" : 0,             "name" : "172.20.6.10:27017",             "health" : 1,             "state" : 2,             "stateStr" : "SECONDARY",                        #mongodb-1為secondary節(jié)點(diǎn)             "uptime" : 1945,             "optime" : {                 "ts" : Timestamp(1511748812, 1),                 "t" : NumberLong(2)             },             "optimeDurable" : {                 "ts" : Timestamp(1511748812, 1),                 "t" : NumberLong(2)             },             "optimeDate" : ISODate("2017-11-27T02:13:32Z"),             "optimeDurableDate" : ISODate("2017-11-27T02:13:32Z"),             "lastHeartbeat" : ISODate("2017-11-27T02:13:41.373Z"),             "lastHeartbeatRecv" : ISODate("2017-11-27T02:13:40.854Z"),             "pingMs" : NumberLong(0),             "syncingTo" : "172.20.6.12:27017",             "configVersion" : 1         },         {             "_id" : 1,             "name" : "172.20.6.11:27017",             "health" : 1,             "state" : 1,             "stateStr" : "PRIMARY",                        #mongodb-2為主節(jié)點(diǎn)             "uptime" : 43760,             "optime" : {                 "ts" : Timestamp(1511748812, 1),                 "t" : NumberLong(2)             },             "optimeDate" : ISODate("2017-11-27T02:13:32Z"),             "electionTime" : Timestamp(1511706750, 1),             "electionDate" : ISODate("2017-11-26T14:32:30Z"),             "configVersion" : 1,             "self" : true         },         {             "_id" : 2,             "name" : "172.20.6.12:27017",                    #mongodb-3為secondary節(jié)點(diǎn)             "health" : 1,             "state" : 2,             "stateStr" : "SECONDARY",             "uptime" : 43589,             "optime" : {                 "ts" : Timestamp(1511748812, 1),                 "t" : NumberLong(2)             },             "optimeDurable" : {                 "ts" : Timestamp(1511748812, 1),                 "t" : NumberLong(2)             },             "optimeDate" : ISODate("2017-11-27T02:13:32Z"),             "optimeDurableDate" : ISODate("2017-11-27T02:13:32Z"),             "lastHeartbeat" : ISODate("2017-11-27T02:13:41.220Z"),             "lastHeartbeatRecv" : ISODate("2017-11-27T02:13:41.209Z"),             "pingMs" : NumberLong(0),             "syncingTo" : "172.20.6.11:27017",             "configVersion" : 1         }     ],     "ok" : 1 }

查看mongodb-1數(shù)據(jù)已經(jīng)正常同步。

搭建高可用MongoDB集群(Replica set)

四、其他

如果考慮到主服務(wù)器的復(fù)制壓力過(guò)大,可以制作仲裁節(jié)點(diǎn),其中的仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只是負(fù)責(zé)故障轉(zhuǎn)移的群體投票,這樣就少了數(shù)據(jù)復(fù)制的壓力。

刪除節(jié)點(diǎn):

rs.remove("172.20.6.12:27017")            #刪除節(jié)點(diǎn)

添加節(jié)點(diǎn)

rs.add("172.20.6.12:27017")                #添加節(jié)點(diǎn) rs.addArb("172.20.6.12:27017")               #添加arbiter節(jié)點(diǎn)        {             "_id" : 2,             "name" : "172.20.6.12:27017",             "health" : 1,             "state" : 7,             "stateStr" : "ARBITER",                #arbiter節(jié)點(diǎn)             "uptime" : 4,             "lastHeartbeat" : ISODate("2017-11-27T02:35:01.634Z"),             "lastHeartbeatRecv" : ISODate("2017-11-27T02:35:00.637Z"),             "pingMs" : NumberLong(0),             "syncingTo" : "172.20.6.11:27017",             "configVersion" : 9         }

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞標(biāo)題:搭建高可用MongoDB集群(Replicaset)-創(chuàng)新互聯(lián)
分享鏈接:http://muchs.cn/article10/deehdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣、定制開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司