成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

?Kubernetes的演變:從etcd到分布式SQL的過渡

譯文
數(shù)據(jù)庫 SQL Server
本文探討了如何使用Kine將Kubernetes中的etcd替換為分布式SQL數(shù)據(jù)庫。

譯者 | 李睿

審校 | 重樓

DevRel領(lǐng)域?qū)<?/span>Denis Magda表示,他偶然發(fā)現(xiàn)了一篇解釋如何用PostgreSQL無縫替換etcd的文章。該文章指出,Kine項(xiàng)目作為外部etcd端點(diǎn),可以將Kubernetes etcd請(qǐng)求轉(zhuǎn)換為底層關(guān)系數(shù)據(jù)庫的SQL查詢。

受到這種方法的啟發(fā),Magda決定進(jìn)一步探索Kine的潛力,從etcd切換到Y(jié)ugabyteDBYugabyteDB是一個(gè)基于PostgreSQL構(gòu)建的分布式SQL數(shù)據(jù)庫。

etcd有什么問題?

etcd是Kubernetes用來存放所有集群數(shù)據(jù)的鍵值庫。

在Kubernetes集群遇到可擴(kuò)展性或高可用性(HA)問題之前,它通常不會(huì)引起人們的注意。以可擴(kuò)展和高可用性(HA)的方式管理etcd對(duì)于大型Kubernetes部署來說尤其具有挑戰(zhàn)性。

此外,Kubernetes社區(qū)對(duì)etcd項(xiàng)目的未來開發(fā)也有越來越多的擔(dān)憂。它的社區(qū)規(guī)模正在縮小,只有少數(shù)維護(hù)人員有興趣和能力支持和推進(jìn)這個(gè)項(xiàng)目。

這些問題催生了Kine,這是一個(gè)etcd API到SQL的轉(zhuǎn)換層。Kine正式支持SQLite、PostgreSQL和MySQL,這些系統(tǒng)的使用量正在不斷增長,并且擁有強(qiáng)大的社區(qū)。

為什么選擇分布式SQL數(shù)據(jù)庫?

雖然PostgreSQL、SQLite和MySQL是Kubernetes的理想選擇,但它們是為單一服務(wù)器部署而設(shè)計(jì)和優(yōu)化的。這意味著它們可能會(huì)帶來一些挑戰(zhàn),特別是對(duì)于具有更嚴(yán)格的可擴(kuò)展性和可用性要求的大型Kubernetes部署。

如果開發(fā)人員的Kubernetes集群要求RPO(恢復(fù)點(diǎn)目標(biāo))為零,RTO(恢復(fù)時(shí)間目標(biāo))以秒為單位測量,那么MySQL或PostgreSQL部署的架構(gòu)和維護(hù)將是一個(gè)挑戰(zhàn)。如果人們有興趣深入研究這個(gè)話題,可以探索PostgreSQL的高可用性選項(xiàng)。

分布式SQL數(shù)據(jù)庫作為一個(gè)相互連接的節(jié)點(diǎn)集群,可以跨多個(gè)機(jī)架、可用區(qū)或區(qū)域部署。通過設(shè)計(jì),它們具有高可用性和可擴(kuò)展性,因此可以為Kubernetes改進(jìn)相同的特性。

在YugabyteDB上啟動(dòng)Kine

而決定使用YugabyteDB作為Kubernetes的分布式SQL數(shù)據(jù)庫是受到PostgreSQL的影響。YugabyteDB建立在PostgreSQL源代碼的基礎(chǔ)上,在提供自己的分布式存儲(chǔ)實(shí)現(xiàn)的同時(shí),重用了PostgreSQL的上半部分(查詢引擎)。

YugabyteDB和PostgreSQL之間的緊密聯(lián)系允許開發(fā)人員為YugabyteDB重新設(shè)計(jì)PostgreSQL的Kine實(shí)現(xiàn)。然而需要繼續(xù)關(guān)注,這不會(huì)是一個(gè)簡單的提升和轉(zhuǎn)移的故事。

