欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Hadoop之HDFS的HA與QJM-創(chuàng)新互聯(lián)

本文主要介紹HDFS HA特性,以及如何使用QJM(Quorum Journal Manager)特性實(shí)現(xiàn)HDFS HA。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到淥口網(wǎng)站設(shè)計(jì)與淥口網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋淥口地區(qū)。

    一、背景

    HDFS集群中只有一個(gè)Namenode,這就會(huì)引入單點(diǎn)問(wèn)題;即如果Namenode故障,那么這個(gè)集群將不可用,直到Namenode重啟或者其他Namenode接入。

    有兩種方式會(huì)影響集群的整體可用性:

    1、意外的突發(fā)事件,比如物理機(jī)器crash,集群將不可用,直到管理員重啟Namenode。

    2、系統(tǒng)維護(hù),比如軟件升級(jí)等,需要關(guān)閉Namenode,也會(huì)導(dǎo)致集群暫時(shí)性的失效。

    HDFS HA特性即解決這個(gè)問(wèn)題,它通過(guò)在集群中同時(shí)運(yùn)行2個(gè)(redundant)Namenodes,并讓active和passive之間熱備(hot standby)。當(dāng)Active Namenode故障失效后,即可快速故障轉(zhuǎn)移到新的Namenode上(passive Namenode);也可以在計(jì)劃維護(hù)期間,基于管理員發(fā)起(administrator-inited)的友好的failover。

    二、Architecture

    在典型的HA架構(gòu)中,有兩個(gè)獨(dú)立的機(jī)器作為Namenode,任何時(shí)刻,只有一個(gè)Namenode處于Active狀態(tài),另一個(gè)處于standby狀態(tài)(passive,備份);Active Namenode用于接收Client端請(qǐng)求,Standy節(jié)點(diǎn)作為slave保持集群的狀態(tài)數(shù)據(jù)以備快速failover。

    為了讓Standby Node與Active Node保持同步,這兩個(gè)Node都與一組稱(chēng)為JNS的互相獨(dú)立的進(jìn)程保持通信(Journal Nodes)。當(dāng)Active Node上更新了namespace,它將記錄修改日志發(fā)送給JNS的多數(shù)派。            Standby noes將會(huì)從JNS中讀取這些edits,并持續(xù)關(guān)注它們對(duì)日志的變更。Standby Node將日志變更應(yīng)用在自己的namespace中,當(dāng)failover發(fā)生時(shí),Standby將會(huì)在提升自己為Active之前,確保能夠從JNS中讀取所有的edits;即在failover發(fā)生之前,Standy持有的namespace應(yīng)該與Active保持完全同步。

為了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。為了達(dá)到這一目的,Datanodes上需要同時(shí)配置這兩個(gè)Namenode的地址,同時(shí)和它們都建立心跳鏈接,并把block位置發(fā)送給它們。

    任何時(shí)刻,只有一個(gè)Active Namenode是非常重要的,否則將會(huì)導(dǎo)致集群操作的混亂,那么兩個(gè)Namenode將會(huì)分別有兩種不同的數(shù)據(jù)狀態(tài),可能會(huì)導(dǎo)致數(shù)據(jù)丟失,或者狀態(tài)異常,這種情況通常稱(chēng)為“split-brain”(腦裂,三節(jié)點(diǎn)通訊阻斷,即集群中不同的Datanodes卻看到了兩個(gè)Active Namenodes)。對(duì)于JNS(Journal Nodes)而言,任何時(shí)候只允許一個(gè)Namenode作為writer;在failover期間,原來(lái)的Standby Node將會(huì)接管Active的所有職能,并負(fù)責(zé)向JNS寫(xiě)入日志記錄,這就阻止了其他Namenode基于處于Active狀態(tài)的問(wèn)題。

    三、硬件資源

    為了構(gòu)建HA集群架構(gòu),你需要準(zhǔn)備如下資源:

    1、Namenode機(jī)器:兩臺(tái)配置對(duì)等的物理機(jī)器,它們分別運(yùn)行Active和Standby Node。

    2、JouralNode機(jī)器:運(yùn)行JouralNodes的機(jī)器。JouralNode守護(hù)進(jìn)程相當(dāng)?shù)妮p量級(jí),它們可以和hadoop的其他進(jìn)程部署在一起,比如Namenodes、jobTracker、ResourceManager等。不過(guò)為了形成多數(shù)派(majority),至少需要3個(gè)JouralNodes,因?yàn)閑dits操作必須在多數(shù)派上寫(xiě)入成功。當(dāng)然JNS的個(gè)數(shù)可以 > 3,且通常為奇數(shù)(3,5,7),這樣可以更好的容錯(cuò)和形成多數(shù)派。如果你運(yùn)行了N個(gè)JNS,那么它可以允許(N-1)/2個(gè)JNS進(jìn)程失效并且不影響工作。

    此外,在HA集群中,standby namenode還會(huì)對(duì)namespace進(jìn)行checkpoint操作(繼承Backup Namenode的特性),因此,就不需要在HA集群中運(yùn)行SecondaryNamenode、CheckpointNode或者BackupNode。事實(shí)上,HA架構(gòu)中運(yùn)行上述節(jié)點(diǎn),將會(huì)出錯(cuò)(不允許)。

    四、部署

    一)  、配置

    和HDFS Federation類(lèi)似,HA配置向后兼容,運(yùn)行只有一個(gè)Namenode運(yùn)行而無(wú)需做任何修改。新的配置中,要求集群中所有的Nodes都有相同的配置文件,而不是根據(jù)不同的Node設(shè)定不同的配置文件。

