日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

高可用是指系統(tǒng)無中斷的執(zhí)行功能的能力,代表了系統(tǒng)的可用程度,是進行系統(tǒng)設(shè)計時必須要遵守的準(zhǔn)則之一。 而高可用的實現(xiàn)方案,無外乎就是冗余,就存儲的高可用而言,問題不在于如何進行數(shù)據(jù)備份,而在于如何規(guī)避數(shù)據(jù)不一致對業(yè)務(wù)造成的影響。 對于分布式系統(tǒng)而言,要保證分布式系統(tǒng)中的數(shù)據(jù)一致性就需要一種方案,可以保證數(shù)據(jù)在子系統(tǒng)中始終保持一致,避免業(yè)務(wù)出現(xiàn)問題。 這種實現(xiàn)方案就叫做分布式事務(wù),要么一起成功,要么一起失敗,必須是一個整體性的事務(wù)。

1、理論基礎(chǔ)

1.1 CAP

CAP,Consistency Availability Partition tolerance 的簡寫:

Consistency:一致性,對某個客戶端來說,讀操作能夠返回最新的寫操作結(jié)果。 Availability:可用性,非故障節(jié)點在合理的時間內(nèi)返回合理的響應(yīng)。 Partition tolerance:分區(qū)容錯性,分布式系統(tǒng)中系統(tǒng)肯定部署在多臺機器上,無法保證網(wǎng)絡(luò)做到 100% 的可靠,所以網(wǎng)絡(luò)分區(qū)一定存在,即 P 一定存在。

在出現(xiàn)網(wǎng)絡(luò)分區(qū)后,就出現(xiàn)了可用性和一致性的問題,我們必須要在這兩者之間進行取舍,因此就有了兩種架構(gòu):

  • CP 架構(gòu)
  • AP 架構(gòu)

1.2 BASE理論

BASE 理論指的是基本可用 Basically Available,軟狀態(tài) Soft State,最終一致性 Eventual Consistency,核心思想是即便無法做到強一致性,但應(yīng)該采用適合的方式保證最終一致性。

BASE,Basically Available Soft State Eventual Consistency 的簡寫: BA:Basically Available 基本可用,分布式系統(tǒng)在出現(xiàn)故障的時候,允許損失部分可用性,即保證核心可用。 S:Soft State 軟狀態(tài),允許系統(tǒng)存在中間狀態(tài),而該中間狀態(tài)不會影響系統(tǒng)整體可用性。 E:Consistency 最終一致性,系統(tǒng)中的所有數(shù)據(jù)副本經(jīng)過一定時間后,最終能夠達到一致的狀態(tài)。

BASE 理論本質(zhì)上是對 CAP 理論的延伸,是對 CAP 中 AP 方案的一個補充。

2、分布式事務(wù)協(xié)議

2.1 二階段提交協(xié)議:2PC

2.1.1 概述

二階段提交(Two-phase Commit),是指,為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點在進行事務(wù)提交時保持一致性而設(shè)計的一種算法(Algorithm)。通常,二階段提交也被稱為是一種協(xié)議(Protocol)。

在分布式系統(tǒng)中,每個節(jié)點雖然可以知曉自己的操作是成功或者失敗,卻無法知道其他節(jié)點的操作是成功或失敗。

當(dāng)一個事務(wù)跨越多個節(jié)點時,為了保持事務(wù)的 ACID 特性,需要引入一個作為協(xié)調(diào)者的組件來統(tǒng)一掌控所有節(jié)點(稱作參與者)的操作結(jié)果并最終指示這些節(jié)點是否要把操作結(jié)果進行真正的提交(比如將更新后的數(shù)據(jù)寫入磁盤等等)。

因此,二階段提交的算法思路可以概括為:參與者將操作成敗通知協(xié)調(diào)者,再由協(xié)調(diào)者根據(jù)所有參與者的反饋情報決定各參與者是否要提交操作還是中止操作。

2.1.2 二階段提交過程
  • 投票階段
分布式系統(tǒng)原理

 

image.png

