consul consul的鎖應用

2021-10-06 23:09:40 字數 1687 閱讀 9980

在建設資料庫高可用的時候,採用了consul的機制實現,在開發相關元件的時候,使用了consul的鎖機制。但是由於使用的不正確,帶來了一些問題,下面主要介紹我的使用場景及使用方式,出現的問題,以及正確的使用方法。

在進行資料庫高可用的選舉元件設計時,考慮使用consul的鎖來進行consul-server的選舉,誰先獲取到鎖,誰就成為consul-server的leader,由leader實施資料庫選主。

元件開發選用python進行開發,consul驅動使用的是python的consul驅動:【

驅動對於consul的相關操作基本與consul提供的api功能保持一致。

設計中每一套高可用服務都有乙個鎖k-v,選舉動作觸發的時候,所有consul-server都會嘗試對這個鎖k-v加鎖,繫結自己的session id,完成選主動作後,再釋放鎖,即:

import consul

lock_key =

consul_cli = consul.consul(

)sid = consul_cli.session.create(

)lock_flag = consul_cli.kv.put(lock_key,

"test1-acquire"

, acquire=sid)

"""選舉...

"""consul_cli.session.destroy(sid)

當高可用服務中,假設架構為

a:主b:從1

c:從2

連續兩個節點a、b故障,此時應該由a切換到b,然後由b切換到c。

但是實際發生的時候,由a切換到b,但是b無法切換到c。

根據分析和測試,發現consul的鎖有兩個點沒注意到:

1、consul的鎖在非正常釋放的時候,會根據session的lock_delay引數進行解鎖延遲,這個lock_delay預設是15s。

2、通過destroy session的方式釋放鎖是非正常的鎖釋放,需要通過release操作才是正確的鎖釋放。

根據這兩個點,基本上能確定,為什麼a切換到b後,無法切換到c。

主要是a、b連續故障,選舉間隔在15s內,而程式是通過destroy session來釋放鎖,會有15s的鎖釋放延遲,導致b故障的時候consul-server無法獲取到鎖,從而無法進行選主,也就無法切換到c節點了。

根據以上兩點,做了兩點調整

1、通過release方式釋放鎖,使得鎖能夠正確釋放;

2、將lock_delay調成2s,避免非正常釋放鎖的情況下其他consul-server無法獲取到鎖,從而無法選舉出正確的主節點;

demo

import consul

lock_key =

consul_cli = consul.consul(

)sid = consul_cli.session.create(lock_delay=2)

lock_flag = consul_cli.kv.put(lock_key,

"test1-acquire"

, acquire=sid)

"""選舉...

"""lock_flag = consul_cli.kv.put(lock_key,

"test1-release"

, release=sid)

consul_cli.session.destroy(sid)

MySQL行鎖 表鎖 悲觀鎖 樂觀鎖的特點與應用

轉至 我們在運算元據庫的時候,可能會由於併發問題而引起的資料的不一致性 資料衝突 如何保證資料併發訪問的一致性 有效性,是所有資料庫必須解決的乙個問題,鎖的衝突也是影響資料庫併發訪問效能的乙個重要因素,從這一角度來說,鎖對於資料庫而言就顯得尤為重要。mysql鎖概述 相對其他資料庫而言,mysql的...

飛天軟體鎖Rockey1在軟體產品中的應用

飛天rockey1是免驅的,插上usb口就能用,非常方便,一般情況下免驅的鎖容易被破解,若真的到了別人破解自己軟體鎖的那一天,也就很成功了,所以rockey1對於一般軟體產品應用已經足夠了。1 rockey1的預設產品pid為8個f,使用者密碼userpin為16個f,開發商密碼sopin為16個f...

鎖 mysql Mysql的鎖(S鎖和X鎖的區別)

共享鎖和排它鎖 mysql的鎖系統 shared lock 和 exclusive lock 共享鎖和排它鎖,也叫讀鎖和寫鎖,即read lock和write lock 讀鎖是共享的,或者說是相互不阻塞的 寫鎖是排他的,乙個寫鎖會阻塞其他的寫鎖和讀鎖 在實際的資料庫系統中,每時每刻都發生鎖定,當某個...