現(xiàn)在,將這些想法轉(zhuǎn)化為行動(dòng),并在YugabyteDB上啟動(dòng)Kine。為此,使用了一個(gè)配備了8個(gè)CPU和32GB內(nèi)存的Ubuntu22.04虛擬機(jī)。

首先,在虛擬機(jī)上啟動(dòng)一個(gè)三個(gè)節(jié)點(diǎn)的YugabyteDB集群。在進(jìn)行分布式之前,可以在單個(gè)服務(wù)器上對(duì)分布式SQL數(shù)據(jù)庫進(jìn)行試驗(yàn)。有多種方法可以在本地啟動(dòng)YugabyteDB,但作者更喜歡的方法是通過Docker:

Shell 
 mkdir ~/yb_docker_data

 docker network create custom-network

 docker run -d --name yugabytedb_node1 --net custom-network \
 -p 15433:15433 -p 7001:7000 -p 9000:9000 -p 5433:5433 \
  -v ~/yb_docker_data/node1:/home/yugabyte/yb_data --restart unless-stopped \
  yugabytedb/yugabyte:latest \
  bin/yugabyted start --tserver_flags="ysql_sequence_cache_minval=1" \
  --base_dir=/home/yugabyte/yb_data --daemon=false
 
 docker run -d --name yugabytedb_node2 --net custom-network \
  -p 15434:15433 -p 7002:7000 -p 9002:9000 -p 5434:5433 \
  -v ~/yb_docker_data/node2:/home/yugabyte/yb_data --restart unless-stopped \
 yugabytedb/yugabyte:latest \
  bin/yugabyted start --join=yugabytedb_node1 --tserver_flags="ysql_sequence_cache_minval=1" \
  --base_dir=/home/yugabyte/yb_data --daemon=false
     
 docker run -d --name yugabytedb_node3 --net custom-network \
  -p 15435:15433 -p 7003:7000 -p 9003:9000 -p 5435:5433 \
  -v ~/yb_docker_data/node3:/home/yugabyte/yb_data --restart unless-stopped \
  yugabytedb/yugabyte:latest \
 bin/yugabyted start --join=yugabytedb_node1 --tserver_flags="ysql_sequence_cache_minval=1" \
 --base_dir=/home/yugabyte/yb_data --daemon=false

注:在啟動(dòng)YugabyteDB節(jié)點(diǎn)時(shí)設(shè)置ysql_sequence_cache_minval=1,以確保數(shù)據(jù)庫序列可以按順序遞增1。如果沒有這個(gè)選項(xiàng),一個(gè)Kine連接到Y(jié)ugabyteDB將緩存序列的下一個(gè)100個(gè)ID。這可能導(dǎo)致在Kubernetes集群引導(dǎo)期間出現(xiàn)“版本不匹配”錯(cuò)誤,因?yàn)橐粋€(gè)Kine連接可能插入ID范圍從1到100的記錄,而另一個(gè)Kine連接可能插入ID范圍從101到200的記錄。

接下來,使用PostgreSQL實(shí)現(xiàn)啟動(dòng)一個(gè)連接到Y(jié)ugabyteDB的Kine實(shí)例:

(1)克隆Kine庫:

Shell 
1 git clone https://github.com/k3s-io/kine.git && cd kine

(2)啟動(dòng)一個(gè)連接到本地YugabyteDB集群的Kine實(shí)例:

Shell 
1 go run . --endpoint postgres://yugabyte:yugabyte@127.0.0.1:5433/yugabyte

(3)連接YugabyteDB,確認(rèn)Kine架構(gòu)已準(zhǔn)備就緒

SQL 
 psql -h 127.0.0.1 -p 5433 -U yugabyte

 yugabyte=# \d
       List of relations
 Schema |    Name     |   Type   |  Owner
 --------+-------------+----------+----------
  public | kine        | table    | yugabyte
  public | kine_id_seq | sequence | yugabyte