投票階段執(zhí)行流程:

  1. 協(xié)調(diào)者向所有參與者詢問是否可以執(zhí)行提交操作,并開始等待各參與者的響應(yīng)。
  2. 參與者執(zhí)行事務(wù)操作,如果執(zhí)行成功就返回 Yes 響應(yīng),如果執(zhí)行失敗就返回 No 響應(yīng)。
  3. 如果協(xié)調(diào)者接受參與者響應(yīng)超時,也會認(rèn)為執(zhí)行事務(wù)操作失敗。
  • 提交階段
分布式系統(tǒng)原理

 

image.png

提交階段執(zhí)行流程:

  1. 如果第一階段匯總所有參與者都返回 Yes 響應(yīng),協(xié)調(diào)者向所有參與者發(fā)出提交請求,所有參與者提交事務(wù)。
  2. 如果第一階段中有一個或者多個參與者返回 No 響應(yīng),協(xié)調(diào)者向所有參與者發(fā)出回滾請求,所有參與者進行回滾操作。
2.1.3 優(yōu)缺點
  • 優(yōu)點 盡量保證了數(shù)據(jù)的強一致,但不是 100% 一致
  • 缺點 單點故障,由于協(xié)調(diào)者的重要性,一旦協(xié)調(diào)者發(fā)生故障,參與者會一直阻塞,尤其是在第二階段,協(xié)調(diào)者發(fā)生故障,那么所有的參與者都處于鎖定事務(wù)資源的狀態(tài)中,而無法繼續(xù)完成事務(wù)操作。 同步阻塞,由于所有節(jié)點在執(zhí)行操作時都是同步阻塞的,當(dāng)參與者占有公共資源時,其他第三方節(jié)點訪問公共資源不得不處于阻塞狀態(tài)。 數(shù)據(jù)不一致,在第二階段中,當(dāng)協(xié)調(diào)者向參與者發(fā)送提交事務(wù)請求之后,發(fā)生了局部網(wǎng)絡(luò)異常或者在發(fā)送提交事務(wù)請求過程中協(xié)調(diào)者發(fā)生了故障,這會導(dǎo)致只有一部分參與者接收到了提交事務(wù)請求。
    而在這部分參與者接到提交事務(wù)請求之后就會執(zhí)行提交事務(wù)操作。但是其他部分未接收到提交事務(wù)請求的參與者則無法提交事務(wù)。從而導(dǎo)致分布式系統(tǒng)中的數(shù)據(jù)不一致。

2.2 三階段提交協(xié)議:3PC

2.2.1 概述

三階段提交(Three-phase commit),是為解決兩階段提交協(xié)議的缺點而設(shè)計的。與兩階段提交不同的是,三階段提交是“非阻塞”協(xié)議。

三階段提交在兩階段提交的第一階段與第二階段之間插入了一個準(zhǔn)備階段,使得原先在兩階段提交中,參與者在投票之后,由于協(xié)調(diào)者發(fā)生崩潰或錯誤,而導(dǎo)致參與者處于無法知曉是否提交或者中止的“不確定狀態(tài)”所產(chǎn)生的可能相當(dāng)長的延時的問題得以解決。

2.2.2 三階段提交過程
分布式系統(tǒng)原理

 

image.png

詢問階段:CanCommit 協(xié)調(diào)者向參與者發(fā)送 Commit 請求,參與者如果可以提交就返回 Yes 響應(yīng),否則返回 No 響應(yīng)。

準(zhǔn)備階段:PreCommit 協(xié)調(diào)者根據(jù)參與者在詢問階段的響應(yīng)判斷是否執(zhí)行事務(wù)還是終端事務(wù): 如果所有參與者都返回 Yes,則執(zhí)行事務(wù)。 如果參與者有一個或多個參與者返回 No 或者超時,則中斷事務(wù)。 參與者執(zhí)行完操作之后返回 ACK 響應(yīng),同時開始等待最終指令