和HDFS Federation一樣,HA集群重用了“nameservice ID”來(lái)標(biāo)識(shí)一個(gè)HDFS 實(shí)例(事實(shí)上它可能包含多個(gè)HA Namenods);此外,“NameNode ID”概念被添加到HA中,集群中每個(gè)Namenode都有一個(gè)不同的ID;為了能夠讓一個(gè)配置文件支持所有的Namenodes(適用與Federation環(huán)境),那么相關(guān)的配置參數(shù)都以“nameservice ID”或“Namenode ID”作為后綴。

    修改hdfs-site.xml,增加如下幾個(gè)配置參數(shù),其參數(shù)的順序無(wú)關(guān)。

    1、dfs.nameservices:nameservice的邏輯名稱(chēng)。可以為任意可讀字符串;如果在Federation中使用,那么還應(yīng)該包含其他的nameservices,以","分割。

<property>
 <name>dfs.nameservices</name>
 <value>hadoop-ha,hadoop-federation</value>
</property>

    2、dfs.ha.namenodes.  [nameservice ID] :

<property>
 <name>dfs.ha.namenodes.hadoop-ha</name>
 <value>nn1,nn2</value>
</property>

    其中“hadoop-ha”需要和1)中配置的nameservice ID匹配,此處我們定義“hadoop-ha”下有2個(gè)namenode ID。

    3、dfs.namenode.rpc-address.  [nameservice ID] .  [namenode ID]

<property>
 <name>dfs.namenode.rpc-address.hadoop-ha.nn1</name>
 <value>machine1.example.com:8020</value></property><property>
 <name>dfs.namenode.rpc-address.hadoop-ha.nn2</name>
 <value>machine2.example.com:8020</value>
</property>

    其中nameservice ID需要和1)匹配,namenode ID需要和2) 匹配。配置項(xiàng)的值為相應(yīng)namenode的hostname以及通訊端口號(hào)(Client與namenode RPC通訊端口),它和non-ha模式下“dfs.namenode.rpc-address”作用一樣。每個(gè)namenode ID都需要單獨(dú)配置。

    你可以根據(jù)需要,配置“dfs.namenode.servicerpc-address”,格式和上述一致。(SNN,backup節(jié)點(diǎn)與Namenode通訊地址)

    4、dfs.namenode.http-address.[nameservice ID].[namenode ID]

<property>
 <name>dfs.namenode.http-address.hadoop-ha.nn1</name>
 <value>machine1.example.com:50070</value></property><property>
 <name>dfs.namenode.http-address.hadoop-ha.nn2</name>
 <value>machine2.example.com:50070</value>
</property>

    各個(gè)namenode的HTTP地址。它和non-ha下的"dfs.namenode.http-address"配置作用一樣。

    5、dfs.namenode.shared.edits.dir:

<property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/hadoop-ha</value>
</property>

    配置JNS組的url地址,Namenodes將會(huì)從JNS組中讀寫(xiě)edits。這是一個(gè)共享存儲(chǔ)區(qū),Active Namenode寫(xiě)入,Standby Node讀取,每個(gè)Namenodeservice必須配置足夠多的JNS地址(>=3,多數(shù)派),每條的格式為:“qjournal://host1:port1;host2:port2;host3:port3/journalId”

    其中journalId需要和上述配置中的“nameserviceID”匹配。

<property>
 <name>dfs.journalnode.rpc-address</name>
 <value>0.0.0.0:8485</value></property><property>
 <name>dfs.journalnode.http-address</name>
 <value>0.0.0.0:8480</value>
