版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章ZooKeeper技術(shù)ApacheZooKeeper了解分布式協(xié)調(diào)技術(shù)概念理解ZooKeeper的主要概念和特征熟悉ZooKeeper的數(shù)據(jù)模型掌握常用的Shell操作命令掌握搭建ZooKeeper環(huán)境學(xué)習(xí)目標(biāo)28/21/2024參考書(shū)分布式協(xié)調(diào)技術(shù)
分布式協(xié)調(diào)技術(shù)主要用來(lái)解決分布式環(huán)境中多個(gè)進(jìn)程之間的同步控制,讓它們有序地去訪問(wèn)某種臨界資源,防止產(chǎn)生“臟數(shù)據(jù)”。單機(jī)環(huán)境下可以利用簡(jiǎn)單的讀寫(xiě)鎖機(jī)制來(lái)實(shí)現(xiàn),問(wèn)題放到分布式環(huán)境下就需要分布式鎖,這個(gè)分布式鎖也就是分布式協(xié)調(diào)技術(shù)實(shí)現(xiàn)的核心內(nèi)容。在分布式計(jì)算上,不同的計(jì)算機(jī)透過(guò)信息交換,嘗試達(dá)成共識(shí);但有時(shí)候,系統(tǒng)上協(xié)調(diào)計(jì)算機(jī)或成員計(jì)算機(jī)可能因系統(tǒng)錯(cuò)誤并交換錯(cuò)的信息,導(dǎo)致影響最終的系統(tǒng)一致性。])。如在單機(jī)環(huán)境中,進(jìn)程對(duì)一個(gè)資源的獲取要么成功,要么失敗。但在分布式環(huán)境中,對(duì)一個(gè)資源的訪問(wèn)或者一個(gè)服務(wù)的調(diào)用,即使返回失敗消息,但有可能實(shí)際上訪問(wèn)成功或者調(diào)用成功了,也有可能是時(shí)間上不同的兩個(gè)節(jié)點(diǎn)對(duì)另外一個(gè)節(jié)點(diǎn)順序調(diào)用服務(wù),那么調(diào)用請(qǐng)求一定是按照順序到達(dá)的嗎?這些都涉及網(wǎng)絡(luò)問(wèn)題,所以分布式協(xié)調(diào)遠(yuǎn)比在同一臺(tái)機(jī)器上對(duì)多個(gè)進(jìn)程的調(diào)度要難得多,于是一種通用性好、伸縮性好、高可靠、高可用的協(xié)調(diào)機(jī)制應(yīng)運(yùn)而生——ZooKeeper。48/21/2024概述Zookeeper是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop的分布式協(xié)調(diào)服務(wù)它包含一個(gè)簡(jiǎn)單的原語(yǔ)集,分布式應(yīng)用程序可以基于它實(shí)現(xiàn)同步服務(wù),配置維護(hù)和命名服務(wù)等58/21/2024什么是Zookeeper?8/21/20246為什么使用Zookeeper?78/21/2024大部分分布式應(yīng)用需要一個(gè)主控、協(xié)調(diào)器或控制器來(lái)管理物理分布的子進(jìn)程(如資源、任務(wù)分配等)目前,大部分應(yīng)用需要開(kāi)發(fā)私有的協(xié)調(diào)程序,缺乏一個(gè)通用的機(jī)制協(xié)調(diào)程序的反復(fù)編寫(xiě)浪費(fèi),且難以形成通用、伸縮性好的協(xié)調(diào)器ZooKeeper:提供通用的分布式鎖服務(wù),用以協(xié)調(diào)分布式應(yīng)用Zookeeper能幫我們做什么?Hadoop,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)NameNode,存儲(chǔ)配置信息等.HBase,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)HMaster,察覺(jué)HRegionServer聯(lián)機(jī)和宕機(jī),存儲(chǔ)訪問(wèn)控制列表等.88/21/2024Zookeeper的特性Zookeeper是簡(jiǎn)單的Zookeeper是富有表現(xiàn)力的Zookeeper具有高可用性Zookeeper采用松耦合交互方式Zookeeper是一個(gè)資源庫(kù)8/21/20249Zookeeper的安裝和配置(單機(jī)模式)下載ZooKeeper:/apache-mirror/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz解壓:tarxzfzookeeper-3.4.3.tar.gz在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000
dataDir=/Users/zdandljb/zookeeper/data
dataLogDir=/Users/zdandljb/zookeeper/dataLog
clientPort=2181啟動(dòng)ZooKeeper的Server:shbin/zkServer.shstart,如果想要關(guān)閉,輸入:zkServer.shstop8/21/202410Zookeeper的安裝和配置118/21/2024創(chuàng)建myid文件,server1機(jī)器的內(nèi)容為:1,server2機(jī)器的內(nèi)容為:2,server3機(jī)器的內(nèi)容為:3在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000
dataDir=/Users/zdandljb/zookeeper/data
dataLogDir=/Users/zdandljb/zookeeper/dataLogclientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888server.3=server3:2888:3888Zookeeper的安裝和配置128/21/2024建了3個(gè)文件夾,server1server2server3,然后每個(gè)文件夾里面解壓一個(gè)zookeeper的下載包進(jìn)入data目錄,創(chuàng)建一個(gè)myid的文件,里面寫(xiě)入一個(gè)數(shù)字,server1,就寫(xiě)一個(gè)1,server2對(duì)應(yīng)myid文件就寫(xiě)入2,server3對(duì)應(yīng)myid文件就寫(xiě)個(gè)3Zookeeper的安裝和配置138/21/2024在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000
dataDir=/Users/zdandljb/zookeeper/data
dataLogDir=xxx/zookeeper/server1/clientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:3888Zookeeper的數(shù)據(jù)模型層次化的目錄結(jié)構(gòu),命名符合常規(guī)文件系統(tǒng)規(guī)范每個(gè)節(jié)點(diǎn)在zookeeper中叫做znode,并且其有一個(gè)唯一的路徑標(biāo)識(shí)節(jié)點(diǎn)Znode可以包含數(shù)據(jù)和子節(jié)點(diǎn),但是EPHEMERAL類型的節(jié)點(diǎn)不能有子節(jié)點(diǎn)Znode中的數(shù)據(jù)可以有多個(gè)版本,比如某一個(gè)路徑下存有多個(gè)數(shù)據(jù)版本,那么查詢這個(gè)路徑下的數(shù)據(jù)就需要帶上版本客戶端應(yīng)用可以在節(jié)點(diǎn)上設(shè)置監(jiān)視器節(jié)點(diǎn)不支持部分讀寫(xiě),而是一次性完整讀寫(xiě)8/21/202414Zookeeper的節(jié)點(diǎn)Znode有兩種類型,短暫的(ephemeral)和持久的(persistent)Znode的類型在創(chuàng)建時(shí)確定并且之后不能再修改短暫znode的客戶端會(huì)話結(jié)束時(shí),zookeeper會(huì)將該短暫znode刪除,短暫znode不可以有子節(jié)點(diǎn)持久znode不依賴于客戶端會(huì)話,只有當(dāng)客戶端明確要?jiǎng)h除該持久znode時(shí)才會(huì)被刪除Znode有四種形式的目錄節(jié)點(diǎn),PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL8/21/202415Zookeeper的角色領(lǐng)導(dǎo)者(leader),負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)學(xué)習(xí)者(learner),包括跟隨者(follower)和觀察者(observer),follower用于接受客戶端請(qǐng)求并想客戶端返回結(jié)果,在選主過(guò)程中參與投票O(jiān)bserver可以接受客戶端連接,將寫(xiě)請(qǐng)求轉(zhuǎn)發(fā)給leader,但observer不參加投票過(guò)程,只同步leader的狀態(tài),observer的目的是為了擴(kuò)展系統(tǒng),提高讀取速度客戶端(client),請(qǐng)求發(fā)起方8/21/202416Zookeeper的角色8/21/202417Zookeeper的順序號(hào)創(chuàng)建znode時(shí)設(shè)置順序標(biāo)識(shí),znode名稱后會(huì)附加一個(gè)值順序號(hào)是一個(gè)單調(diào)遞增的計(jì)數(shù)器,由父節(jié)點(diǎn)維護(hù)在分布式系統(tǒng)中,順序號(hào)可以被用于為所有的事件進(jìn)行全局排序,這樣客戶端可以通過(guò)順序號(hào)推斷事件的順序8/21/202418Zookeeper的讀寫(xiě)機(jī)制Zookeeper是一個(gè)由多個(gè)server組成的集群一個(gè)leader,多個(gè)follower每個(gè)server保存一份數(shù)據(jù)副本全局?jǐn)?shù)據(jù)一致分布式讀寫(xiě)更新請(qǐng)求轉(zhuǎn)發(fā),由leader實(shí)施8/21/202419Zookeeper的保證更新請(qǐng)求順序進(jìn)行,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗全局唯一數(shù)據(jù)視圖,client無(wú)論連接到哪個(gè)server,數(shù)據(jù)視圖都是一致的實(shí)時(shí)性,在一定事件范圍內(nèi),client能讀到最新數(shù)據(jù)8/21/202420Zookeeper的API接口String
create(String
path,byte[]
data,List<ACL>
acl,CreateMode
createMode)Stat
exists(String
path,boolean
watch)voiddelete(String
path,int
version)List<String>getChildren(String
path,boolean
watch)List<String>getChildren(String
path,boolean
watch)8/21/202421Zookeeper的API接口Stat
setData(String
path,byte[]
data,int
version)byte[]getData(String
path,boolean
watch,Stat
stat)voidaddAuthInfo(String
scheme,byte[]
auth)Stat
setACL(String
path,List<ACL>
acl,int
version)List<ACL>getACL(String
path,Stat
stat)8/21/202422觀察(watcher)Watcher在ZooKeeper是一個(gè)核心功能,Watcher可以監(jiān)控目錄節(jié)點(diǎn)的數(shù)據(jù)變化以及子目錄的變化,一旦這些狀態(tài)發(fā)生變化,服務(wù)器就會(huì)通知所有設(shè)置在這個(gè)目錄節(jié)點(diǎn)上的Watcher,從而每個(gè)客戶端都很快知道它所關(guān)注的目錄節(jié)點(diǎn)的狀態(tài)發(fā)生變化,而做出相應(yīng)的反應(yīng)可以設(shè)置觀察的操作:exists,getChildren,getData可以觸發(fā)觀察的操作:create,delete,setData8/21/202423寫(xiě)操作與zookeeper內(nèi)部事件的對(duì)應(yīng)關(guān)系8/21/202424zookeeper內(nèi)部事件與watcher的對(duì)應(yīng)關(guān)系8/21/202425寫(xiě)操作與watcher的對(duì)應(yīng)關(guān)系8/21/202426ACL每個(gè)znode被創(chuàng)建時(shí)都會(huì)帶有一個(gè)ACL列表,用于決定誰(shuí)可以對(duì)它執(zhí)行何種操作8/21/202427ACL身份驗(yàn)證模式有三種:digest:用戶名,密碼host:通過(guò)客戶端的主機(jī)名來(lái)識(shí)別客戶端ip:
通過(guò)客戶端的ip來(lái)識(shí)別客戶端newACL(Perms.READ,newId("host",""));
這個(gè)ACL對(duì)應(yīng)的身份驗(yàn)證模式是host,符合該模式的
身份是,權(quán)限的組合是:READ8/21/202428Znode的節(jié)點(diǎn)狀態(tài)8/21/202429Zookeeper工作原理Zookeeper的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè)server之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式和廣播模式。當(dāng)服務(wù)啟動(dòng)或者在領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來(lái),且大多數(shù)server的完成了和leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和server具有相同的系統(tǒng)狀態(tài)。8/21/202430Zookeeper工作原理一旦leader已經(jīng)和多數(shù)的follower進(jìn)行了狀態(tài)同步后,他就可以開(kāi)始廣播消息了,即進(jìn)入廣播狀態(tài)。這時(shí)候當(dāng)一個(gè)server加入zookeeper服務(wù)中,它會(huì)在恢復(fù)模式下啟動(dòng),發(fā)現(xiàn)leader,并和leader進(jìn)行狀態(tài)同步。待到同步結(jié)束,它也參與消息廣播。Zookeeper服務(wù)一直維持在Broadcast狀態(tài),直到leader崩潰了或者leader失去了大部分的followers支持。8/21/202431Zookeeper工作原理廣播模式需要保證proposal被按順序處理,因此zk采用了遞增的事務(wù)id號(hào)(zxid)來(lái)保證。所有的提議(proposal)都在被提出的時(shí)候加上了zxid。實(shí)現(xiàn)中zxid是一個(gè)64為的數(shù)字,它高32位是epoch用來(lái)標(biāo)識(shí)leader關(guān)系是否改變,每次一個(gè)leader被選出來(lái),它都會(huì)有一個(gè)新的epoch。低32位是個(gè)遞增計(jì)數(shù)。當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時(shí)候zk進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個(gè)新的leader,讓所有的server都恢復(fù)到一個(gè)正確的狀態(tài)。8/21/202432Leader選舉每個(gè)Server啟動(dòng)以后都詢問(wèn)其它的Server它要投票給誰(shuí)。對(duì)于其他server的詢問(wèn),server每次根據(jù)自己的狀態(tài)都回復(fù)自己推薦的leader的id和上一次處理事務(wù)的zxid(系統(tǒng)啟動(dòng)時(shí)每個(gè)server都會(huì)推薦自己)收到所有Server回復(fù)以后,就計(jì)算出zxid最大的哪個(gè)Server,并將這個(gè)Server相關(guān)信息設(shè)置成下一次要投票的Server。計(jì)算這過(guò)程中獲得票數(shù)最多的的sever為獲勝者,如果獲勝者的票數(shù)超過(guò)半數(shù),則改server被選為leader。否則,繼續(xù)這個(gè)過(guò)程,直到leader被選舉出來(lái)。8/21/202433Leader選舉leader就會(huì)開(kāi)始等待server連接Follower連接leader,將最大的zxid發(fā)送給leaderLeader根據(jù)follower的zxid確定同步點(diǎn)完成同步后通知follower已經(jīng)成為uptodate狀態(tài)Follower收到uptodate消息后,又可以重新接受client的請(qǐng)求進(jìn)行服務(wù)了8/21/202434Leader選舉8/21/202435Leader選舉8/21/202436Zookeeper示例代碼8/21/202437Zookeeper示例代碼8/21/202438Zookeeper示例代碼輸出的結(jié)果如下:已經(jīng)觸發(fā)了None事件!testRootData [testChildPathOne]目錄節(jié)點(diǎn)狀態(tài):[5,5,1281804532336,1281804532336,0,1,0,0,12,1,6]已經(jīng)觸發(fā)了NodeChildrenChanged事件!testChildDataTwo已經(jīng)觸發(fā)了NodeDeleted事件!已經(jīng)觸發(fā)了NodeDeleted事件!8/21/202439應(yīng)用場(chǎng)景1-統(tǒng)一命名服務(wù)分布式應(yīng)用中,通常需要有一套完整的命名規(guī)則,既能夠產(chǎn)生唯一的名稱又便于人識(shí)別和記住,通常情況下用樹(shù)形的名稱結(jié)構(gòu)是一個(gè)理想的選擇,樹(shù)形的名稱結(jié)構(gòu)是一個(gè)有層次的目錄結(jié)構(gòu),既對(duì)人友好又不會(huì)重復(fù)。NameService是Zookeeper內(nèi)置的功能,只要調(diào)用Zookeeper的API就能實(shí)現(xiàn)8/21/202440應(yīng)用場(chǎng)景2-配置管理配置的管理在分布式應(yīng)用環(huán)境中很常見(jiàn),例如同一個(gè)應(yīng)用系統(tǒng)需要多臺(tái)PCServer運(yùn)行,但是它們運(yùn)行的應(yīng)用系統(tǒng)的某些配置項(xiàng)是相同的,如果要修改這些相同的配置項(xiàng),那么就必須同時(shí)修改每臺(tái)運(yùn)行這個(gè)應(yīng)用系統(tǒng)的PCServer,這樣非常麻煩而且容易出錯(cuò)。將配置信息保存在Zookeeper的某個(gè)目錄節(jié)點(diǎn)中,然后將所有需要修改的應(yīng)用機(jī)器監(jiān)控配置信息的狀態(tài),一旦配置信息發(fā)生變化,每臺(tái)應(yīng)用機(jī)器就會(huì)收到Zookeeper的通知,然后從Zookeeper獲取新的配置信息應(yīng)用到系統(tǒng)中。8/21/202441應(yīng)用場(chǎng)景2-配置管理8/21/202442應(yīng)用場(chǎng)景3-集群管理Zookeeper能夠很容易的實(shí)現(xiàn)集群管理的功能,如有多臺(tái)Server組成一個(gè)服務(wù)集群,那么必須要一個(gè)“總管”知道當(dāng)前集群中每臺(tái)機(jī)器的服務(wù)狀態(tài),一旦有機(jī)器不能提供服務(wù),集群中其它集群必須知道,從而做出調(diào)整重新分配服務(wù)策略。同樣當(dāng)增加集群的服務(wù)能力時(shí),就會(huì)增加一臺(tái)或多臺(tái)Server,同樣也必須讓“總管”知道。Zookeeper不僅能夠維護(hù)當(dāng)前的集群中機(jī)器的服務(wù)狀態(tài),而且能夠選出一個(gè)“總管”,讓這個(gè)總管來(lái)管理集群,這就是Zookeeper的另一個(gè)功能LeaderElection。8/21/202443應(yīng)用場(chǎng)景3-集群管理8/21/202444應(yīng)用場(chǎng)景3-集群管理zk.create("/testRootPath/testChildPath1","1".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);zk.create(“/testRootPath/testChildPath2”,“2”.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);zk.create("/testRootPath/testChildPath3","3".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);8/21/202445應(yīng)用場(chǎng)景3-集群管理zk.create("/testRootPath/testChildPath4","4".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(zk.getChildren("/testRootPath",false));打印結(jié)果:[testChildPath10000000000,testChildPath20000000001,testChildPath40000000003,testChildPath30000000002]8/21/202446應(yīng)用場(chǎng)景3-集群管理規(guī)定編號(hào)最小的為master,所以當(dāng)我們對(duì)SERVERS節(jié)點(diǎn)做監(jiān)控的時(shí)候,得到服務(wù)器列表,只要所有集群機(jī)器邏輯認(rèn)為最小編號(hào)節(jié)點(diǎn)為master,那么master就被選出,而這個(gè)master宕機(jī)的時(shí)候,相應(yīng)的znode會(huì)消失,然后新的服務(wù)器列表就被推送到客戶端,然后每個(gè)節(jié)點(diǎn)邏輯認(rèn)為最小編號(hào)節(jié)點(diǎn)為master,這樣就做到動(dòng)態(tài)master選舉。8/21/202447應(yīng)用場(chǎng)景4-共享鎖共享鎖在同一個(gè)進(jìn)程中很容易實(shí)現(xiàn),但是在跨進(jìn)程或者在不同Server之間就不好實(shí)現(xiàn)了。Zookeeper卻很容易實(shí)現(xiàn)這個(gè)功能,實(shí)現(xiàn)方式也是需要獲得鎖的Server
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程游戲化課程設(shè)計(jì)能力
- 網(wǎng)絡(luò)課程設(shè)計(jì)的方法
- 重力壩課程設(shè)計(jì)黃嘉
- 頻率數(shù)字計(jì)課程設(shè)計(jì)
- 粗鉛冶煉煙氣課程設(shè)計(jì)
- 美術(shù)培訓(xùn) 課程設(shè)計(jì)
- GB/T 26731-2024廢輪胎加工處理
- 2024年新能源汽車(chē)零部件委托加工服務(wù)合同3篇
- 2025年度高性能建筑鋼材銷售專營(yíng)合同3篇
- 2025年度股權(quán)激勵(lì)協(xié)議:上市公司員工股權(quán)激勵(lì)與業(yè)績(jī)考核3篇
- 銀行會(huì)計(jì)主管年度工作總結(jié)2024(30篇)
- 教師招聘(教育理論基礎(chǔ))考試題庫(kù)(含答案)
- 2024年秋季學(xué)期學(xué)校辦公室工作總結(jié)
- 上海市12校2025屆高三第一次模擬考試英語(yǔ)試卷含解析
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案集錦
- 長(zhǎng)亭送別完整版本
- 《鐵路軌道維護(hù)》課件-更換道岔尖軌作業(yè)
- 股份代持協(xié)議書(shū)簡(jiǎn)版wps
- 職業(yè)學(xué)校視頻監(jiān)控存儲(chǔ)系統(tǒng)解決方案
- 《銷售心理學(xué)培訓(xùn)》課件
- 2024年安徽省公務(wù)員錄用考試《行測(cè)》真題及解析
評(píng)論
0/150
提交評(píng)論