提交階段:DoCommit 協(xié)調(diào)者根據(jù)參與者在準(zhǔn)備階段的響應(yīng)判斷是否執(zhí)行事務(wù)還是中斷事務(wù): 如果所有參與者都返回正確的 ACK 響應(yīng),則提交事務(wù)。 如果參與者有一個或多個參與者收到錯誤的 ACK 響應(yīng)或者超時,則中斷事務(wù)。 如果參與者無法及時接收到來自協(xié)調(diào)者的提交或者中斷事務(wù)請求時,會在等待超時之后,會繼續(xù)進行事務(wù)提交。 協(xié)調(diào)者收到所有參與者的 ACK 響應(yīng),完成事務(wù)。

2.2.3 解決二階段提交時的問題:

三階段提交解決了二階段提交中存在的由于協(xié)調(diào)者和參與者同時掛掉可能導(dǎo)致的數(shù)據(jù)一致性問題和單點故障問題,并減少阻塞。 因為一旦參與者無法及時收到來自協(xié)調(diào)者的信息之后,他會默認(rèn)執(zhí)行提交事務(wù)(三階段),而不會一直持有事務(wù)資源并處于阻塞狀態(tài)(二階段會)。

2.2.4 三階段提交的問題:

在提交階段如果發(fā)送的是中斷事務(wù)請求,但是由于網(wǎng)絡(luò)問題,導(dǎo)致部分參與者沒有接到請求。
那么參與者會在等待超時之后執(zhí)行提交事務(wù)操作,這樣這些由于網(wǎng)絡(luò)問題導(dǎo)致提交事務(wù)的參與者的數(shù)據(jù)就與接受到中斷事務(wù)請求的參與者存在數(shù)據(jù)不一致的問題。

所以無論是 2PC 還是 3PC 都不能保證分布式系統(tǒng)中的數(shù)據(jù) 100% 一致。

2.3 ZAB——zookeeper 原子廣播協(xié)議

2.3.1 概述

ZAB 協(xié)議全稱是Zookeeper Atomic Broadcast,是為分布式協(xié)調(diào)服務(wù) Zookeeper 專門設(shè)計的一種支持 崩潰恢復(fù) 和 原子廣播 協(xié)議。 ZAB 協(xié)議滿足CP,在選舉過程中,是不能對外提供服務(wù)的。

2.3.3 消息廣播

ZAB 協(xié)議的消息廣播過程(即數(shù)據(jù)同步過程)使用的是一個原子廣播協(xié)議,類似一個 二階段提交過程。對于客戶端發(fā)送的寫請求,全部由 Leader 接收,Leader 將請求封裝成一個事務(wù) Proposal,將其發(fā)送給所有 Follwer ,然后,根據(jù)所有 Follwer 的反饋,如果超過半數(shù)成功響應(yīng),則執(zhí)行 commit 操作(先提交自己,再發(fā)送 commit 給所有 Follwer)。

廣播流程

分布式系統(tǒng)原理

 

image.png

  • 客戶端發(fā)起一個寫操作請求。
  • Leader 服務(wù)器將客戶端的請求轉(zhuǎn)化為事務(wù) Proposal 提案,同時為每個 Proposal 分配一個全局的ID,即zxid。然后將需要廣播的Proposal 依次放到隊列中,并且根據(jù) FIFO 策略進行消息發(fā)送。
  • Follower 接收到 Proposal 后,會首先將其以事務(wù)日志的方式寫入本地磁盤中,寫入成功后向 Leader 反饋一個 Ack 響應(yīng)消息。
  • Leader 接收到超過半數(shù)以上 Follower 的 Ack 響應(yīng)消息后,即認(rèn)為消息發(fā)送成功,可以發(fā)送 commit 消息。
  • Leader 向所有 Follower 廣播 commit 消息,同時自身也會完成事務(wù)提交。Follower 接收到 commit 消息后,會將上一條事務(wù)提交。