</property>

    此外,我們還需要在相應(yīng)的JournalNodes上增加上述配置。

    6、dfs.client.failover.proxy.provider.  [nameservice ID] :

<property>
 <name>dfs.client.failover.proxy.provider.hadoop-ha</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property>

    7、dfs.ha.fencing.methods:在failover期間用來(lái)隔離Active Namenode的腳本或者java 類(lèi)列表。

    雖然JNS可以確保集群中只有一個(gè)Active Node寫(xiě)入edits,這對(duì)保護(hù)edits一致性很重要,但是在failover期間,有可能Acitive Node仍然存活,Client可能還與其保持連接提供舊的數(shù)據(jù)服務(wù),我們可以通過(guò)此配置,指定shell腳本或者java程序,SSH到Active NameNode然后Kill Namenode進(jìn)程。它有兩種可選值(具體參見(jiàn)官方文檔):

    1) sshfence:SSH登錄到Active Namenode,并Kill此進(jìn)程。首先當(dāng)前機(jī)器能夠使用SSH登錄到遠(yuǎn)端,前提是已經(jīng)授權(quán)(rsa)。

    2) shell:運(yùn)行shell指令隔離Active Namenode。

<property>
 <name>dfs.ha.fencing.methods</name>
 <value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>

“()”之間為shell腳本的路徑,以及參數(shù)列表。

    8、fs.defaultFS(core-site.xml):

    在non-ha下,這個(gè)參數(shù)值為namenode的地址:“hdfs://namenode:8020”;不過(guò)在HA架構(gòu)下,將使用namenservice名稱(chēng)替代

<property>
 <name>fs.defaultFS</name>
 <value>hdfs://hadoop-ha</value>
</property>

    9、dfs.journalnode.edits.dir:

    指定journalNode存儲(chǔ)edits文件的本地路徑。

    最終,上述配置信息,需要在server和Client端同時(shí)配置才能有效的適應(yīng)HA與failover特性。

  二)、部署

    上述配置調(diào)整完畢后,我們就可以啟動(dòng)journalNodes守護(hù)進(jìn)程,默認(rèn)的"sbin/start-dfs.sh"腳本會(huì)根據(jù)"dfs.namenode.shared.edits.dir"配置,在相應(yīng)的Datanode上啟動(dòng)journalNodes。當(dāng)然我們可以使用::"bin/hdfs start journalnode"分別在相應(yīng)的機(jī)器上啟動(dòng)。

    一旦JournalNodes啟動(dòng)成功,它們將會(huì)從Namenode上同步metadata。

    1、如果你的HDFS集群是新建的,那么需要在每個(gè)Namenode上執(zhí)行"hdfs namenode -format"指令。

    2、如果你的namenodes已經(jīng)format了,或者是將non-ha轉(zhuǎn)換成ha架構(gòu),你應(yīng)該在將其中一個(gè)namenode上的metadata復(fù)制到另一臺(tái)上(dfs.namenode.name.dir目錄下的數(shù)據(jù)),然后在那個(gè)沒(méi)有format的新加入的namenode上執(zhí)行"hdfs namenode -bootstrapStandby"。運(yùn)行這個(gè)指令需要確保JournalNodes中持有足夠多的edits。

    3、如果你將一個(gè)non-ha的Namenode(比如backup,其已經(jīng)formated)切換成HA,你需要首先運(yùn)行"hdfs -initializeSharedEdits",這個(gè)指令將本地Namenode中的edits初始化Journalnodes。