(2 rows)

很好,第一次測試成功了。Kine將YugabyteDB視為PostgreSQL,并且啟動(dòng)時(shí)沒有任何問題。現(xiàn)在進(jìn)入下一個(gè)階段:使用YugabyteDB在Kine之上啟動(dòng)Kubernetes。

使用YugabyteDB在Kine上啟動(dòng)Kubernetes

Kine可以被各種Kubernetes引擎使用,包括標(biāo)準(zhǔn)的Kubernetes部署、Rancher Kubernetes引擎(RKE)或K3 (一種輕量級(jí)的Kubernetes引擎)。為簡單起見,將使用后者。

K3s集群可以通過一個(gè)簡單的命令啟動(dòng):

(1)停止上一節(jié)中啟動(dòng)的Kine實(shí)例。

(2)啟動(dòng)連接到相同本地YugabyteDB集群的K3s(K3s可執(zhí)行文件隨Kine提供):

Shell 
curl -sfL https://get.k3s.io | sh -s - server --write-kubeconfig-mode=644 \
 --token=sample_secret_token \
--datastore-endpoint="postgres://yugabyte:yugabyte@127.0.0.1:5433/yugabyte"

(3)Kubernetes啟動(dòng)時(shí)應(yīng)該沒有問題,可以通過運(yùn)行以下命令來確認(rèn):

Shell 
 k3s kubectl get nodes
 NAME STATUS ROLES AGE VERSION
 ubuntu-vm Ready control-plane,master 7m13s v1.27.3+k3s1

Kubernetes在YugabyteDB上無縫運(yùn)行。這要?dú)w功于YugabyteDB很好的特性和與PostgreSQL的運(yùn)行時(shí)兼容性。這意味著可以重用為PostgreSQL創(chuàng)建的大多數(shù)庫、驅(qū)動(dòng)程序和框架。

這可能標(biāo)志著這一旅程的結(jié)束,可以回顧一下K3s日志。在Kubernetes引導(dǎo)期間,日志可能會(huì)報(bào)告緩慢的查詢,如下所示:

SQL 
 INFO[0015] Slow SQL(total time: 3s) :
 SELECT
  *
 FROM (
  SELECT
  (
  SELECT
  MAX(rkv.id) AS id
  FROM
  kine AS rkv),
 (
  SELECT
  MAX(crkv.prev_revision) AS prev_revision
  FROM
  kine AS crkv
  WHERE
  crkv.name = 'compact_rev_key'), kv.id AS theid, kv.name, kv.created, kv.deleted, kv.create_revision, kv.prev_revision, kv.lease, kv.value, kv.old_value
  FROM
  kine AS kv
  JOIN (
  SELECT
  MAX(mkv.id) AS id
  FROM
  kine AS mkv
  WHERE
  mkv.name LIKE $1
  GROUP BY
  mkv.name) AS maxkv ON maxkv.id = kv.id
  WHERE
  kv.deleted = 0
  OR $2) AS lkv
 ORDER BY
  lkv.theid ASC
 LIMIT 10001

在一臺(tái)機(jī)器上運(yùn)行YugabyteDB時(shí),這可能不是一個(gè)重要的問題,但是一旦切換到分布式設(shè)置,這樣的查詢就會(huì)成為熱點(diǎn)并產(chǎn)生瓶頸。

因此克隆了Kine源代碼,并開始探索PostgreSQL實(shí)現(xiàn),尋找潛在的優(yōu)化機(jī)會(huì)。

YugabyteDB的Kine優(yōu)化

在這里,Magda與Franck Pachot合作,Pachot是一位精通SQL層優(yōu)化的數(shù)據(jù)庫專家,對(duì)應(yīng)用程序邏輯沒有或只有很少的更改。