注意: 1、 Leader 服務(wù)器與每一個 Follower 服務(wù)器之間都維護了一個單獨的 FIFO 消息隊列進行收發(fā)消息,使用隊列消息可以做到異步解耦。 Leader 和 Follower 之間只需要往隊列中發(fā)消息即可 2、Leader 在收到客戶端請求之后,會將這個請求封裝成一個事務(wù),并給這個事務(wù)分配一個全局遞增的唯一 ID,稱為事務(wù)ID(ZXID),ZAB 協(xié)議需要保證事務(wù)的順序,因此必須將每一個事務(wù)按照 ZXID 進行先后排序然后處理 3、可以認(rèn)為這是一種簡化版本的 2PC,2PC的單點問題(Leader崩潰)這里也會遇到,ZAB是通過崩潰恢復(fù)來解決的

2.3.3 崩潰恢復(fù)

所謂崩潰恢復(fù),是指當(dāng)leader崩潰(單點故障)后,重新選舉leader并且數(shù)據(jù)保持一致性(數(shù)據(jù)同步)。

  • leader選舉:
    選舉是通過投票來的,主要分為以下幾個階段,
  1. 發(fā)起投票:首輪投票,每個節(jié)點發(fā)出一個投票,先投票給自己,然后再把投票結(jié)果廣播到集群中別的節(jié)點,其他機器。投票內(nèi)容包含節(jié)點的myid(zookeeper安裝時要設(shè)置的值,表示當(dāng)前節(jié)點id)和zxid(事務(wù)id),比如ZK1的投票為(1, 0),ZK2的投票為(2, 0)
  2. 驗證投票:每個節(jié)點都投票給自己并且廣播之后,那么節(jié)點就會收到別的節(jié)點的投票結(jié)果,在收到投票后可以驗證投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務(wù)器,
  3. 變更投票:驗證完收到的投票結(jié)果后,處理投票,針對每一個投票,服務(wù)器都需要將別人的投票和自己的投票進行比較,規(guī)則如下 · 優(yōu)先檢查ZXID。ZXID比較大的服務(wù)器優(yōu)先作為Leader; · 如果ZXID相同,那么就比較myid。myid較大的服務(wù)器作為Leader服務(wù)器; 根據(jù)以上規(guī)則變更自己的投票,然后廣播第二輪投票,還是同樣的過程,先驗證投票,然后變更投票,變更完成以后統(tǒng)計票倉(本輪投票過程中接收到的別的節(jié)點的投票信息)中,是否有超過半數(shù)的相同投票,如果有,則其就是新的leader,選舉結(jié)束;如果沒有,則繼續(xù)發(fā)起投票,知道選出leader。
分布式系統(tǒng)原理

 

image.png

由上面規(guī)則可知,通常那臺服務(wù)器上的數(shù)據(jù)越新(ZXID會越大),其成為Leader的可能性越大,也就越能夠保證數(shù)據(jù)的恢復(fù)。如果ZXID相同,則SID越大機會越大。

  • 數(shù)據(jù)同步:
    上面的leader選舉結(jié)束后,只有當(dāng)新的leader和follower同步數(shù)據(jù)之后,才能對外提供服務(wù)。
    同步分為以下幾個階段:
  1. 所有follower上報自己最后接收的事務(wù)的任期epoch(每個Proposal都包含了一個epoch值,用來代表當(dāng)前的Leader 周期);leader比較所有的任期,選取最大的epoch,加1后作為當(dāng)前的任期E=E+1,并且將任期epoch廣播給所有follower;follower將任期改為leader發(fā)過來的值之后,返回給leader當(dāng)前follewer節(jié)點上的事務(wù)隊列L;
  2. leader從隊列集合中選取任期最大的隊列,如果有多個隊列任期都是最大,則選取事務(wù)編號n最大的隊列Lmax(通常就是leader節(jié)點自己的事務(wù)隊列,因為選舉leader時,就是選出的事務(wù)zxid最大的節(jié)點),并將其廣播給各個follower,follower接收隊列替換自己的事務(wù)隊列,并且執(zhí)行隊列中的事務(wù)(執(zhí)行過跳過,未執(zhí)行執(zhí)行),執(zhí)行完以后反饋給leader 表明自己已經(jīng)完成同步(追上來了),leader 收到過半反饋后,發(fā)送commit 消息;follower 接收到commit 消息后,提交事務(wù); 至此各個節(jié)點的數(shù)據(jù)達成一致,zookeeper恢復(fù)正常服務(wù)。