此后,你就可以啟動(dòng)HA Namenodes。可以通過(guò)配置指定的HTTP地址(dfs.namenode.https-address)來(lái)查看各個(gè)Namenode的狀態(tài),Active or Standby。

    三)、管理員指令

    HA集群?jiǎn)?dòng)后,我們可以通過(guò)一些指令來(lái)管理HDFS集群。“bin/hdfs haadmin -DFSHAAdmin”指令,其可選參數(shù):

    1、-transitionToActive <namenode id>與-transitionToStandbyl <namenode id>:將指定的namenode ID切換為Active或者standby。這個(gè)指令并不會(huì)觸發(fā)“fencing method”,所以不常用,我們通常使用"hdfs haadmin -failover"來(lái)切換Namenode狀態(tài)。

    2、-failover [--forcefence] [--foreactive] <serviceId-fist> <serviceId-second>:在兩個(gè)Namenode之間failover。這個(gè)指令會(huì)觸發(fā)將first節(jié)點(diǎn)failover到second節(jié)點(diǎn)。如果first處于standby,那么只是簡(jiǎn)單的將second提升為Active。如果first為Active,那么將會(huì)友好的將其切換為standby,如果失敗,那么fencing methods將會(huì)觸發(fā)直到成功,此后second將會(huì)提升為Active。如果fencing method失敗,那么second將不會(huì)被提升為Active。

    例如:"hdfs haadmin -DFSHAAdmin -failover nn1 nn2"

    3、-getServiceState <serviceId>:獲取serviceId的狀態(tài),Active還是Standby。鏈接到指定的namenode上,并獲取其當(dāng)前的狀態(tài),打印出“standby”或者“active”。我可以在crontab中使用此命令,用來(lái)監(jiān)測(cè)各個(gè)Namenode的狀況。

    4、-checkHealth <serviceId>:檢測(cè)指定的namenode的健康狀況。

    四)、自動(dòng)Failover

    上述介紹了如何配置手動(dòng)failover,在這種模式下,系統(tǒng)不會(huì)自動(dòng)觸發(fā)failover,即不會(huì)將Standby提升為Active,即使Active已經(jīng)失效。接下來(lái)介紹如何實(shí)現(xiàn)自動(dòng)failover。

    1)、組件

    Automatic Failover中,增加了2個(gè)新的組件:zookeeper集群,ZKFailoverController進(jìn)程(簡(jiǎn)稱(chēng)為ZKFC)。

    Zookeeper是一個(gè)高可用的調(diào)度服務(wù),可以保存一系列調(diào)度數(shù)據(jù),當(dāng)這些數(shù)據(jù)變更(notify)時(shí)可以通知Client,以及監(jiān)控(montitor)Clients失效,自動(dòng)failover的實(shí)現(xiàn)將依賴(lài)于Zookeeper的幾個(gè)特性:

        1、Failure delection:失效檢測(cè),每個(gè)Namenode將會(huì)和zookeeper建立一個(gè)持久session,如果Namenode失效,那么次session將會(huì)過(guò)期失效,此后Zookeeper將會(huì)通知另一個(gè)Namenode,然后觸發(fā)Failover。

        2、Active Namenode election:zookeeper提供了簡(jiǎn)單的機(jī)制來(lái)實(shí)現(xiàn)Acitve Node選舉,如果當(dāng)前Active失效,Standby將會(huì)獲取一個(gè)特定的排他鎖(lock),那么獲取(持有)鎖的Node接下來(lái)將會(huì)成為Active。

    ZKFailoverControllor(ZKFC)是一個(gè)zookeeper客戶端,它主要用來(lái)監(jiān)測(cè)和管理Namenodes的狀態(tài),每個(gè)Namenode機(jī)器上都會(huì)運(yùn)行一個(gè)ZKFC程序,它的職責(zé)為:

        1、Health monitoring:ZKFC間歇性的使用health-check指令ping本地的Namenode,Namenode也會(huì)及時(shí)的反饋?zhàn)约旱膆ealth status。如果Namenode失效,或者unhealthy,或者無(wú)響應(yīng),那么ZKFS將會(huì)標(biāo)記其為“unhealthy”。

        2、Zookeeper session manangement:當(dāng)本地Nanenode運(yùn)行良好時(shí),ZKFC將會(huì)持有一個(gè)zookeeper session,如果本地Namenode為Active,它同時(shí)也持有一個(gè)“排他鎖”(znode);這個(gè)lock在zookeeper中為“ephemeral” znode(臨時(shí)節(jié)點(diǎn)),如果session過(guò)期,那么次lock所對(duì)應(yīng)的znode也將被刪除。(參見(jiàn)zookeeper特性)

        3、Zookeeper-based election:如果本地Namenode運(yùn)行良好,并且ZKFS沒(méi)有發(fā)現(xiàn)其他的的Namenode持有l(wèi)ock(比如Active失效后,釋放了lock),它將嘗試獲取鎖,如果獲取成功,即“贏得了選舉”,那么此后將會(huì)把本地Namenode標(biāo)記為Active,然后觸發(fā)Failover:首先,調(diào)用fencing method,然后提升本地Namenode 為Active。

    2)、配置

    在Automatic Failover中,需要把一個(gè)重要的配置項(xiàng)添加到hdfs-site.xml中。

<property>  
    <name>dfs.ha.automatic-failover.enabled</name>  
    <value>true</value>
</property>

此外還需要在core-site.xml中,增加如下配置:

