




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
FastDFS一個(gè)高效的分布式文件系統(tǒng)FastDFS是一款類GoogleFS的開源分布式文件系統(tǒng),它用純C語言實(shí)現(xiàn),支持Linux、FreeBSD、AIX等UNIX系統(tǒng)。它只能通過專有API對(duì)文件進(jìn)行存取訪問,不支持POSIX接口方式,不能mount使用。準(zhǔn)確地講,GoogleFS以及FastDFS、mogileFS、HDFS、TFS等類GoogleFS都不是系統(tǒng)級(jí)的分布式文件系統(tǒng),而是應(yīng)用級(jí)的分布式文件存儲(chǔ)服務(wù)。FastDFS的設(shè)計(jì)理念FastDFS是為互聯(lián)網(wǎng)應(yīng)用量身定做的分布式文件系統(tǒng),充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo)。和現(xiàn)有的類GoogleFS分布式文件系統(tǒng)相比,F(xiàn)astDFS的架構(gòu)和設(shè)計(jì)理念有其獨(dú)到之處,主要體現(xiàn)在輕量級(jí)、分組方式和對(duì)等結(jié)構(gòu)三個(gè)方面。輕量級(jí)FastDFS只有兩個(gè)角色:Trackerserver和Storageserver。Trackerserver作為中心結(jié)點(diǎn),其主要作用是負(fù)載均衡和調(diào)度。Trackerserver在內(nèi)存中記錄分組和Storageserver的狀態(tài)等信息,不記錄文件索引信息,占用的內(nèi)存量很少。另外,客戶端(應(yīng)用)和Storageserver訪問Trackerserver時(shí),Trackerserver掃描內(nèi)存中的分組和Storageserver信息,然后給出應(yīng)答。由此可以看出Trackerserver非常輕量化,不會(huì)成為系統(tǒng)瓶頸。FastDFS中的Storageserver在其他文件系統(tǒng)中通常稱作Trunkserver或Dataserver。Storageserver直接利用OS的文件系統(tǒng)存儲(chǔ)文件。FastDFS不會(huì)對(duì)文件進(jìn)行分塊存儲(chǔ),客戶端上傳的文件和Storageserver上的文件一一對(duì)應(yīng)。眾所周知,大多數(shù)網(wǎng)站都需要存儲(chǔ)用戶上傳的文件,如圖片、視頻、電子文檔等。出于降低帶寬和存儲(chǔ)成本的考慮,網(wǎng)站通常都會(huì)限制用戶上傳的文件大小,例如圖片文件不能超過5MB、視頻文件不能超過100MB等。我認(rèn)為,對(duì)于互聯(lián)網(wǎng)應(yīng)用,文件分塊存儲(chǔ)沒有多大的必要。它既沒有帶來多大的好處,又增加了系統(tǒng)的復(fù)雜性。FastDFS不對(duì)文件進(jìn)行分塊存儲(chǔ),與支持文件分塊存儲(chǔ)的DFS相比,更加簡潔高效,并且完全能滿足絕大多數(shù)互聯(lián)網(wǎng)應(yīng)用的實(shí)際需要。在FastDFS中,客戶端上傳文件時(shí),文件ID不是由客戶端指定,而是由Storageserver生成后返回給客戶端的。文件ID中包含了組名、文件相對(duì)路徑和文件名,Storageserver可以根據(jù)文件ID直接定位到文件。因此FastDFS集群中根本不需要存儲(chǔ)文件索引信息,這是FastDFS比較輕量級(jí)的一個(gè)例證。而其他文件系統(tǒng)則需要存儲(chǔ)文件索引信息,這樣的角色通常稱作NameServer。其中mogileFS采用MySQL數(shù)據(jù)庫來存儲(chǔ)文件索引以及系統(tǒng)相關(guān)的信息,其局限性顯而易見,MySQL將成為整個(gè)系統(tǒng)的瓶頸。FastDFS輕量級(jí)的另外一個(gè)體現(xiàn)是代碼量較小。最新的V2.0包括了C客戶端API、FastDHT客戶端API和PHPextension等,代碼行數(shù)不到5.2萬行。分組方式類GoogleFS都支持文件冗余備份,例如GoogleFS、TFS的備份數(shù)是3。一個(gè)文件存儲(chǔ)到哪幾個(gè)存儲(chǔ)結(jié)點(diǎn),通常采用動(dòng)態(tài)分配的方式。采用這種方式,一個(gè)文件存儲(chǔ)到的結(jié)點(diǎn)是不確定的。舉例說明,文件備份數(shù)是3,集群中有A、B、C、D四個(gè)存儲(chǔ)結(jié)點(diǎn)。文件1可能存儲(chǔ)在A、B、C三個(gè)結(jié)點(diǎn),文件2可能存儲(chǔ)在B、C、D三個(gè)結(jié)點(diǎn),文件3可能存儲(chǔ)在A、B、D三個(gè)結(jié)點(diǎn)。FastDFS采用了分組存儲(chǔ)方式。集群由一個(gè)或多個(gè)組構(gòu)成,集群存儲(chǔ)總?cè)萘繛榧褐兴薪M的存儲(chǔ)容量之和。一個(gè)組由一臺(tái)或多臺(tái)存儲(chǔ)服務(wù)器組成,同組內(nèi)的多臺(tái)Storageserver之間是互備關(guān)系,同組存儲(chǔ)服務(wù)器上的文件是完全一致的。文件上傳、下載、刪除等操作可以在組內(nèi)任意一臺(tái)Storageserver上進(jìn)行。類似木桶短板效應(yīng),一個(gè)組的存儲(chǔ)容量為該組內(nèi)存儲(chǔ)服務(wù)器容量最小的那個(gè),由此可見組內(nèi)存儲(chǔ)服務(wù)器的軟硬件配置最好是一致的。采用分組存儲(chǔ)方式的好處是靈活、可控性較強(qiáng)。比如上傳文件時(shí),可以由客戶端直接指定上傳到的組。一個(gè)分組的存儲(chǔ)服務(wù)器訪問壓力較大時(shí),可以在該組增加存儲(chǔ)服務(wù)器來擴(kuò)充服務(wù)能力(縱向擴(kuò)容)。當(dāng)系統(tǒng)容量不足時(shí),可以增加組來擴(kuò)充存儲(chǔ)容量(橫向擴(kuò)容)。采用這樣的分組存儲(chǔ)方式,可以使用FastDFS對(duì)文件進(jìn)行管理,使用主流的Webserver如Apache、nginx等進(jìn)行文件下載。對(duì)等結(jié)構(gòu)FastDFS集群中的Trackerserver也可以有多臺(tái),Trackerserver和Storageserver均不存在單點(diǎn)問題。Trackerserver之間是對(duì)等關(guān)系,組內(nèi)的Storageserver之間也是對(duì)等關(guān)系。傳統(tǒng)的Master-Slave結(jié)構(gòu)中的Master是單點(diǎn),寫操作僅針對(duì)Master。如果Master失效,需要將Slave提升為Master,實(shí)現(xiàn)邏輯會(huì)比較復(fù)雜。和Master-Slave結(jié)構(gòu)相比,對(duì)等結(jié)構(gòu)中所有結(jié)點(diǎn)的地位是相同的,每個(gè)結(jié)點(diǎn)都是Master,不存在單點(diǎn)問題。FastDFS的架構(gòu)圖1展示的是FastDFS的系統(tǒng)架構(gòu)。圖1 FastDFS的系統(tǒng)架構(gòu)從圖1可以看出,Trackerserver之間相互獨(dú)立,不存在直接聯(lián)系??蛻舳撕蚐torageserver主動(dòng)連接Trackerserver。Storageserver主動(dòng)向Trackerserver報(bào)告其狀態(tài)信息,包括磁盤剩余空間、文件同步狀況、文件上傳下載次數(shù)等統(tǒng)計(jì)信息。Storageserver會(huì)連接集群中所有的Trackerserver,向他們報(bào)告自己的狀態(tài)。Storageserver啟動(dòng)一個(gè)單獨(dú)的線程來完成對(duì)一臺(tái)Trackerserver的連接和定時(shí)報(bào)告。需要說明的是,一個(gè)組包含的Storageserver不是通過配置文件設(shè)定的,而是通過Trackerserver獲取到的。不同組的Storageserver之間不會(huì)相互通信,同組內(nèi)的Storageserver之間會(huì)相互連接進(jìn)行文件同步。Storageserver采用binlog文件記錄文件上傳、刪除等更新操作。binlog中只記錄文件名,不記錄文件內(nèi)容。文件同步只在同組內(nèi)的Storageserver之間進(jìn)行,采用push方式,即源頭服務(wù)器同步給目標(biāo)服務(wù)器。只有源頭數(shù)據(jù)才需要同步,備份數(shù)據(jù)并不需要再次同步,否則就構(gòu)成環(huán)路了。有個(gè)例外,就是新增加一臺(tái)Storageserver時(shí),由已有的一臺(tái)Storageserver將已有的所有數(shù)據(jù)(包括源頭數(shù)據(jù)和備份數(shù)據(jù))同步給該新增服務(wù)器。Storageserver中由專門的線程根據(jù)binlog進(jìn)行文件同步。為了最大程度地避免相互影響以及出于系統(tǒng)簡潔性考慮,Storageserver對(duì)組內(nèi)除自己以外的每臺(tái)服務(wù)器都會(huì)啟動(dòng)一個(gè)線程來進(jìn)行文件同步。文件同步采用增量同步方式,系統(tǒng)記錄已同步的位置(binlog文件偏移量)到標(biāo)識(shí)文件中。標(biāo)識(shí)文件名格式:deststorageIP_port.mark,例如:4_23000.mark。文件上傳和下載的交互過程接下來我們一起看一下文件上傳和下載的交互過程。文件上傳和下載流程分別如圖2、圖3所示。文件上傳流程的步驟如下:圖2 文件上傳流程圖3 文件下載流程1.Client詢問Trackerserver上傳到的Storageserver;2.Trackerserver返回一臺(tái)可用的Storageserver,返回的數(shù)據(jù)為該Storageserver的IP地址和端口;3.Client直接和該Storageserver建立連接,進(jìn)行文件上傳,Storageserver返回新生成的文件ID,文件上傳結(jié)束。文件下載流程的步驟如下:1.Client詢問Trackerserver可以下載指定文件的Storageserver,參數(shù)為文件ID(包含組名和文件名);2.Trackerserver返回一臺(tái)可用的Storageserver;3.Client直接和該Storageserver建立連接,完成文件下載。文件同步延遲問題的提出客戶端將一個(gè)文件上傳到一臺(tái)Storageserver后,文件上傳工作就結(jié)束了。由該Storageserver根據(jù)binlog中的上傳記錄將這個(gè)文件同步到同組的其他Storageserver。這樣的文件同步方式是異步方式,異步方式帶來了文件同步延遲的問題。新上傳文件后,在尚未被同步過去的Storageserver上訪問該文件,會(huì)出現(xiàn)找不到文件的現(xiàn)象。FastDFS是如何解決文件同步延遲這個(gè)問題的呢?文件的訪問分為兩種情況:文件更新和文件下載。文件更新包括設(shè)置文件附加屬性和刪除文件。文件的附加屬性包括文件大小、圖片寬度、圖片高度等。FastDFS中,文件更新操作都會(huì)優(yōu)先選擇源Storageserver,也就是該文件被上傳到的那臺(tái)Storageserver。這樣的做法不僅避免了文件同步延遲的問題,而且有效地避免了在多臺(tái)Storageserver上更新同一文件可能引起的時(shí)序錯(cuò)亂的問題。那么文件下載是如何解決文件同步延遲這個(gè)問題的呢?要回答這個(gè)問題,需要先了解文件名中包含了什么樣的信息。Storageserver生成的文件名中,包含了源Storageserver的IP地址和文件創(chuàng)建時(shí)間等字段。文件創(chuàng)建時(shí)間為UNIX時(shí)間戳,后面稱為文件時(shí)間戳。從文件名或文件ID中,可以反解出這兩個(gè)字段。然后我們?cè)賮砜匆幌拢琓rackerserver是如何準(zhǔn)確地知道一個(gè)文件已被同步到一臺(tái)Storageserver上的。前面已經(jīng)講過,文件同步采用主動(dòng)推送的方式。另外,每臺(tái)storageserver都會(huì)定時(shí)向trackerserver報(bào)告它向同組的其他storageserver同步到的文件時(shí)間戳。當(dāng)trackerserver收到一臺(tái)storageserver的文件同步報(bào)告后,它會(huì)依次找出該組內(nèi)各個(gè)storageserver(后稱作為S)被同步到的文件時(shí)間戳最小值,作為S的一個(gè)屬性記錄到內(nèi)存中。FastDFS對(duì)文件同步延遲問題的解決方案下面我們來看一下FastDFS采取的解決方法。一個(gè)最簡單的解決辦法,和文件更新一樣,優(yōu)先選擇源Storageserver下載文件即可。這可以在Trackerserver的配置文件中設(shè)置,對(duì)應(yīng)的參數(shù)名為download_server。另外一種選擇Storageserver的方法是輪流選擇(round-robin)。當(dāng)Client詢問Trackerserver有哪些Storageserver可以下載指定文件時(shí),Trackerserver返回滿足如下四個(gè)條件之一的Storageserver: 該文件上傳到的源Storageserver,文件直接上傳到該服務(wù)器上的; 文件創(chuàng)建時(shí)間戳一個(gè)文件同步完成需要的最大時(shí)間(如5分鐘); (當(dāng)前時(shí)間文件創(chuàng)建時(shí)間戳)文件同步延遲閾值,比如我們把閾值設(shè)置為1天,表示文件同步在一天內(nèi)肯定可以完成。 結(jié)束語看了上面的介紹,你是否認(rèn)為FastDFS比較簡潔高效呢?原雅虎同事一位比較資深的系統(tǒng)架構(gòu)師聽完FastDFS介紹后,作出這樣的評(píng)價(jià):“FastDFS是窮人的解決方案”。他的意思是說FastDFS把簡潔和高效做到了極致,非常節(jié)約資源,中小網(wǎng)站完全用得起,這是對(duì)FastDFS的極大認(rèn)可和褒獎(jiǎng)。FastDFS從2008年7月發(fā)布至今,已推出31個(gè)版本,后續(xù)完善和優(yōu)化工作正在持續(xù)進(jìn)行中。目前已有多家公司在生產(chǎn)環(huán)境中使用FastDFS,相信通過我們的不懈努力,F(xiàn)astDFS一定會(huì)越來越好!作者簡介:余慶,現(xiàn)在淘寶網(wǎng)Java中間件團(tuán)隊(duì)從事Java基礎(chǔ)平臺(tái)研發(fā)工作,有10年互聯(lián)網(wǎng)開發(fā)和架構(gòu)經(jīng)歷,曾擔(dān)任新浪網(wǎng)開發(fā)工程師、雅虎中國架構(gòu)師。開源分布式文件系統(tǒng)FastDFS和分布式哈希系統(tǒng)FastDHT的作者,對(duì)分布式數(shù)據(jù)存儲(chǔ)架構(gòu)有比較深入的研究。FastDFS同步機(jī)制在FastDFS的服務(wù)器端配置文件中,bind_addr這個(gè)參數(shù)用于需要綁定本機(jī)IP地址的場(chǎng)合。只有這個(gè)參數(shù)和主機(jī)特征相關(guān),其余參數(shù)都是可以統(tǒng)一配置的。在不需要綁定本機(jī)的情況下,為了便于管理和維護(hù),建議所有tracker server的配置文件相同,同組內(nèi)的所有storage server的配置文件相同。tracker server的配置文件中沒有出現(xiàn)storage server,而storage server的配置文件中會(huì)列舉出所有的tracker server。這就決定了storage server和tracker server之間的連接由storage server主動(dòng)發(fā)起,storage server為每個(gè)tracker server啟動(dòng)一個(gè)線程進(jìn)行連接和通訊,這部分的通信協(xié)議請(qǐng)參閱FastDFS HOWTO - Protocol中的“2. storage server to tracker server command”。tracker server會(huì)在內(nèi)存中保存storage分組及各個(gè)組下的storage server,并將連接過自己的storage server及其分組保存到文件中,以便下次重啟服務(wù)時(shí)能直接從本地磁盤中獲得storage相關(guān)信息。storage server會(huì)在內(nèi)存中記錄本組的所有服務(wù)器,并將服務(wù)器信息記錄到文件中。tracker server和storage server之間相互同步storage server列表:1. 如果一個(gè)組內(nèi)增加了新的storage server或者storage server的狀態(tài)發(fā)生了改變,tracker server都會(huì)將storage server列表同步給該組內(nèi)的所有storage server。以新增storage server為例,因?yàn)樾录尤氲膕torage server主動(dòng)連接tracker server,tracker server發(fā)現(xiàn)有新的storage server加入,就會(huì)將該組內(nèi)所有的storage server返回給新加入的storage server,并重新將該組的storage server列表返回給該組內(nèi)的其他storage server;2. 如果新增加一臺(tái)tracker server,storage server連接該tracker server,發(fā)現(xiàn)該tracker server返回的本組storage server列表比本機(jī)記錄的要少,就會(huì)將該tracker server上沒有的storage server同步給該tracker server。同一組內(nèi)的storage server之間是對(duì)等的,文件上傳、刪除等操作可以在任意一臺(tái)storage server上進(jìn)行。文件同步只在同組內(nèi)的storage server之間進(jìn)行,采用push方式,即源服務(wù)器同步給目標(biāo)服務(wù)器。以文件上傳為例,假設(shè)一個(gè)組內(nèi)有3臺(tái)storage server A、B和C,文件F上傳到服務(wù)器B,由B將文件F同步到其余的兩臺(tái)服務(wù)器A和C。我們不妨把文件F上傳到服務(wù)器B的操作為源頭操作,在服務(wù)器B上的F文件為源頭數(shù)據(jù);文件F被同步到服務(wù)器A和C的操作為備份操作,在A和C上的F文件為備份數(shù)據(jù)。同步規(guī)則總結(jié)如下:1. 只在本組內(nèi)的storage server之間進(jìn)行同步;2. 源頭數(shù)據(jù)才需要同步,備份數(shù)據(jù)不需要再次同步,否則就構(gòu)成環(huán)路了;3. 上述第二條規(guī)則有個(gè)例外,就是新增加一臺(tái)storage server時(shí),由已有的一臺(tái)storage server將已有的所有數(shù)據(jù)(包括源頭數(shù)據(jù)和備份數(shù)據(jù))同步給該新增服務(wù)器。storage server有7個(gè)狀態(tài),如下:# FDFS_STORAGE_STATUS_INIT :初始化,尚未得到同步已有數(shù)據(jù)的源服務(wù)器# FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有數(shù)據(jù)的源服務(wù)器# FDFS_STORAGE_STATUS_SYNCING :同步中# FDFS_STORAGE_STATUS_DELETED :已刪除,該服務(wù)器從本組中摘除(注:本狀態(tài)的功能尚未實(shí)現(xiàn))# FDFS_STORAGE_STATUS_OFFLINE :離線# FDFS_STORAGE_STATUS_ONLINE :在線,尚不能提供服務(wù)# FDFS_STORAGE_STATUS_ACTIVE :在線,可以提供服務(wù)當(dāng)storage server的狀態(tài)為FDFS_STORAGE_STATUS_ONLINE時(shí),當(dāng)該storage server向tracker server發(fā)起一次heart beat時(shí),tracker server將其狀態(tài)更改為FDFS_STORAGE_STATUS_ACTIVE。組內(nèi)新增加一臺(tái)storage server A時(shí),由系統(tǒng)自動(dòng)完成已有數(shù)據(jù)同步,處理邏輯如下:1. storage server A連接tracker server,tracker server將storage server A的狀態(tài)設(shè)置為FDFS_STORAGE_STATUS_INIT。storage server A詢問追加同步的源服務(wù)器和追加同步截至?xí)r間點(diǎn),如果該組內(nèi)只有storage server A或該組內(nèi)已成功上傳的文件數(shù)為0,則沒有數(shù)據(jù)需要同步,storage server A就可以提供在線服務(wù),此時(shí)tracker將其狀態(tài)設(shè)置為FDFS_STORAGE_STATUS_ONLINE,否則tracker server將其狀態(tài)設(shè)置為FDFS_STORAGE_STATUS_WAIT_SYNC,進(jìn)入第二步的處理;2. 假設(shè)tracker server分配向storage server A同步已有數(shù)據(jù)的源storage server為B。同組的storage server和tracker server通訊得知新增了storage server A,將啟動(dòng)同步線程,并向tracker server詢問向storage server A追加同步的源服務(wù)器和截至?xí)r間點(diǎn)。storage server B將把截至?xí)r間點(diǎn)之前的所有數(shù)據(jù)同步給storage server A;而其余的storage server從截至?xí)r間點(diǎn)之后進(jìn)行正常同步,只把源頭數(shù)據(jù)同步給storage server A。到了截至?xí)r間點(diǎn)之后,storage server B對(duì)storage server A的同步將由追加同步切換為正常同步,只同步源頭數(shù)據(jù);3. storage server B向storage server A同步完所有數(shù)據(jù),暫時(shí)沒有數(shù)據(jù)要同步時(shí),storage server B請(qǐng)求tracker server將storage server A的狀態(tài)設(shè)置為FDFS_STORAGE_STATUS_ONLINE;4 當(dāng)storage server A向tracker server發(fā)起heart beat時(shí),tracker server將其狀態(tài)更改為FDFS_STORAGE_STATUS_ACTIVE。FastDFS通過HTTP下載
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工會(huì)活動(dòng)猜明星活動(dòng)方案
- 就業(yè)人員專項(xiàng)活動(dòng)方案
- 工行余額提現(xiàn)活動(dòng)方案
- 盡孝揚(yáng)善活動(dòng)方案
- 小班放學(xué)整隊(duì)活動(dòng)方案
- 少兒閱讀創(chuàng)新活動(dòng)方案
- 少先隊(duì)衛(wèi)生月活動(dòng)方案
- 居委盆栽活動(dòng)方案
- 工匠精神系列活動(dòng)方案
- 工程公司黨建活動(dòng)方案
- JG 121-2000施工升降機(jī)齒輪錐鼓形漸進(jìn)式防墜安全器
- 2025山西大地環(huán)境投資控股有限公司校園招聘13人筆試參考題庫附帶答案詳解
- 綠色智能建造概論 課件全套 第1-7章 緒論- 建筑綠色智能運(yùn)維
- 江蘇省揚(yáng)州市江都區(qū)城區(qū)2025屆八年級(jí)物理第二學(xué)期期末聯(lián)考試題含解析
- 水庫管理制度
- 《防爆安全管理》課件
- 【課件】2024年全國I、II卷新高考讀后續(xù)寫+課件-2025屆高三英語一輪復(fù)習(xí)
- 醫(yī)保村醫(yī)政策培訓(xùn)
- 郵政社招筆試考試歷年真題及答案
- 《結(jié)締組織病本》課件
- 2025屆四川省綿陽高三下學(xué)期英語模擬檢測(cè)試卷(一模)含答案
評(píng)論
0/150
提交評(píng)論