注意:在zk選舉中,通過投票已經(jīng)確認(rèn)leader服務(wù)器是最大的zxid的節(jié)點了,所以同步過程沒有那么復(fù)雜。 同步階段主要是利用 Leader 前一階段獲得的最新 Proposal 歷史,同步集群中所有的副本。只有當(dāng)超過半數(shù)的節(jié)點都同步完成,準(zhǔn) Leader 才會成為真正的 Leader。Follower 只會處理 zxid 比自己 lastZxid 大的 Proposal。

3、最終一致性分布式事務(wù)方案

3.1 本地消息表

本地消息表的核心思想是將分布式事務(wù)拆分成本地事務(wù)進行處理。

例如,在訂單系統(tǒng)新增一條消息表,將新增訂單和新增消息放到一個事務(wù)里完成,然后通過輪詢的方式去查詢消息表,將消息推送到 MQ,庫存系統(tǒng)去消費 MQ。

分布式系統(tǒng)原理

 

image.png

執(zhí)行流程:
  1. 訂單系統(tǒng),添加一條訂單和一條消息,在一個事務(wù)里提交。
  2. 訂單系統(tǒng),使用定時任務(wù)輪詢查詢狀態(tài)為未同步的消息表,發(fā)送到 MQ,如果發(fā)送失敗,就重試發(fā)送。
  3. 庫存系統(tǒng),接收 MQ 消息,修改庫存表,需要保證冪等操作。
  4. 如果修改成功,調(diào)用 RPC 接口修改訂單系統(tǒng)消息表的狀態(tài)為已完成或者直接刪除這條消息。 如果修改失敗,可以不做處理,等待重試。

訂單系統(tǒng)中的消息有可能由于業(yè)務(wù)問題會一直重復(fù)發(fā)送,所以為了避免這種情況可以記錄一下發(fā)送次數(shù),當(dāng)達到次數(shù)限制之后報警,人工接入處理;庫存系統(tǒng)需要保證冪等,避免同一條消息被多次消費造成數(shù)據(jù)一致。

本地消息表這種方案實現(xiàn)了最終一致性,需要在業(yè)務(wù)系統(tǒng)里增加消息表,業(yè)務(wù)邏輯中多一次插入的 DB 操作,所以性能會有損耗,而且最終一致性的間隔主要由定時任務(wù)的間隔時間決定。

3.2 MQ 消息事務(wù)

消息事務(wù)的原理是將兩個事務(wù)通過消息中間件進行異步解耦。

分布式系統(tǒng)原理

 

image.png

從上面可以看出,消息事務(wù)一定要保證業(yè)務(wù)操作與消息發(fā)送的一致性,如果業(yè)務(wù)操作成功,這條消息也一定投遞成功。

消息事務(wù)依賴于消息中間件的事務(wù)消息,基于消息中間件第二階段提交實現(xiàn)的,RocketMQ 就支持事務(wù)消息。RabbitMQ也支持事務(wù)消息

執(zhí)行流程:
  1. 發(fā)送 Prepare 消息到消息中間件。
  2. 發(fā)送成功后,執(zhí)行本地事務(wù)。
  3. 如果事務(wù)執(zhí)行成功,則 Commit,消息中間件將消息下發(fā)至消費端。
  4. 如果事務(wù)執(zhí)行失敗,則回滾,消息中間件將這條 Prepare 消息刪除。
  5. 消費端接收到消息進行消費,如果消費失敗,則不斷重試。

這種方案也是實現(xiàn)了最終一致性,對比本地消息表實現(xiàn)方案,不需要再建消息表,不再依賴本地數(shù)據(jù)庫事務(wù)了,所以這種方案更適用于高并發(fā)的場景。

3.3 最大努力通知