<property>  
    <name>ha.zookeeper.quorum</name>  
    <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>

    上述zookeeper集群為即備,盡可能選擇相對(duì)平穩(wěn)的zk集群。

    其中"dfs.ha.automatic-failover.enabled"可以為每個(gè)nameservice ID分別配置:dfs.ha.automatic-failover.enabled.[nameservice ID]。此外在core-site.xml中還可以配置Zookeeper Client的相關(guān)參數(shù),比如sessionTimeout,這些配置項(xiàng)以"ha.zookeeper"開(kāi)頭,其中"dfs.ha."開(kāi)頭的部分配置項(xiàng)可以用來(lái)設(shè)定fencing method的相關(guān)控制。

    3)、初始化HA狀態(tài)

    上述準(zhǔn)備工作結(jié)束后,我們還需要在zookeeper中初始化HA的狀態(tài),通過(guò)執(zhí)行“hdfs zkfc -formatZK”,此命令將會(huì)在zookeeker中創(chuàng)建一個(gè)znode,用來(lái)保存HA或failover的數(shù)據(jù)。

    4)、啟動(dòng)集群

    可以使用"start-dfs.sh"這個(gè)便捷的指令,它啟動(dòng)了hdfs所需要的所有守護(hù)進(jìn)程,當(dāng)然包括ZKFC。也可以使用"hadoop-daemon.sh start zkfc"手動(dòng)啟動(dòng)ZKFC客戶端。

    5)、檢驗(yàn)Failover

    一旦Automatic Failover集群?jiǎn)?dòng)之后,我們需要檢測(cè)Failover是否符合預(yù)期。首先,我們需要通過(guò)命令(getServiceState)或者在Namenode的Web UI上查看各個(gè)Namenode的狀態(tài),確認(rèn)兩個(gè)Namenode是否分別處于Active和Standby;此后,你可以手動(dòng)關(guān)閉Active Namenode,比如使用kill -9 <pid num>,在確定Acitve Node失效后,再次檢測(cè)原來(lái)的Standby是否已經(jīng)提升為Active;不過(guò)因?yàn)閦ookeeper session過(guò)期判定需要達(dá)到sessionTimeout(可配置,ha.zookeeper.session-timeout),這個(gè)failover過(guò)程可能需要滯后數(shù)秒,默認(rèn)為5秒。

    如果沒(méi)有按照預(yù)期failover,那么你需要檢測(cè)配置文件是否正確,zk服務(wù)是否正確。此外,我們還可以使用上述DFSHAAadmin指令多次嘗試。

    五)、FAQ

    1、ZKFC和Namenodes守護(hù)進(jìn)程的啟動(dòng)順序是否重要?

    No,對(duì)于指定的Namenode,你可以在其之前或者之后啟動(dòng)ZKFC均可以,ZKFC只是調(diào)度Namenode的存活狀態(tài),如果不啟動(dòng)ZKFC,此Namenode將無(wú)法參與自動(dòng)failover過(guò)程。

    2、是否需要額外的monitoring?

    你需要在Namenode機(jī)器上,添加額外的monitor用來(lái)監(jiān)控ZKFC是否運(yùn)行。在某些情況下,zookeeper集群的故障可能導(dǎo)致ZKFC意外中斷,你需要適時(shí)的重啟ZKFC。此外,還需要監(jiān)控Zookeeper集群的運(yùn)行狀況,如果Zookeeper集群失效,那么HA集群將無(wú)法failover。

    3、如果Zookeeper失效,將會(huì)怎么樣?

    如果zookeeper集群故障,那么Automatic Failover將不會(huì)觸發(fā),即使Namenode失效,這也意味著ZKFC無(wú)法正常運(yùn)行。不過(guò),如果Namenodes正常(即使有一個(gè)失效),那么HDFS系統(tǒng)將不會(huì)受到影響。因?yàn)镠DFS Client并沒(méi)有基于zookeeper做任何事情,當(dāng)zookeeper集群仍需要盡快的恢復(fù)以避免當(dāng)前Active失效而造成的“split-brain”等問(wèn)題。

    4、是否可以在Namenodes之間指定優(yōu)先級(jí)?

    NO,這是不能支持的。首先啟動(dòng)的Namenode將作為Active,我們只能認(rèn)為控制Namenode啟動(dòng)的順序來(lái)做到“優(yōu)先級(jí)”。

    5、在Automatic Failover中,手動(dòng)Failover怎么做?

    和普通的Failover一樣,我們總是可以通過(guò)"hdfs haadmin -DFSHAAdmin -failover"來(lái)實(shí)現(xiàn)手動(dòng)Failover。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.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è)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

名稱(chēng)欄目:Hadoop之HDFS的HA與QJM-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article6/dpjjog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站排名虛擬主機(jī)品牌網(wǎng)站建設(shè)企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(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)

搜索引擎優(yōu)化