久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

Kubernetes并發(fā)控制與數(shù)據(jù)一致性的實(shí)現(xiàn)原理-創(chuàng)新互聯(lián)

在大型分布式系統(tǒng)中,定會(huì)存在大量并發(fā)寫(xiě)入的場(chǎng)景。在這種場(chǎng)景下如何進(jìn)行更好的并發(fā)控制,即在多個(gè)任務(wù)同時(shí)存取數(shù)據(jù)時(shí)保證數(shù)據(jù)的一致性,成為分布式系統(tǒng)必須解決的問(wèn)題。
悲觀并發(fā)控制和樂(lè)觀并發(fā)控制是并發(fā)控制中采用的主要技術(shù)手段,對(duì)于不同的業(yè)務(wù)場(chǎng)景,應(yīng)該選擇不同的控制方法。
悲觀鎖
悲觀并發(fā)控制(又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫(xiě)“PCC”)是一種并發(fā)控制的方法。它可以阻止一個(gè)事務(wù)以影響其他用戶的方式來(lái)修改數(shù)據(jù)。如果一個(gè)事務(wù)執(zhí)行的操作讀某行數(shù)據(jù)應(yīng)用了鎖,那只有當(dāng)這個(gè)事務(wù)把鎖釋放,其他事務(wù)才能夠執(zhí)行與該鎖沖突的操作。
在悲觀鎖的場(chǎng)景下,假設(shè)用戶A和B要修改同一個(gè)文件,A在鎖定文件并且修改的過(guò)程中,B是無(wú)法修改這個(gè)文件的,只有等到A修改完成,并且釋放鎖以后,B才可以獲取鎖,然后修改文件。由此可以看出,悲觀鎖對(duì)并發(fā)的控制持悲觀態(tài)度,它在進(jìn)行任何修改前,首先會(huì)為其加鎖,確保整個(gè)修改過(guò)程中不會(huì)出現(xiàn)沖突,從而有效的保證數(shù)據(jù)一致性。但這樣的機(jī)制同時(shí)降低了系統(tǒng)的并發(fā)性,尤其是兩個(gè)同時(shí)修改的對(duì)象本身不存在沖突的情況。同時(shí)也可能在競(jìng)爭(zhēng)鎖的時(shí)候出現(xiàn)死鎖,所以現(xiàn)在很多的系統(tǒng)例如Kubernetes采用了樂(lè)觀并發(fā)的控制方法。
樂(lè)觀鎖
樂(lè)觀并發(fā)控制(又名“樂(lè)觀鎖”,Optimistic Concurrency Control,縮寫(xiě)“OCC”)是一種并發(fā)控制的方法。它假設(shè)多用戶并發(fā)的事務(wù)在處理時(shí)不會(huì)彼此影響,各事務(wù)能夠在不請(qǐng)求鎖的情況下處理各自的數(shù)據(jù)。在提交數(shù)據(jù)更新之前,每個(gè)事務(wù)會(huì)先檢查在該事務(wù)讀取數(shù)據(jù)后,有沒(méi)有其他事務(wù)又修改了該數(shù)據(jù)。如果其他事務(wù)有更新的話,正在提交的事務(wù)會(huì)進(jìn)行回滾。
相對(duì)于悲觀鎖對(duì)鎖的提前控制,樂(lè)觀鎖相信請(qǐng)求之間出現(xiàn)沖突的概率是比較小的,在讀取及更改的過(guò)程中都是不加鎖的,只有在最后提交更新時(shí)才會(huì)檢測(cè)沖突,因此在高并發(fā)量的系統(tǒng)中占有絕對(duì)優(yōu)勢(shì)。同樣假設(shè)用戶A和B要修改同一個(gè)文件,A和B會(huì)先將文件獲取到本地,然后進(jìn)行修改。如果A已經(jīng)修改好并且將數(shù)據(jù)提交,此時(shí)B再提交,服務(wù)器端會(huì)告知B文件已經(jīng)被修改,返回沖突錯(cuò)誤。此時(shí)沖突必須由B來(lái)解決,可以將文件重新獲取回來(lái),再一次修改后提交。
樂(lè)觀鎖通常通過(guò)增加一個(gè)資源版本字段,來(lái)判斷請(qǐng)求是否沖突。初始化時(shí)指定一個(gè)版本值,每次讀取數(shù)據(jù)時(shí)將版本號(hào)一同讀出,每次更新數(shù)據(jù),同時(shí)也對(duì)版本號(hào)進(jìn)行更新。當(dāng)服務(wù)器端收到數(shù)據(jù)時(shí),將數(shù)據(jù)中的版本號(hào)與服務(wù)器端的做對(duì)比,如果不一致,則說(shuō)明數(shù)據(jù)已經(jīng)被修改,返回沖突錯(cuò)誤。
Kubernetes中的并發(fā)控制
在Kubernetes集群中,外部用戶及內(nèi)部組件頻繁的數(shù)據(jù)更新操作,導(dǎo)致系統(tǒng)的數(shù)據(jù)并發(fā)讀寫(xiě)量非常大。假設(shè)采用悲觀并行的控制方法,將嚴(yán)重?fù)p耗集群性能,因此Kubernetes采用樂(lè)觀并行的控制方法。Kubernetes通過(guò)定義資源版本字段實(shí)現(xiàn)了樂(lè)觀并發(fā)控制,資源版本(ResourceVersion)字段包含在Kubernetes對(duì)象的元數(shù)據(jù)(Metadata)中。這個(gè)字符串格式的字段標(biāo)識(shí)了對(duì)象的內(nèi)部版本號(hào),其取值來(lái)自etcd的modifiedindex,且當(dāng)對(duì)象被修改時(shí),該字段將隨之被修改。值得注意的是該字段由服務(wù)端維護(hù),不建議在客戶端進(jìn)行修改。
type ObjectMeta struct {
......
// An opaque value that represents the internal version of this object that can
// be used by clients to determine when objects have changed. May be used for optimistic
// concurrency, change detection, and the watch operation on a resource or set of resources.
// Clients must treat these values as opaque and passed unmodified back to the server.
// They may only be valid for a particular resource or set of resources.
//
// Populated by the system.
// Read-only.
// Value must be treated as opaque by clients and .
// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
// +optional
ResourceVersion string
......
}
Kube-Apiserver可以通過(guò)該字段判斷對(duì)象是否已經(jīng)被修改。當(dāng)包含ResourceVersion的更新請(qǐng)求到達(dá)Apiserver,服務(wù)器端將對(duì)比請(qǐng)求數(shù)據(jù)與服務(wù)器中數(shù)據(jù)的資源版本號(hào),如果不一致,則表明在本次更新提交時(shí),服務(wù)端對(duì)象已被修改,此時(shí)Apiserver將返回沖突錯(cuò)誤(409),客戶端需重新獲取服務(wù)端數(shù)據(jù),重新修改后再次提交到服務(wù)器端。上述并行控制方法可防止如下的data race:
Client #1: GET Foo
Client #2: GET Foo
Client #1: Set Foo.Bar = "one"
Client #1: PUT Foo
Client #2: Set Foo.Baz = "two"
Client #2: PUT Foo
當(dāng)未采用并發(fā)控制時(shí),假設(shè)發(fā)生如上請(qǐng)求序列,兩個(gè)客戶端同時(shí)從服務(wù)端獲取同一對(duì)象Foo(含有Bar、Baz兩個(gè)字段),Client#1先將Bar字段置成one,其后Client#2對(duì)Baz字段賦值的更新請(qǐng)求到服務(wù)端時(shí),將覆蓋Client#1對(duì)Bar的修改。反之在對(duì)象中添加資源版本字段,同樣的請(qǐng)求序列將如下:
Client #1: GET Foo //初始Foo.ResourceVersion=1
Client #2: GET Foo //初始Foo.ResourceVersion=1
Client #1: Set Foo.Bar = "one"
Client #1: PUT Foo //更新Foo.ResourceVersion=2
Client #2: Set Foo.Baz = "two"
Client #2: PUT Foo //返回409沖突
Client#1更新對(duì)象后資源版本號(hào)將改變,Client#2在更新提交時(shí)將返回沖突錯(cuò)誤(409),此時(shí)Client#2必須在本地重新獲取數(shù)據(jù),更新后再提交到服務(wù)端。
假設(shè)更新請(qǐng)求的對(duì)象中未設(shè)置ResourceVersion值,Kubernetes將會(huì)根據(jù)硬改寫(xiě)策略(可配置)決定是否進(jìn)行硬更新。如果配置為可硬改寫(xiě),則數(shù)據(jù)將直接更新并存入Etcd,反之則返回錯(cuò)誤,提示用戶必須指定ResourceVersion。
Kubernetes中的Update和Patch
Kubernetes實(shí)現(xiàn)了Update和Patch兩個(gè)對(duì)象更新的方法,兩者提供不同的更新操作方式,但沖突判斷機(jī)制是相同的。
Update
對(duì)于Update,客戶端更新請(qǐng)求中包含的是整個(gè)obj對(duì)象,服務(wù)器端將對(duì)比該請(qǐng)求中的obj對(duì)象和服務(wù)器端最新obj對(duì)象的ResourceVersion值。如果相等,則表明未發(fā)生沖突,將成功更新整個(gè)對(duì)象。反之若不相等則返回409沖突錯(cuò)誤,Kube-Apiserver中沖突判斷的代碼片段如下。
e.Storage.GuaranteedUpdate(ctx, key...) (runtime.Object, *uint64, error) {
// If AllowUnconditionalUpdate() is true and the object specified by
// the user does not have a resource version, then we populate it with
// the latest version. Else, we check that the version specified by
// the user matches the version of latest storage object.
resourceVersion, err := e.Storage.Versioner().ObjectResourceVersion(obj)
if err != nil {
return nil, nil, err
}
version, err := e.Storage.Versioner().ObjectResourceVersion(existing)
doUnconditionalUpdate := resourceVersion == 0 && e.UpdateStrategy.AllowUnconditionalUpdate()
if doUnconditionalUpdate {
// Update the object's resource version to match the latest
// storage object's resource version.
err = e.Storage.Versioner().UpdateObject(obj, res.ResourceVersion)
if err != nil {
return nil, nil, err
}
} else {
// Check if the object's resource version matches the latest
// resource version.
......
if resourceVersion != version {
return nil, nil, kubeerr.NewConflict(qualifiedResource, name, fmt.Errorf(OptimisticLockErrorMsg))
}
}
......
return out, creating, nil
}
基本流程為:

創(chuàng)新互聯(lián)主營(yíng)順德網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā)公司,順德h5成都微信小程序搭建,順德網(wǎng)站營(yíng)銷(xiāo)推廣歡迎順德等地區(qū)企業(yè)咨詢
  1. 獲取當(dāng)前更新請(qǐng)求中obj對(duì)象的ResourceVersion值,及服務(wù)器端最新obj對(duì)象(existing)的ResourceVersion值
  2. 如果當(dāng)前更新請(qǐng)求中obj對(duì)象的ResourceVersion值等于0,即客戶端未設(shè)置該值,則判斷是否要硬改寫(xiě)(AllowUnconditionalUpdate),如配置為硬改寫(xiě)策略,將直接更新obj對(duì)象
  3. 如果當(dāng)前更新請(qǐng)求中obj對(duì)象的ResourceVersion值不等于0,則判斷兩個(gè)ResourceVersion值是否一致,不一致返回沖突錯(cuò)誤(OptimisticLockErrorMsg)
    Patch
    相比Update請(qǐng)求包含整個(gè)obj對(duì)象,Patch請(qǐng)求實(shí)現(xiàn)了更細(xì)粒度的對(duì)象更新操作,其請(qǐng)求中只包含需要更新的字段。例如要更新pod中container的鏡像,可使用如下命令:
    kubectl patch pod my-pod -p '{"spec":{"containers":[{"name":"my-container","image":"new-image"}]}}'
    服務(wù)器端只收到以上的patch信息,然后通過(guò)如下代碼將該patch更新到Etcd中。
    func (p *patcher) patchResource(ctx context.Context) (runtime.Object, error) {
    p.namespace = request.NamespaceValue(ctx)
    switch p.patchType {
    case types.JSONPatchType, types.MergePatchType:
    p.mechanism = &jsonPatcher{patcher: p}
    case types.StrategicMergePatchType:
    schemaReferenceObj, err := p.unsafeConvertor.ConvertToVersion(p.restPatcher.New(), p.kind.GroupVersion())
    if err != nil {
    return nil, err
    }
    p.mechanism = &smpPatcher{patcher: p, schemaReferenceObj: schemaReferenceObj}
    default:
    return nil, fmt.Errorf("%v: unimplemented patch type", p.patchType)
    }
    p.updatedObjectInfo = rest.DefaultUpdatedObjectInfo(nil, p.applyPatch, p.applyAdmission)
    return finishRequest(p.timeout, func() (runtime.Object, error) {
    updateObject, _, updateErr := p.restPatcher.Update(ctx, p.name, p.updatedObjectInfo, p.createValidation, p.updateValidation, false, p.options)
    return updateObject, updateErr
    })
    }
    基本流程為:
    1.首先判斷patch的類(lèi)型,根據(jù)類(lèi)型選擇相應(yīng)的mechanism
    2.利用DefaultUpdatedObjectInfo方法將applyPatch(應(yīng)用Patch的方法)添加到admission chain的頭部
    3.最終還是調(diào)用上述Update方法執(zhí)行更新操作
    在步驟2中將applyPatch方法掛到admission chain的頭部,與admission行為相似,applyPatch方法會(huì)將patch應(yīng)用到最新獲取的服務(wù)器端obj上,生成一個(gè)已更新的obj,再對(duì)該obj繼續(xù)執(zhí)行admission chain中的Admit與Validate。最終調(diào)用的還是update方法,因此沖突檢測(cè)的機(jī)制與上述Update方法完全一致。
    相比Update,Patch的主要優(yōu)勢(shì)在于客戶端不必提供全量的obj對(duì)象信息。客戶端只需以patch的方式提交要修改的字段信息,服務(wù)器端會(huì)將該patch數(shù)據(jù)應(yīng)用到最新獲取的obj中。省略了Client端獲取、修改再提交全量obj的步驟,降低了數(shù)據(jù)被修改的風(fēng)險(xiǎn),更大大減小了沖突概率。 由于Patch方法在傳輸效率及沖突概率上都占有絕對(duì)優(yōu)勢(shì),目前Kubernetes中幾乎所有更新操作都采用了Patch方法,我們?cè)诰帉?xiě)代碼時(shí)也應(yīng)該注意使用Patch方法。
    附:
    ResourceVersion字段在Kubernetes中除了用在上述并發(fā)控制機(jī)制外,還用在Kubernetes的list-watch機(jī)制中。Client端的list-watch分為兩個(gè)步驟,先list取回所有對(duì)象,再以增量的方式watch后續(xù)對(duì)象。Client端在list取回所有對(duì)象后,將會(huì)把最新對(duì)象的ResourceVersion作為下一步watch操作的起點(diǎn)參數(shù),也即Kube-Apiserver以收到的ResourceVersion為起始點(diǎn)返回后續(xù)數(shù)據(jù),保證了list-watch中數(shù)據(jù)的連續(xù)性與完整性。