在檢查了Kine生成的數(shù)據(jù)庫模式并將EXPLAIN ANALYZE用于某些查詢之后,F(xiàn)ranck提出了對(duì)任何分布式SQL數(shù)據(jù)庫都有利的基本優(yōu)化。

幸運(yùn)的是,優(yōu)化不需要對(duì)Kine應(yīng)用程序邏輯進(jìn)行任何更改。所要做的就是引入一些SQL級(jí)別的增強(qiáng)。因此,創(chuàng)建了一個(gè)直接支持YugabyteDB的Kine fork。

與此同時(shí),與PostgreSQL相比,YugabyteDB的實(shí)現(xiàn)有三個(gè)優(yōu)化:

(1)kine表的主索引已從primary index(id)更改為primary INCEX(id asc)。在默認(rèn)情況下,YugabyteDB使用哈希分片在集群中均勻分布記錄。然而,Kubernetes在id列上運(yùn)行了許多范圍查詢,這使得切換到范圍分片是合理的。

(2)通過在索引定義中包括id列,kine_name_prev_revision_uindex索引已被更新為覆蓋索引:

CREATE UNIQUE INDEX IF NOT EXISTS kine_name_prev_revision_uindex ON kine (name asc, prev_revision asc) INCLUDE(id);

YugabyteDB的索引分布類似于表記錄。因此,索引條目可能引用存儲(chǔ)在不同YugabyteDB節(jié)點(diǎn)上的id。為了避免節(jié)點(diǎn)之間額外的網(wǎng)絡(luò)往返,可以將id包含在二級(jí)索引中。

(3)Kine在完成Kubernetes請(qǐng)求的同時(shí)執(zhí)行許多連接。如果查詢規(guī)劃器/優(yōu)化器決定使用嵌套循環(huán)連接,那么在默認(rèn)情況下,YugabyteDB查詢層將每次讀取和連接一條記錄。為了加快這個(gè)過程,可以啟用批處理嵌套循環(huán)連接。YugabyteDB的Kine實(shí)現(xiàn)通過在啟動(dòng)時(shí)執(zhí)行以下語句來實(shí)現(xiàn):

ALTER DATABASE " + dbName + " set yb_bnl_batch_size=1024;

嘗試一下這個(gè)優(yōu)化的YugabyteDB實(shí)現(xiàn)。

首先,停止之前的K3s服務(wù),并從YugabyteDB集群中刪除Kine模式:

(1)停止并刪除K3s服務(wù):

Shell 
 sudo /usr/local/bin/k3s-uninstall.sh
 sudo rm -r /etc/rancher

(2)刪除模式:

SQL 
 psql -h 127.0.0.1 -p 5433 -U yugabyte

 drop table kine cascade;

接下來,啟動(dòng)一個(gè)為YugabyteDB提供優(yōu)化版本的Kine實(shí)例:

(1)克隆fork:

Shell 
 git clone https://github.com/dmagda/kine-yugabytedb.git && cd kine-yugabytedb

(2)啟動(dòng)Kine:

Shell 
 go run . --endpoint "yugabytedb://yugabyte:yugabyte@127.0.0.1:5433/yugabyte"

Kine的啟動(dòng)沒有任何問題。現(xiàn)在唯一的區(qū)別是,不是在連接字符串中指定“postgres”,而是指示“yugabytedb”以啟用優(yōu)化的YugabyteDB實(shí)現(xiàn)。關(guān)于Kine和YugabyteDB之間的實(shí)際通信,Kine繼續(xù)使用Go的標(biāo)準(zhǔn)PostgreSQL驅(qū)動(dòng)程序。

在Kine的優(yōu)化版本上構(gòu)建Kubernetes

最后,在這個(gè)優(yōu)化版本的Kine上啟動(dòng)k3。

要做到這一點(diǎn),首先需要從資源中構(gòu)建k3:

(1)停止上一節(jié)中啟動(dòng)的Kine實(shí)例。

(2)克隆K3s存儲(chǔ)庫:

Shell 
 git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s

(3)打開go.mod文件,并在replace(..)部分的末尾添加以下行:

Go 
 github.com/k3s-io/kine => github.com/dmagda/kine-yugabytedb v0.2.0

這條指令告訴Go使用帶有YugabyteDB實(shí)現(xiàn)的最新版本的Kinefork。

(4)啟用對(duì)私有倉庫和模塊的支持:

Shell 
 go env -w GOPRIVATE=github.com/dmagda/kine-yugabytedb

(5)確保更改生效:

Shell 
 go mod tidy

(6)準(zhǔn)備構(gòu)建K3s的完整版本:

Shell 
 mkdir -p build/data && make download && make generate

(7)構(gòu)建完整版本:

Shell 
 SKIP_VALIDATE=true make

完成構(gòu)建大約需要五分鐘。

注意:一旦停止使用這個(gè)自定義K3s構(gòu)建,可以按照說明卸載它。

在優(yōu)化的Kubernetes版本上運(yùn)行示例工作負(fù)載

在構(gòu)建完成后,可以使用Kine的優(yōu)化版本啟動(dòng)K3s。

(1)導(dǎo)航到包含構(gòu)建構(gòu)件的目錄:

Shell 
 cd dist/artifacts/

(2)通過連接到本地YugabyteDB集群啟動(dòng)K3s:

Shell 
 sudo ./k3s server \
  --token=sample_secret_token \
 --datastore-endpoint="yugabytedb://yugabyte:yugabyte@127.0.0.1:5433/yugabyte"

(3)確認(rèn)Kubernetes啟動(dòng)成功:

Shell 
 sudo ./k3s kubectl get nodes

 NAME STATUS ROLES AGE VERSION
 ubuntu-vm Ready control-plane,master 4m33s v1.27.4+k3s-36645e73
 

現(xiàn)在,部署一個(gè)示例應(yīng)用程序,以確保Kubernetes集群不僅僅能夠自我引導(dǎo):

(1)采用Kubernetes克隆一個(gè)庫的例子:

Shell 
 git clone https://github.com/digitalocean/kubernetes-sample-apps.git

(2)部署Emojivoto應(yīng)用:

Shell 
 sudo ./k3s kubectl apply -k ./kubernetes-sample-apps/emojivoto-example/kustomize

(3)確保所有部署和服務(wù)成功啟動(dòng):

Shell 
 sudo ./k3s kubectl get all -n emojivoto
 
 NAME READY STATUS RESTARTS AGE
 pod/vote-bot-565bd6bcd8-rnb6x    1/1 Running 0 25s
 pod/web-75b9df87d6-wrznp  1/1 Running 0 24s
 pod/voting-f5ddc8ff6-69z6v   1/1 Running 0 25s
 pod/emoji-66658f4b4c-wl4pt  1/1 Running 0 25s

 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
 service/emoji-svc   ClusterIP 10.43.106.87 <none> 8080/TCP,8801/TCP 27s
 service/voting-svc   ClusterIP 10.43.14.118 <none> 8080/TCP,8801/TCP 27s
 service/web-svc   ClusterIP 10.43.110.237 <none> 80/TCP 27s

 NAME READY UP-TO-DATE AVAILABLE AGE
 deployment.apps/vote-bot  1/1 1 1 26s
 deployment.apps/web   1/1 1 1 25s
 deployment.apps/voting 1/1 1 1 26s
 deployment.apps/emoji 1/1 1 1 26s

 NAME DESIRED CURRENT READY AGE
 replicaset.apps/vote-bot-565bd6bcd8  1 1 1 26s
 replicaset.apps/web-75b9df87d6 1 1 1 25s
 replicaset.apps/voting-f5ddc8ff6  1 1 1 26s
 replicaset.apps/emoji-66658f4b4c  1  1   1   26s

(4)使用CLUSTER_IP:80調(diào)用服務(wù)/web svc以觸發(fā)應(yīng)用程序邏輯:

Shell 
 curl 10.43.110.237:80

應(yīng)用程序?qū)⑹褂靡韵翲TML進(jìn)行響應(yīng):

HTML 
 <!DOCTYPE html>
 <html>
  <head>
  <meta charset="UTF-8">
  <title>Emoji Vote</title>
  <link rel="icon" href="/img/favicon.ico">
 
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-60040560-4"></script>
  <script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'UA-60040560-4');
  </script>
 </head>
 <body>
  <div id="main" class="main"></div>
  </body>
 
 <script type="text/javascript" src="/js" async></script>
 
 </html>

結(jié)語

完成工作Kubernetes現(xiàn)在可以使用YugabyteDB作為其所有數(shù)據(jù)的分布式和高可用性SQL數(shù)據(jù)庫。

現(xiàn)在可以進(jìn)入下一階段:在跨多個(gè)可用性區(qū)域和區(qū)域的真正云計(jì)算環(huán)境中部署Kubernetes和YugabyteDB,并測試解決方案如何處理各種中斷。

原文標(biāo)題:Kubernetes Evolution: Transitioning from etcd to Distributed SQL,作者:Denis Magda


責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2023-05-12 08:23:03

分布式系統(tǒng)網(wǎng)絡(luò)

2020-08-03 07:00:00

SQL數(shù)據(jù)庫

2022-12-04 22:41:15

IPC分布式機(jī)制

2024-04-22 08:10:29

2021-11-26 06:43:19

Java分布式

2024-06-07 07:41:03

2017-09-01 05:35:58

分布式計(jì)算存儲(chǔ)

2017-07-26 14:55:32

分布式技術(shù)架構(gòu)

2021-03-17 10:51:16

架構(gòu)運(yùn)維技術(shù)

2022-11-06 19:28:02

分布式鎖etcd云原生

2010-07-06 09:39:20

SQL Server分

2019-06-19 15:40:06

分布式鎖RedisJava

2024-01-22 13:55:00

2022-03-29 23:17:52

PostgreSQL集群Citus

2024-06-12 09:06:48

2013-06-07 13:46:29

分布式存儲(chǔ)自動(dòng)化運(yùn)維

2021-04-29 19:07:33

Redis演進(jìn)微服務(wù)

2022-02-24 10:01:05

數(shù)字化網(wǎng)絡(luò)安全邊緣計(jì)算

2024-01-29 14:46:22

分布式計(jì)算云計(jì)算邊緣計(jì)算

2024-04-11 12:42:30

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一级免费毛片 | 国产精品视频999 | 欧美日韩精品一区二区三区视频 | 欧美成人精品一区 | av网站免费看 | 亚洲欧美激情精品一区二区 | 亚洲免费人成在线视频观看 | 久草在线影 | 国产精品久久久久久久久污网站 | 色欧美片视频在线观看 | 成人综合在线视频 | 国产视频在线观看一区二区三区 | 亚洲综合区 | 黄篇网址 | 精品欧美黑人一区二区三区 | 欧洲精品在线观看 | 婷婷在线视频 | 国产在线观看一区 | 日韩欧美三级 | 久久久激情视频 | 最新免费黄色网址 | 日韩在线小视频 | ww 255hh 在线观看 | 精精国产xxxx视频在线播放 | 亚洲国产精品99久久久久久久久 | 日韩在线视频一区二区三区 | 久久久久久久久99 | 91亚洲精品在线 | 欧美videosex性极品hd | 亚洲日韩中文字幕 | 欧美性网 | 亚洲精品一区二区 | 久久av资源网 | 精品粉嫩aⅴ一区二区三区四区 | 国产一区二区在线免费播放 | 91精品久久久久久久久 | 中文字幕 国产精品 | 亚洲天堂一区二区 | 国产午夜精品福利 | 国产成人影院 | 日韩视频在线免费观看 |