最大努力通知相比前兩種方案實現(xiàn)簡單,適用于一些最終一致性要求較低的業(yè)務(wù),比如支付通知,短信通知這種業(yè)務(wù)。 以支付通知為例,業(yè)務(wù)系統(tǒng)調(diào)用支付平臺進行支付,支付平臺進行支付,進行操作支付之后支付平臺會盡量去通知業(yè)務(wù)系統(tǒng)支付操作是否成功,但是會有一個最大通知次數(shù)。 如果超過這個次數(shù)后還是通知失敗,就不再通知,業(yè)務(wù)系統(tǒng)自行調(diào)用支付平臺提供一個查詢接口,供業(yè)務(wù)系統(tǒng)進行查詢支付操作是否成功。

分布式系統(tǒng)原理

 

image.png

執(zhí)行流程:
  1. 業(yè)務(wù)系統(tǒng)調(diào)用支付平臺支付接口, 并在本地進行記錄,支付狀態(tài)為支付中。
  2. 支付平臺進行支付操作之后,無論成功還是失敗,都需要給業(yè)務(wù)系統(tǒng)一個結(jié)果通知。
  3. 如果通知一直失敗則根據(jù)重試規(guī)則進行重試,達到最大通知次數(shù)后,不再通知。
  4. 支付平臺提供查詢訂單支付操作結(jié)果接口。
  5. 業(yè)務(wù)系統(tǒng)根據(jù)一定業(yè)務(wù)規(guī)則去支付平臺查詢支付結(jié)果。

這種方案也是實現(xiàn)了最終一致性。

3.4 補償事務(wù) TCC

TCC,Try-Confirm-Cancel 的簡稱,針對每個操作,都需要有一個其對應(yīng)的確認(rèn)和取消操作。 當(dāng)操作成功時調(diào)用確認(rèn)操作,當(dāng)操作失敗時調(diào)用取消操作,類似于二階段提交,只不過是這里的提交和回滾是針對業(yè)務(wù)上的,所以基于 TCC 實現(xiàn)的分布式事務(wù)也可以看做是對業(yè)務(wù)的一種補償機制。

3.4.1 TCC 第三個階段:
  • Try 階段:對業(yè)務(wù)系統(tǒng)做檢測及資源預(yù)留、凍結(jié)。
  • Confirm 階段:對業(yè)務(wù)系統(tǒng)做確認(rèn)提交,Try 階段執(zhí)行成功并開始執(zhí)行 Confirm 階段時,默認(rèn) Confirm 階段是不會出錯的。即:只要 Try 成功,Confirm 一定成功。
  • Cancel 階段:在業(yè)務(wù)執(zhí)行錯誤,需要回滾的狀態(tài)下執(zhí)行的業(yè)務(wù)取消,預(yù)留資源釋放。

在 Try 階段,是對業(yè)務(wù)系統(tǒng)進行檢查及資源預(yù)覽,比如訂單和存儲操作,需要檢查庫存剩余數(shù)量是否夠用,并進行預(yù)留,預(yù)留操作的話就是新建一個可用庫存數(shù)量字段,Try 階段操作是對這個可用庫存數(shù)量進行操作。

3.4.2 TCC執(zhí)行流程:

步驟一(Try 階段):訂單系統(tǒng)將當(dāng)前訂單狀態(tài)設(shè)置為支付中,庫存系統(tǒng)校驗當(dāng)前剩余庫存數(shù)量是否大于 2,然后將可用庫存數(shù)量設(shè)置為庫存剩余數(shù)量 -2,并且設(shè)置凍結(jié)庫存為2

  • image.png

步驟二(Confirm 階段):如果 Try 階段執(zhí)行成功,執(zhí)行 Confirm 階段,將訂單狀態(tài)修改為支付成功,庫存剩余數(shù)量修改為可用庫存數(shù)量。

  • image.png

步驟三(Cancel 階段):如果 Try 階段執(zhí)行失敗,執(zhí)行 Cancel 階段,將訂單狀態(tài)修改為支付失敗,可用庫存數(shù)量修改為庫存剩余數(shù)量。

  • image.png
分布式系統(tǒng)原理

 

image.png

3.4.3 基于 TCC 實現(xiàn)的分布式事務(wù)框架:

ByteTCC,github.com/liuyangming tcc-transaction:github.com/changmingxi

分享到:
標(biāo)簽:分布式 系統(tǒng)
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定