另外有需要云服務(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ù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站欄目:Kubernetes并發(fā)控制與數(shù)據(jù)一致性的實(shí)現(xiàn)原理-創(chuàng)新互聯(lián)
本文地址:http://www.js-pz168.com/article2/cohioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航小程序開(kāi)發(fā)企業(yè)網(wǎng)站制作全網(wǎng)營(yíng)銷(xiāo)推廣動(dòng)態(tài)網(wǎng)站商城網(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)

網(wǎng)站優(yōu)化排名
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
日韩精品色哟哟| 成人晚上爱看视频| aaa欧美大片| 欧美系列一区| 在线播放亚洲一区| 18成人在线观看| 美女在线视频一区| 97人人做人人人难人人做| 午夜精品美女久久久久av福利| 欧美一卡2卡三卡4卡5免费| 中文字幕在线视频一区| 精品系列免费在线观看| 国产99在线播放| 91激情五月电影| 国产欧美精品区一区二区三区| 日韩极品在线观看| 91网站在线播放| 色婷婷香蕉在线一区二区| 久久亚洲综合色| 日韩和欧美一区二区三区| 3d动漫精品啪啪一区二区三区免费 | 国产女主播在线一区二区| 日韩精品乱码免费| 99国产高清| 欧美在线免费观看视频| 国产精品久久久久久久久晋中| 蓝色福利精品导航| 久精品国产欧美| 日韩三级中文字幕| 天堂成人国产精品一区| 91毛片在线观看| 欧美性受xxxx黑人xyx| 最新久久zyz资源站| 国产精品亚洲成人| 亚洲欧洲精品一区二区| 久久久久久久久久久久久久久99| 日本免费新一区视频| 国产精品一区二区av| 正在播放一区二区| 亚洲高清视频中文字幕| 91蝌蚪porny成人天涯| 欧美日韩一区高清| 亚洲中国最大av网站| av一区二区三区在线观看| 欧美日韩国产色站一区二区三区| 有码一区二区三区| 95精品视频在线| 欧美日韩成人一区二区| 亚洲一区二区三区美女| 国产91免费视频| 日韩欧美一卡二卡| 蜜臀av一区二区| 日韩福利二区| 中文字幕第一区综合| 国产91精品精华液一区二区三区| 色欲综合视频天天天| 亚洲欧美日韩综合aⅴ视频| jiyouzz国产精品久久| 欧美日韩精品一区视频| 午夜视频在线观看一区| 精品国产免费一区二区三区| 精品剧情v国产在线观看在线| 看片网站欧美日韩| 一区二区三区|亚洲午夜| 综合自拍亚洲综合图不卡区| 9色porny自拍视频一区二区| 欧美三级日本三级少妇99| 亚瑟在线精品视频| 久久免费看av| 中文字幕巨乱亚洲| 91在线视频观看| 日韩你懂的在线播放| 国产最新精品免费| 在线观看中文字幕不卡| 亚洲电影中文字幕在线观看| 精品一区久久| 国产精品全国免费观看高清 | 国产传媒欧美日韩| 337p粉嫩大胆噜噜噜噜噜91av| 激情综合色综合久久| 日本黄色一区二区| 日韩成人精品在线观看| 亚洲激情一区二区三区| 亚洲伦理在线精品| 精品免费二区三区三区高中清不卡| 久久精品一区八戒影视| 99精品热视频| 精品久久久久久综合日本欧美| 国产一区二区三区免费| 欧美日韩一区不卡| 精品午夜久久福利影院| 欧美私模裸体表演在线观看| 日本va欧美va精品| 色悠久久久久综合欧美99| 午夜日韩在线电影| 亚洲一卡二卡| 天天操天天综合网| 中文字幕一区二区三区最新| 偷偷要91色婷婷| 在线视频一区观看| 喷水一区二区三区| 日本精品裸体写真集在线观看 | 国产亚洲欧美一区二区| 2017欧美狠狠色| 92精品国产成人观看免费| 久久久蜜桃精品| 91视视频在线直接观看在线看网页在线看| 精品少妇一区二区三区在线视频| 国产美女av一区二区三区| 欧美一区二区三区四区高清| 国产成人亚洲综合a∨猫咪| 91精品国产综合久久精品麻豆| 国产精品1区2区3区| 欧美v日韩v国产v| av电影在线不卡| 久久精品一区八戒影视| 成人看片视频| 亚洲视频一区在线观看| 日韩动漫在线观看| 日韩精品视频网站| 欧美日韩在线免费视频| 国产jizzjizz一区二区| 26uuu成人网一区二区三区| 999热视频| 1区2区3区国产精品| 日韩一二三区不卡在线视频| 丝袜国产日韩另类美女| 一本色道**综合亚洲精品蜜桃冫| 久久精品国产一区二区三 | 中文字幕精品一区二区三区精品| 精品国产乱码久久久久久88av| 一区二区三区在线不卡| 色天天综合色天天久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩精品专区| 成人99免费视频| 国产精品久久久久久久裸模| 欧美一区2区三区4区公司二百| 日韩电影一区二区三区四区| 欧美精品在欧美一区二区少妇| 丁香一区二区三区| 亚洲国产岛国毛片在线| 欧洲精品国产| 久久疯狂做爰流白浆xx| 日韩精品专区在线影院观看| 国产伦精品一区二区三区四区视频 | 欧美三级午夜理伦三级中视频| 成人一区二区三区视频在线观看| 亚洲国产精品成人久久综合一区| 清纯唯美一区二区三区| 免费观看在线色综合| 日韩精品一区二区三区在线观看| 国产伦视频一区二区三区| 亚洲午夜羞羞片| 欧美精品日韩一本| 超碰97在线资源| 亚洲第一会所有码转帖| 在线播放中文字幕一区| 国产精品免费看一区二区三区| 亚洲线精品一区二区三区 | 品久久久久久久久久96高清| 九色综合狠狠综合久久| 久久久三级国产网站| 日本中文不卡| 国产成人综合网站| 国产精品久久毛片| 日本韩国精品一区二区在线观看| 成人免费av资源| 一区二区三区在线视频观看| 欧美老女人第四色| 国产视频一区二区三区四区| 秋霞电影一区二区| 久久综合久久综合久久综合| 日本不卡二区| 国产成人精品亚洲777人妖| 中文字幕在线不卡| 欧美在线不卡视频| 5566中文字幕一区二区| 午夜免费欧美电影| 精品国产第一区二区三区观看体验| 日本亚洲欧洲精品| 国产精品一卡二卡| 中文字幕综合网| 欧美日韩aaaaa| 韩国精品一区二区三区六区色诱| 麻豆极品一区二区三区| 欧美激情资源网| 欧美性大战久久久久久久蜜臀| a级国产乱理论片在线观看99| 三级影片在线观看欧美日韩一区二区 | 精品国偷自产国产一区| 亚洲精品美女久久7777777| 精品美女一区二区| 日韩精品欧美一区二区三区| 成人激情免费网站| 亚洲mv大片欧洲mv大片精品| 久久久五月婷婷| 在线视频国内一区二区| 国产欧美一区二区三区不卡高清| 韩国理伦片一区二区三区在线播放|