當前位置:首頁 » 編程軟體 » 離線編譯etcd

離線編譯etcd

發布時間: 2023-03-30 20:17:57

① go語言可以做什麼

go語言在高性能分布式系統領域有很好的開發效率,可以主要用於伺服器端的開發,能夠進行處理日誌、數據打包、虛擬機處理、文件系統、分布式系統、資料庫代理等。

Go(又稱Golang)是Google的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種靜態強類型、編譯型語言。Go 語言語法與C相近,但功能上有:內存安全,GC(垃圾回收),結構形態及 CSP-style並發計算。

撰寫風格:

在Go中有幾項規定,當不匹配以下規定時編譯將會產生錯誤。

每行程序結束後不需要撰寫分號(;)。

大括弧({)不能夠換行放置。

if判斷式和for循環不需要以小括弧包覆起來。

Go亦有內置gofmt工具,能夠自動整理代碼多餘的空白、變數名稱對齊、並將對齊空格轉換成Tab。

② kong網關怎麼獲取etcd埠

etcd簡介與應用場景 etcd 是一個分布式一致性k-v存儲系統,可用於服務注冊發現與...
2.
單機模式運行 默認在centos7的yum源里已集成了etcd包,可以通過攜指yum進行安裝...
3.
集群模式說明 這里的集群模式是指完全集群模式,當然也可橋脊以在單機上通過不同的埠,部署偽...
4.
靜態模式 如果只是測試,這里建議使辯消配用二進制包進行測試。因為源碼包編譯的,使用etcd命令...
5.
動態配置 靜態配置前提是在搭建集群之前已經提前知道各節點的信息,而實際應用中可能

③ k8s的Mutating webhook

Admission Webhook 是 api-server 對外提供的一個擴展能力,api-server 作為 kubernetes 的核心,幾乎所有組件都需要跟他打交道,基本可以說掌控了 k8s 的 api-server,你就可以控制 k8s 的行為。

在早期的版本 api-server 並沒有提供 admissionresgistration 的能力(v1.9之前),當我們要對 k8s 進行控制的時候,只能重新編譯 api-server。比如你想阻止某個控制器的行為,或攔截某個控制器的資源修改。admission webhook 就是提供了這樣的能力,比如你芹姿希望某個特定 label 標兆首態簽的 pod 再創建的時候都注入 sidercar,或者阻止不合規的資源。

Admission Webhook 包涵兩種 CRD: mutatingwebhookconfiguration 和 。

下面是一個 mutatingwebhookconfiguration 的CRD文件:

Admission Webhook 本質是 api-server 的一個 webhook 調用,下面是 api-server 的處理流程:

api-server 通過讀取 mutatingwebhookconfiguration 和 的 CR 文件的目標地址,然後回調用戶自定義的服務。

api-server 發起的請求是一串json數據格式,header需要設置 content-type 為 application/json , 我們看看請求的 body :

返回的結果:

這里的 patch 是用base64編碼的一個json,我們解碼看看,是一個 json patch:

處理函數:

主程序:

基於私鑰生成一個證書簽名請求(Certificate Signing Request,CSR),目標地址的域名為: mutating-test.testing-tools.svc , csr的配置:

創建命令:

基於csr創建 CertificateSigningRequest :

認證完成可以查看:

生成證書:

獲取api-server的CA證書:

將這個證書填入 Webhook 的 caBundle。

MutatingAdmissionWebhook作為kubernetes的ApiServer中Admission Controller的一部分,提供了非常靈活的擴展機制,通過配置MutatingWebhookConfiguration對象,理論上可以監聽並修改任何經過ApiServer處理的請求

MutatingWebhookConfiguration是kubernetes的一個官方的資源提供的對象,下面對該對象的欄位做一些簡單的說明:

結合rules.operations和rules.resources的屬性,我們可以知道樣例中的MutatingWebhookConfiguration監聽了集群中nodes資源的status數據向apiServer提交的更新操作(就是我們前面提到的心跳信息),並且將所有的心跳信息發給了名為webhook-oversale-service的Service下的/mutate介面處理,這個介面就是我們自定義的webhook服務提供的。

上圖中的Pod跑著的容器就是我們自定義的webhook服務,一個自定義webhook服務樣例供參考

在生產環境中,kubernetes集群的計算節點上運行著許許多多的Pod,分別跑著各種業務容器,我們通常用Deployment、DeamonSet、StatefulSet等資源對象去控制Pod的增刪改。因此族源,開發或運維往往需要配置這些資源對象的Containers欄位中業務容器的CPU和內存的資源配額:requests和limit

requests:節點調度pod需要的資源,每次成功調度則將節點的Allocatable屬性值(可分配資源)重新計算,
新的Allocatable值 = 舊的Allocatable值 - 設置的requests值
limit:節點中運行pod能夠獲得的最大資源,當cpu
我們不難發現,當requests欄位設置太大的時候,pod實際使用的資源卻很小,導致計算節點的Allocatable值很快就被消耗完,節點的資源利用率會變得很低。

上圖中最大的藍色框(allocatable)為計算節點可分配資源,橙色框(requests)為用戶配置的requests屬性,紅色框(current)為業務容器實際使用的資源。因此節點的資源利用率為 current / allocatable。而由於requests設置太大,占滿了allocatable,導致新的pod無法被調度到這個節點,就會出現節點實際資源佔用很低,卻因為allocatable太低導致pod無法調度到該節點的現象。
因此我們能否通過動態調整allocatable的值來讓計算節點的可分配資源變得"虛高",騙過k8s的調度器,讓它以為該節點可分配資源很大,讓盡可能多的pod調度到該節點上呢?

上圖通過將allocatable值擴大(fake allcatable),讓更多的pod調度到了改節點,節點的資源利用率 current / allocatable 就變大了。

實現資源超賣的關鍵在於動態修改節點Node對象的allocatable欄位值,而我們看到allocatable欄位屬於Status欄位,顯然不能直接通過kubectl edit命令來直接修改。因為Status欄位和Spec欄位不同,Spec是用戶設置的期望數據,而Status是實際數據(Node節點通過不斷向apiServer發送心跳來更新自己的實時狀態,最終存在etcd中)。那麼我們要怎麼去修改Stauts欄位呢?
首先,要修改k8s中任何資源對象的Status值,k8s官方提供了一套RESTful API: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13
可以通過patch或者put方法來調用k8s的RESTful API,實現Stauts欄位的修改。(這里是通過ApiServer去修改etcd中保存的Status欄位的值)

但是,Node資源對象比較特殊,計算節點會不斷給ApiServer發送心跳(默認每隔10s發一次),將帶有Status欄位的真實信息發送給ApiServer,並更新到etcd中。也就是無論你怎麼通過patch/put方法去修改Node的Status欄位,計算節點都會定時通過發送心跳將真實的Status數據覆蓋你修改的數據,也就是說我們無法通過直接調用RESTful API修改Node對象中的Status數據。

那我們是否可以直接監聽這個計算節點的心跳數據,通過修改心跳數據中的Status欄位中的allocatable值,從而實現資源超賣呢?

答案是肯定的,k8s在ApiServer中就提供了Admission Controller(准入控制器)的機制,其中包括了MutatingAdmissionWebhook,通過這個webhook,所有和集群中所有和ApiSever交互的請求都被發送到一個指定的介面中,我們只要提供一個這樣的介面,就可以獲取到Node往ApiServer發送心跳的Staus數據了。然後將這個數據進行我們的自定義修改,再往後傳給etcd,就能讓etcd以為我們修改過的Status數據就是節點的真實Status,最終實現資源的超賣。

我們都知道,Istio的流量管理、策略、遙測等功能無須應用程序做任何改動,這種無侵入式的方式全部依賴於Sidecar。應用程序發送或者接收的流量都被Sidecar攔截,並由Sidecar進行認證、鑒權、策略執行及遙測數據上報等眾多治理功能。

如圖所示,在Kubernetes中,Sidecar容器與應用容器共存於同一個Pod中,並且共享同一個Network Namespaces,因此Sidecar容器與應用容器共享同一個網路協議棧,這也是Sidecar能夠通過iptables攔截應用進出口流量的根本原因。

Istio的Sidecar模式

在Istio中進行Sidecar注入有兩種方式:一種是通過istioctl命令行工具手動注入;另一種是通Istio Sidecar Injector自動注入。

這兩種方式的最終目的都是在應用Pod中注入init容器及istio-proxy容器這兩個Sidecar容器。如下所示,通過部署Istio的sleep應用,Sidecar是通過sidecar-injector自動注入的,查看注入的Sidecar容器:

Sidecar Injector是Istio中實現自動注入Sidecar的組件,它是以Kubernetes准入控制器Admission Controller的形式運行的。Admission Controller的基本工作原理是攔截Kube-apiserver的請求,在對象持久化之前、認證鑒權之後進行攔截。Admission Controller有兩種:一種是內置的,另一種是用戶自定義的。Kubernetes允許用戶以Webhook的方式自定義准入控制器,Sidecar Injector就是這樣一種特殊的MutatingAdmissionWebhook。

如圖所示,Sidecar Injector只在創建Pod時進行Sidecar容器注入,在Pod的創建請求到達Kube-apiserver後,首先進行認證鑒權,然後在准入控制階段,Kube-apiserver以REST的方式同步調用Sidecar Injector Webhook服務進行init與istio-proxy容器的注入,最後將Pod對象持久化存儲到etcd中。

Sidecar Injector可以通過MutatingWebhookConfiguration API動態配置生效,Istio中的MutatingWebhook配置如下:

從以上配置可知,Sidecar Injector只對標簽匹配「istio-injection: enabled」的命名空間下的Pod資源對象的創建生效。Webhook服務的訪問路徑為「/inject」,地址及訪問憑證等都在clientConfig欄位下進行配置。

Istio Sidecar Injector組件是由sidecar-injector進程實現的,本書在之後將二者視為同一概念。Sidecar Injector的實現主要由兩部分組成:

MutatingWebhookConfiguration對象的維護主要指監聽本地證書的變化及Kubernetes MutatingWebhookConfiguration資源的變化,以檢查CA證書或者CA數據是否有更新,並且在本地CA證書與MutatingWebhookConfiguration中的CA證書不一致時,自動更新MutatingWebhookConfiguration對象。

④ go mod如何手動替換包

之前在項目中遇到過etcd的版本不一致, 導致無法編譯賀敗. 最終是因為版本不一碼激致的問題。
先刪除vendor: rm -rf vendor 或手動刪除。1.再替版本: go mod edit -require=google.golang.org/[email protected]。2.下載指定版本v1.26.0: go get -u -x google.golang.org/[email protected]。3.然後再go mod vendor。遲拍襪

⑤ K3S 離線安裝部署高可用集群

執行范圍:所有主機
執行完成後重啟伺服器。

執行范圍: 所有主機

安裝方式: 二進制離線安裝
執行范圍: 所有主機

作用:用於為k3s提供存儲,k3s支持除etcd外的集群數據存儲方式
執行范圍: 10.2.2.10 伺服器主機
說明:選用5.7版本是因為該版本是rancher官方推薦。
第5步中,只需要對server節點所在的IP創建用戶並授權就可以了。

對於server-1 10.2.2.13節點

對於server-2 10.2.2.14節點

兩個server節點部署完成後,查看當前集群節點狀況

1、haproxy的部署和配置
部署 haproxy-2.4.7
部署方式:二進制
執行范圍:10.2.2.11 10.2.2.12 (兩台伺服器操作完全一致)

訪問haproxy-UI http://10.2.2.11:18090/admin 監控頁面

2、 keepalived的部署和配置
部署 keepalived-2.1.5
部署方式:二進制
執行范圍:10.2.2.11 10.2.2.12 (兩台伺服器keepalived配置文件有所差異,下文會標明)

3、通過keepalived虛擬VIP http://10.2.2.100:18090/admin 訪問haproxy監控頁面

執行范圍: 10.2.2.15 10.2.2.16
登錄10.2.2.13(即上述server-1節點),拷貝k3s的3個文件到10.2.2.15和10.2.2.16兩台主機上

修改install.sh文件,如下(10.2.2.15和10.2.2.16改動都一樣)

安裝

登錄10.2.2.13查看集群節點

九、安裝rancher-ui界面
操作范圍:10.2.2.10

訪問

繼續按下圖所示導入k3s集群到rancher

⑥ Golang項目部署3,容器部署

容器部署即使用 docker 化部署 golang 應用程序,這是在雲服務時代最流行的部署方式,也是最推薦的部署方式。

跨平台交叉編譯是 golang 的特點之一,可以非常方便地編譯出我們需要的目標伺服器平台的版本,而且是靜態編譯,非常容易地解決了運行依賴問題。

使用以下指令可以靜態編譯 Linux 平台 amd64 架構的可執行文件:

生成的 main 便是我們靜態編譯的,可部署於 Linux amd64 上的可執行文件。

我們需要將該可執行文件 main 編譯生成 docker 鏡像,以便於分發及部署。 Golang 的運行環境推薦使用 alpine 基礎系統鏡像,編譯出的容器鏡像約為 20MB 左右。

一個參考的 Dockerfile 文件如下:

其中,我們的基礎鏡像使用了 loads/alpine:3.8 ,中國國內的消正用戶推薦使用該基礎鏡像,基礎鏡像的 Dockerfile 地址: https://github.com/johngcn/dockerfiles ,倉庫地址: https://hub.docker.com/u/loads

隨後使用 " docker build -t main . " 指令編譯生成名為 main 的 docker 鏡像。

需要注意的是,在某些項目的架構設計中, 靜態文轎輪件 配置文件 可能不會隨著鏡像進行編譯發布,而是分開進行管理和發布。

例如,使用 MVVM 模式的項目中(例如使用 vue 框架),往往是前後端非常獨立的,因此在鏡像中往往並不會包含 public 目錄。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的項目中,也往往並不需要 config 目拿帆悔錄。

因此對於以上示例的 Dockerfile 的使用,僅作參考,根據實際情況請進行必要的調整。

使用以下指令可直接運行剛才編譯成的鏡像:

容器的分發可以使用 docker 官方的平台: https://hub.docker.com/ ,國內也可以考慮使用阿里雲: https://www.aliyun.com/proct/acr 。

在企業級生產環境中, docker 容器往往需要結合 kubernetes 或者 docker swarm 容器編排工具一起使用。
容器編排涉及到的內容比較多,感興趣的同學可以參考以下資料:

⑦ golang有沒有好的開源游戲框架

為什麼golang的開發效率高?</ol>golang是一編譯型的強類型語言,它在開發上的高效率主要來自於後發優勢,不用考慮舊有惡心的歷史,又有一個較高的工程視角。良好的避免了程序員因為「 { 需不需要獨佔一行 」這種革命問題打架,也解決了一部分趁編譯時間找產品妹妹搭訕的階級敵人。
它有自己的包管理機制,工具鏈成熟,從開發、調試到發布都很簡單方便;有反向介面、defer、coroutine等大量的syntactic sugar;編譯速度快,因為是強類型語言又有gc,只要通過編譯,非業務毛病就很少了;它在語法級別上支持了goroutine,這是大家說到最多的內容,這里重點提一下。首先,coroutine並不稀罕,語言並不能超越硬體、操作系統實現神乎其神的功能。golang可以做到事情,其他語言也可以做到,譬如c++,在boost庫裡面自己就有的coroutine實現(當然用起來跟其他boost庫一樣惡心)。golang做的事情,是把這一套東西的使用過程簡化了,並且提供了一套channel的通信模式,使得程序員可以忽略諸如死鎖等問題。
goroutine的目的是描述並發編程模型。並發與並行不同,它並不需要多核的硬體支持,它不是一種物理運行狀態,而是一種程序邏輯流程。它的主要目的不是利用多核提高運行效率,而是提供一種更容易理解、不容易出錯的語言來描述問題。
實際上golang默認就是運行在單OS進程上面的,通過指定環境變數GOMAXPROCS才能轉身跑在多OS進程上面。有人提到了的pomelo,開源本來是一件很不錯的事情,但是基於自己對callback hell的偏見,我一直持有這種態度:敢用nodejs寫大規模游戲伺服器的人,都是真正的勇士 : ) 。
2、Erlang與Golang的coroutine有啥區別,coroutine是啥?
coroutine本質上是語言開發者自己實現的、處於user space內的線程,無論是erlang、還是golang都是這樣。需要解決沒有時鍾中斷;碰著阻塞式i\o,整個進程都會被操作系統主動掛起;需要自己擁有調度控制能力(放在並行環境下面還是挺麻煩的一件事)等等問題。那為啥要廢老大的勁自己做一套線程放user space裡面呢?並發是伺服器語言必須要解決的問題;system space的進程還有線程調度都太慢了、佔用的空間也太大了。把線程放到user space的可以避免了陷入system call進行上下文切換以及高速緩沖更新,線程本身以及切換等操作可以做得非常的輕量。這也就是golang這類語言反復提及的超高並發能力,分分鍾給你開上幾千個線程不費力。
不同的是,golang的並發調度在i/o等易發阻塞的時候才會發生,一般是內封在庫函數內;erlang則更誇張,對每個coroutine維持一個計數器,常用語句都會導致這個計數器進行rection,一旦到點,立即切換調度函數。
中斷介入程度的不同,導致erlang看上去擁有了preemptive scheling的能力,而golang則是cooperative shceling的。golang一旦寫出純計算死猜彎耐循環,進程內所有會話必死無疑;要有大計算量少i\o的函數還得自己主動叫runtime.Sched()來進行調度切換。
3、golang的運行效率怎麼樣?
我是相當反感所謂的ping\pong式benchmark,運行效率需要放到具體的工作環境下面考慮。
首先,它再快也是快不過c的,畢竟底下做了那麼多工作,又有調度,又有gc什麼的。穗春那為什麼在那些benchmark裡面,golang、nodejs、erlang的響應效率看上去那麼優秀呢,響應快,並發強?並發能力強的原因上面已經提到了,響應快是因為大量非阻塞式i\o操作出現的原因。這一點c也可以做到,並且能力更強,但是得多寫不少優質代碼。
然後,針對游戲伺服器這種高實時性的運行環境,GC所造成的跳幀問題確實比較麻煩,前面的大神 @達達 有比較詳細的論述和緩解方案,就不累述了 。隨著golang的持續開發,相信應該會有非常大的改進。一是屏蔽內存操作是現代語言的大勢所趨,它肯定是需要被實現的;二是GC演算法已經相當的成熟,效率勉勉強強過得去;三是鬧孝可以通過incremental的操作來均攤cpu消耗。
用這一點點效率損失換取一個更高的生產能力是不是值得呢?我覺得是值得的,硬體已經很便宜了,人生苦短,讓自己的生活更輕松一點吧: )。
4、基於以上的論述,我認為採用go進行小范圍的MMORPG開發是可行的。

⑧ pgsql的主鍵存儲方式

PostgreSQL的穩定性極強,Innodb等索引在崩潰,斷電之類的災難場景下 抗擊打能力有了長足進步,然而很多 MqSQL用戶 都遇到過 Server級的資料庫丟失的場景 -- MySQL系統庫是 MyISAM,相比之下,PG資料庫這方面要更好一些。

任何系統都有它的性能極限,在高並發讀寫,負載逼近極限下,PG的性能指標仍可以位置雙曲線甚至對數曲線,到 頂峰之後不在下降,而MySQL明顯出現一個波峰後下滑(5.5版本 之後,在企業級版本中有個插件可以改善很多,不過需要付費)。

PG多年來在 GIS(地理信息)領域處於優勢地位,因為它有豐富的幾何類型,PG有大量字典,數組,bitmap等數據類型,相比之下 MySQL就差很多, Instagram就是因為 PG的空間資料庫 擴展 POSTGIS遠遠強於 MySQL的 my spatial 而採用 PgSQL的。

PG的「無鎖定」特性非常突出,甚至包括 vacuum這樣的整理數據空間的操作,這個和PGSQL的MVCC實現有關系。

PG可以使用函數 和 條件索引,這使得 PG資料庫的調優非常靈活, MySQL就沒有這個功能,條件索引在 web應用中 很重要。

PG有極其強悍的 SQL編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,比如分析函數(Oracle的叫法,PG里叫Window函數),還可以用多種語言來寫存儲過程,對於 R的支持也很好。這一點MySQL就差很多,很多分析功能都不支持,騰訊內部的存儲主要是 MySQL,但是數據分析主要是 Hadoop+ PgSQL。

PG的有多種集群架構可以選擇,plproxy可以之hi語句級的鏡像或分片,slony可以進行欄位級的同步配置,standby 可以構建 WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便。

一般關系型資料庫字元串有長度限制 8k 左右,無限長 TEXT類型的功能受限,只能作為外部大數據訪問。而 PG 的 TEXT 類型 可以直接訪問且無長度限制, SQL語法內置 正則表達式,可以索引,還可以全文檢索,或使用 xml xpath。用 PG的話,文檔資料庫都可以省了。

PgSQL對於 numa 架構的支持比 MySQL強一些,比 MySQL對於讀的性能更好一些, PgSQL提交可以完全非同步提交,而 MySQL的內存表不夠實用(因為表鎖的原因)。

pgsql除了存儲正常的數據類型外,還支持存儲
array,不管是一維數組還是多維數組均支持。
json和jsonb,相比使用 text存儲要高效很多。
json和 jsonb在更高的層面上看起來幾乎是一樣的,但是存儲實現上是不同的。
json存儲完的文本,json列會每次都解析存儲的值,它不支持索引,但 可以為創建表達式索引。
jsonb存儲的二進制格式,避免了重新解析數據結構。它支持索引,這意味著 可以不使用指定索引就能查詢任何路徑。
當我們比較寫入數據速度時,由於數據存儲 的方式的原因,jsonb會比 json 稍微的慢一點。json列會每次都 解析存儲的值,這意味著鍵的順序要和輸入的 時候一樣。但是 jsonb不同,以二進制格式存儲且不保證鍵的順序。因此如果有軟體需要依賴鍵的順序,jsonb可能不是最佳選擇。使用 jsonb的優勢還在於可以輕易的整合關系型數據和非關系型 數據 ,PostgreSQL對於 mongodb這類資料庫是一個不小的威脅,畢竟如果一個表中只有一列數據的類型是半結構化的,沒有必要為了遷就它而整個表的設計都採用 schemaless的結構。

1. CPU限制
PGSQL
沒有CPU核心數限制,有多少CPU核就用多少

MySQL
能用128核CPU,超過128核用不上
2. 配置文件參數
PGSQL
一共有255個參數,用到的大概是80個,參數比較穩定,用上個大版本配置文件也可以啟動當前大版本資料庫

MySQL
一共有707個參數,用到的大概是180個,參數不斷增加,就算小版本也會增加參數,大版本之間會有部分參數不兼容情況
3. 第三方工具依賴情況
PGSQL
只有高可用集群需要依靠第三方中間件,例如:patroni+etcd、repmgr

MySQL
大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,學習成本高,高可用集群也需要第三方中間件,官方MGR集群還沒成熟
4. 高可用主從復制底層原理
PGSQL
物理流復制,屬於物理復制,跟SQL Server鏡像/AlwaysOn一樣,嚴格一致,沒有任何可能導致不一致,性能和可靠性上,物理復制完勝邏輯復制,維護簡單

MySQL
主從復制,屬於邏輯復制,(sql_log_bin、binlog_format等參數設置不正確都會導致主從不一致)
大事務並行復制效率低,對於重要業務,需要依賴 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比較和修復主從一致
主從復制出錯嚴重時候需要重搭主從
MySQL的邏輯復制並不阻止兩個不一致的資料庫建立復制關系
5. 從庫只讀狀態
PGSQL
系統自動設置從庫默認只讀,不需要人工介入,維護簡單

MySQL
從庫需要手動設置參數super_read_only=on,讓從庫設置為只讀,super_read_only參數有bug,鏈接:https://jiahao..com/s?id=1636644783594388753&wfr=spider&for=pc
6. 版本分支
PGSQL
只有社區版,沒有其他任何分支版本,PGSQL官方統一開發,統一維護,社區版有所有功能,不像SQL Server和MySQL有標准版、企業版、經典版、社區版、開發版、web版之分
國內外還有一些基於PGSQL做二次開發的資料庫廠商,例如:Enterprise DB、瀚高資料庫等等,當然這些只是二次開發並不算獨立分支

MySQL
由於歷史原因,分裂為三個分支版本,MariaDB分支、Percona分支 、Oracle官方分支,發展到目前為止各個分支基本互相不兼容
Oracle官方分支還有版本之分,分為標准版、企業版、經典版、社區版
7. SQL特性支持
PGSQL
SQL特性支持情況支持94種,SQL語法支持最完善,例如:支持公用表表達式(WITH查詢)

MySQL
SQL特性支持情況支持36種,SQL語法支持比較弱,例如:不支持公用表表達式(WITH查詢)

關於SQL特性支持情況的對比,可以參考:http://www.sql-workbench.net/dbms_comparison.html
8. 主從復制安全性
PGSQL
同步流復制、強同步(remote apply)、高安全,不會丟數據
PGSQL同步流復制:所有從庫宕機,主庫會罷工,主庫無法自動切換為非同步流復制(非同步模式),需要通過增加從庫數量來解決,一般生產環境至少有兩個從庫
手動解決:在PG主庫修改參數synchronous_standby_names ='',並執行命令: pgctl reload ,把主庫切換為非同步模式
主從數據完全一致是高可用切換的第一前提,所以PGSQL選擇主庫罷工也是可以理解

MySQL
增強半同步復制 ,mysql5.7版本增強半同步才能保證主從復制時候不丟數據
mysql5.7半同步復制相關參數:
參數rpl_semi_sync_master_wait_for_slave_count 等待至少多少個從庫接收到binlog,主庫才提交事務,一般設置為1,性能最高
參數rpl_semi_sync_master_timeout 等待多少毫秒,從庫無回應自動切換為非同步模式,一般設置為無限大,不讓主庫自動切換為非同步模式
所有從庫宕機,主庫會罷工,因為無法收到任何從庫的應答包
手動解決:在MySQL主庫修改參數rpl_semi_sync_master_wait_for_slave_count=0
9. 多欄位統計信息
PGSQL
支持多欄位統計信息

MySQL
不支持多欄位統計信息
10. 索引類型
PGSQL
多種索引類型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表達式索引)

MySQL
btree 索引,全文索引(低效),表達式索引(需要建虛擬列),hash 索引只在內存表
11. 物理表連接演算法
PGSQL
支持 nested-loop join 、hash join 、merge join

MySQL
只支持 nested-loop join
12. 子查詢和視圖性能
PGSQL
子查詢,視圖優化,性能比較高

MySQL
視圖謂詞條件下推限制多,子查詢上拉限制多
13. 執行計劃即時編譯
PGSQL
支持 JIT 執行計劃即時編譯,使用LLVM編譯器

MySQL
不支持執行計劃即時編譯
14. 並行查詢
PGSQL
並行查詢(多種並行查詢優化方法),並行查詢一般多見於商業資料庫,是重量級功能

MySQL
有限,只支持主鍵並行查詢
15. 物化視圖
PGSQL
支持物化視圖

MySQL
不支持物化視圖
16. 插件功能
PGSQL
支持插件功能,可以豐富PGSQL的功能,GIS地理插件,時序資料庫插件, 向量化執行插件等等

MySQL
不支持插件功能
17. check約束
PGSQL
支持check約束

MySQL
不支持check約束,可以寫check約束,但存儲引擎會忽略它的作用,因此check約束並不起作用(mariadb 支持)
18. gpu 加速SQL
PGSQL
可以使用gpu 加速SQL的執行速度

MySQL
不支持gpu 加速SQL 的執行速度
19. 數據類型
PGSQL
數據類型豐富,如 ltree,hstore,數組類型,ip類型,text類型,有了text類型不再需要varchar,text類型欄位最大存儲1GB

MySQL
數據類型不夠豐富
20. 跨庫查詢
PGSQL
不支持跨庫查詢,這個跟Oracle 12C以前一樣

MySQL
可以跨庫查詢
21. 備份還原
PGSQL
備份還原非常簡單,時點還原操作比SQL Server還要簡單,完整備份+wal歸檔備份(增量)
假如有一個三節點的PGSQL主從集群,可以隨便在其中一個節點做完整備份和wal歸檔備份

MySQL
備份還原相對不太簡單,完整備份+binlog備份(增量)
完整備份需要percona的XtraBackup工具做物理備份,MySQL本身不支持物理備份
時點還原操作步驟繁瑣復雜
22. 性能視圖
PGSQL
需要安裝pg_stat_statements插件,pg_stat_statements插件提供了豐富的性能視圖:如:等待事件,系統統計信息等
不好的地方是,安裝插件需要重啟資料庫,並且需要收集性能信息的資料庫需要執行一個命令:create extension pg_stat_statements命令
否則不會收集任何性能信息,比較麻煩

MySQL
自帶PS庫,默認很多功能沒有打開,而且打開PS庫的性能視圖功能對性能有影響(如:內存佔用導致OOM bug)
23. 安裝方式
PGSQL
有各個平台的包rpm包,deb包等等,相比MySQL缺少了二進制包,一般用源碼編譯安裝,安裝時間會長一些,執行命令多一些

MySQL
有各個平台的包rpm包,deb包等等,源碼編譯安裝、二進制包安裝,一般用二進制包安裝,方便快捷
24. DDL操作
PGSQL
加欄位、可變長欄位類型長度改大不會鎖表,所有的DDL操作都不需要藉助第三方工具,並且跟商業資料庫一樣,DDL操作可以回滾,保證事務一致性

MySQL
由於大部分DDL操作都會鎖表,例如加欄位、可變長欄位類型長度改大,所以需要藉助percona-toolkit裡面的pt-online-schema-change工具去完成操作
將影響減少到最低,特別是對大表進行DDL操作
DDL操作不能回滾
25. 大版本發布速度
PGSQL
PGSQL每年一個大版本發布,大版本發布的第二年就可以上生產環境,版本迭代速度很快
PGSQL 9.6正式版推出時間:2016年
PGSQL 10 正式版推出時間:2017年
PGSQL 11 正式版推出時間:2018年
PGSQL 12 正式版推出時間:2019年

MySQL
MySQL的大版本發布一般是2年~3年,一般大版本發布後的第二年才可以上生產環境,避免有坑,版本發布速度比較慢
MySQL5.5正式版推出時間:2010年
MySQL5.6正式版推出時間:2013年
MySQL5.7正式版推出時間:2015年
MySQL8.0正式版推出時間:2018年
26. returning語法
PGSQL
支持returning語法,returning clause 支持 DML 返回 Resultset,減少一次 Client <-> DB Server 交互

MySQL
不支持returning語法
27. 內部架構
PGSQL
多進程架構,並發連接數不能太多,跟Oracle一樣,既然跟Oracle一樣,那麼很多優化方法也是相通的,例如:開啟大頁內存

MySQL
多線程架構,雖然多線程架構,但是官方有限制連接數,原因是系統的並發度是有限的,線程數太多,反而系統的處理能力下降,隨著連接數上升,反而性能下降
一般同時只能處理200 ~300個資料庫連接
28. 聚集索引
PGSQL
不支持聚集索引,PGSQL本身的MVCC的實現機制所導致

MySQL
支持聚集索引
29. 空閑事務終結功能
PGSQL
通過設置 idle_in_transaction_session_timeout 參數來終止空閑事務,比如:應用代碼中忘記關閉已開啟的事務,PGSQL會自動查殺這種類型的會話事務

MySQL
不支持終止空閑事務功能
30. 應付超大數據量
PGSQL
不能應付超大數據量,由於PGSQL本身的MVCC設計問題,需要垃圾回收,只能期待後面的大版本做優化

MySQL
不能應付超大數據量,MySQL自身架構的問題
31. 分布式演進
PGSQL
HTAP資料庫:cockroachDB、騰訊Tbase
分片集群: Postgres-XC、Postgres-XL

MySQL
HTAP資料庫:TiDB
分片集群: 各種各樣的中間件,不一一列舉
32. 資料庫的文件名和命名規律
PGSQL
PGSQL在這方面做的比較不好,DBA不能在操作系統層面(停庫狀態下)看清楚資料庫的文件名和命名規律,文件的數量,文件的大小
一旦操作系統發生文件丟失或硬碟損壞,非常不利於恢復,因為連名字都不知道
PGSQL表數據物理文件的命名/存放規律是: 在一個表空間下面,如果沒有建表空間默認在默認表空間也就是base文件夾下,例如:/data/base/16454/3599
base:默認表空間pg_default所在的物理文件夾
16454:表所在資料庫的oid
3599:就是表對象的oid,當然,一個表的大小超出1GB之後會再生成多個物理文件,還有表的fsm文件和vm文件,所以一個大表實際會有多個物理文件
由於PGSQL的數據文件布局內容太多,大家可以查閱相關資料
當然這也不能全怪PGSQL,作為一個DBA,時刻做好資料庫備份和容災才是正道,做介質恢復一般是萬不得已的情況下才會做

MySQL
資料庫名就是文件夾名,資料庫文件夾下就是表數據文件,但是要注意表名和資料庫名不能有特殊字元或使用中文名,每個表都有對應的frm文件和ibd文件,存儲元數據和表/索引數據,清晰明了,做介質恢復或者表空間傳輸都很方便
33. 許可權設計
PGSQL
PGSQL在許可權設計這塊是比較坑爹,拋開實例許可權和表空間許可權,PGSQL的許可權層次有點像SQL Server,db=》schema=》object
要說許可權,這里要說一下Oracle,用Oracle來類比
在ORACLE 12C之前,實例與資料庫是一對一,也就是說一個實例只能有一個資料庫,不像MySQL和SQL Server一個實例可以有多個資料庫,並且可以隨意跨庫查詢
而PGSQL不能跨庫查詢的原因也是這樣,PGSQL允許建多個資料庫,跟ORACLE類比就是有多個實例(之前說的實例與資料庫是一對一)
一個資料庫相當於一個實例,因為PGSQL允許有多個實例,所以PGSQL單實例不叫一個實例,叫集簇(cluster),集簇這個概念可以查閱PGSQL的相關資料
PGSQL裡面一個實例/資料庫下面的schema相當於資料庫,所以這個schema的概念對應MySQL的database
注意點:正因為是一個資料庫相當於一個實例,PGSQL允許有多個實例/資料庫,所以資料庫之間是互相邏輯隔離的,導致的問題是,不能一次對一個PGSQL集簇下面的所有資料庫做操作
必須要逐個逐個資料庫去操作,例如上面說到的安裝pg_stat_statements插件,如果您需要在PGSQL集簇下面的所有資料庫都做性能收集的話,需要逐個資料庫去執行載入命令
又例如跨庫查詢需要dblink插件或fdw插件,兩個資料庫之間做查詢相當於兩個實例之間做查詢,已經跨越了實例了,所以需要dblink插件或fdw插件,所以道理非常簡單
許可權操作也是一樣逐個資料庫去操作,還有一個就是PGSQL雖然像SQL Server的許可權層次結構db=》schema=》object,但是實際會比SQL Server要復雜一些,還有就是新建的表還要另外授權
在PGSQL裡面,角色和用戶是一樣的,對新手用戶來說有時候會傻傻分不清,也不知道怎麼去用角色,所以PGSQL在許可權設計這一塊確實比較坑爹

MySQL
使用mysql庫下面的5個許可權表去做許可權映射,簡單清晰,唯一問題是缺少許可權角色
user表
db表
host表
tables_priv表
columns_priv表

1. 架構對比
Mysql:多線程
PostgreSql:多進程
多線程架構和多進程架構之間沒有絕對的好壞,例如oracle在unix上是多進程架構,在windows上是多線程架構。

2. 對存儲過程及事務的支持能力
MySql對於無事務的MyISAM表,採用表鎖定,一個長時間運行的查詢很可能會長時間的阻礙,而PostgreSQL不會尊在這種問題。
PostgreSQL支持存儲過程,要比MySql好,具備本地緩存執行計劃的能力。

3. 穩定性及性能
高並發讀寫,負載逼近極限下,PG的性能指標仍可以維持雙曲線甚至對數曲線,到頂峰之後不再下降,而 MySql 明顯出現一個波峰後下滑(5.5版本後Mysql企業版有優化,需要付費)
MySql的InnoDB引擎,可以充分優化利用系統的所有內存,超大內存下PG對內存使用的不那麼充分(需要根據內存情況合理分配)。

4. 高可用
InnoDB的基於回滾實現的 MVCC 機制,對於 PG 新老數據一起放的基於 XID 的 MVCC機制,是占優的。新老數據一起存放,需要定時觸發 VACUUM,會帶來多餘的 IO 和資料庫對象加鎖開銷,引起資料庫整理的並發能力下降。而且 VACUUM 清理不及時,還可能會引發數據膨脹

5. 數據同步方式:
Mysql到現在也是非同步復制,pgsql可以做到同步、非同步、半同步復制。
Mysql同步是基於binlog復制,屬於邏輯復制,類似於oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合非同步復制;
Pgsql的同是基於wal,屬於物理復制,可以做到同步復制。同時,pgsql還提供stream復制。
Mysql的復制可以用多級從庫,但是在9.2之前,PgSql不能用從庫帶從庫。
Pgsql的主從復制屬於物理復制,相對於Mysql基於binlog的邏輯復制,數據的一致性更加可靠,復制性能更高,對主機性能的影響也更小。

6. 許可權控制對比
MySql允許自定義一套不同的數據級、表級和列的許可權,運行指定基於主機的許可權
Mysql的merge表提供了 一個獨特管理多個表的方法。myisampack可以對只讀表進行壓縮,以後仍然可以直接訪問該表中的行。

7. SQL語句支持能力
PG有極其強悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,例如分析函數(Oracle的叫法,PG里叫window函數)
支持用多種語言來寫存儲過程,對於R的支持也很好。這一點上Mysql就差的很遠,很多分析功能都不支持。
PgSql對表名大小寫的處理,只有在Sql語句中,表明加雙引號,才區分大小寫。
在Sql的標准實現上要比Mysql完善,而且功能實現比較嚴謹。
對表連接支持比較完整,優化器的功能比較完整,支持的索引類型很多,復雜查詢能力較強。
Mysql採用索引組織表,這種存儲方式非常適合基於主鍵匹配的查詢、刪改操作,但是對表結果設計存在約束;
Mysql的Join操作的性能非常的差,只支持Nest Join,所以一旦數據量大,性能就非常的差。PostgresSQL除了支持 Nest Join 和 Sort Merge Join,PostgreSQL還支持正則表達式查詢,MySql不支持。

8. 數據類型支持能力
PostgreSQL可以更方便的使用UDF(用戶定義函數)進行擴展。
有豐富的幾何類型,實際上不止集合類型,PG有大量的字典、數組、bitmap等數據類型,因此PG多年來在 GIS 領域處於優勢地位。相比之下Mysql就差很多,instagram就是因為PG的空間數據擴展 PostGIS遠遠強於 MySql的 my spatial 而採用 PgSql的。Mysql中的空間數據類型有4種,分別是 CEOMETRY、POINT、LINESTRING、POLYGON,其空間索引只能在存儲引擎為 MyiSam的表中創建,用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明為NOT NULL。不同的存儲親情有差別。MyISAM和InnoDB 都支持 spatial extensions,但差別在於:如果使用MyISAM,可以建立 spatial index,而 InnoDB是不支持的。
pgsql對json支持比較好,還有很逆天的fdw功能,就是把別的資料庫中的表當自己的用。
pgsql的欄位類型支持的多,有很多mysql沒有的類型,但是實際中有時候用到。
一半關系型資料庫的字元串長度8k左右,無限長的 TEXT 類型的功能受限,只能作為外部帶數據訪問。而 PG 的 TEXT 類型可以直接訪問,SQL 語法內置正則表達式,可以索引,還可以全文檢索,或使用 xml xpath。用 PG 的話,文檔資料庫都可以省了。
postgresql 有函數,用於報表、統計很方便
PG支持 R-Trees這樣可擴展的索引類型,可以方便的處理一些特殊數據。
PG可以使用函數和條件所以,使得資料庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。

9. 如可過程容錯能力
大批量數據入庫,PostgreSql要求所有的數據必須完全滿足要求,有一條錯誤,整個數據入庫過程失敗。MySql無此問題。

10. 表組織方式
pgsql用繼承的方式實現分區表,讓分區表的使用不方便且性能差,這點比不上mysql。
pg主表採用堆表存放,MySQL採用索引組織表,能夠支持比MySql更大的數據量。
MySql分區表的實現要優於PG的基於繼承表的分區實現,主要體現在分區個數達到成千上萬後的處理性能差異很大。

11. 開發結構
對於web應用來所,mysql 5.6 的內置 MC API 功能很好用,PgSQL差一些。
PG的「無鎖定」特性非常突出,甚至包括 vacuum 這樣的整理數據空間的操作,這個和 PGSQL的 MVCC 實現有關系。

好文要頂 關注我 收藏該文
茄子777
粉絲 - 0 關注 - 0
+加關注
00
« 上一篇: 多線程中的wait與join
» 下一篇: 負載均衡相關
posted @ 2022-11-02 16:20 茄子777 閱讀(55) 評論(0) 編輯 收藏 舉報
刷新評論刷新頁面返回頂部
登錄後才能查看或發表評論,立即 登錄 或者 逛逛 博客園首頁
【推薦】阿里雲新人特惠,爆款雲伺服器2核4G低至0.46元/天
【推薦】雙十一同價!騰訊雲雲伺服器搶先購,低至4.2元/月
編輯推薦:
· 一個有趣的 nginx HTTP 400 響應問題分析
· 誰說.NET沒有GC調優?只改一行代碼就讓程序不再佔用內存
· 為什麼標准庫的模板變數都是 inline 的
· .net 如何優雅的使用 EFCore
· 在 C# 中使用 Halcon 開發視覺檢測程序
閱讀排行:
· Entity Framework Core 7中高效地進行批量數據插入
· 除了 filter 還有什麼置灰網站的方式?
· 快速繪制流程圖「GitHub 熱點速覽 v.22.47」
· 使用.NET7和C#11打造最快的序列化程序-以MemoryPack為例
· 私藏!資深數據專家SQL效率優化技巧 ⛵

⑨ golang有沒有好的開源游戲框架

1.為什麼golang的開發效率高? golang是一編譯型的強類型語言,它在開發上的高效率主要來自於後發優勢,不用考慮舊有惡心的歷史,又有一個較高的工程視角。

⑩ 01-Kubernetes 組件介紹

當你部署完 Kubernetes, 即擁有了一個完整的集群。

一個 Kubernetes 集群由一組被稱作節點的機器組成。這些節點上運行 Kubernetes 所管理的容器化應用。集群具有至少一個工作節點。

工作節點託管作為應用負載的組件的 Pod 。控制平面管理集群中的工作節點和 Pod 。 為集群提供故障轉移和高可用性,這些控制平面一般跨多主機運行,集群跨多個節點運行。

本節概述了交付正常運行的 Kubernetes 集賀蔽群所需的各種組件。

從上面的構架圖可以看出來整個kubernetes集群分為control plane(master)和node節點兩部份。master組件是集群的「腦力」輸出者。它維護有kubernetesr 的所有對象記錄,負責持續管理對象狀態並響應集群中各種資源對象的管理操作,以及確保各資源對象的實際狀態與所需狀態相匹配。主要由API Server(kube-apiserver)、Control Manager(kube-controller-manager)和Scheler(kube-scheler)這3個組件。以及一個用於集群狀態存儲的etcd存儲服務組成。

kube-apiserver

API Server是 Kubernetes控制平台的前端。支持不同類型應用的生命周期編排,包括部署、縮放和滾動更新等。還是整個集群的網關介面,由kube-apiserver守護程序運行為服務。通過HTTP/HTTPS協議將RESTful API公開給用戶。是發往集群的所有REST操乎核作命令的接入點,並提供認證、授權、訪問控制、API注冊和發現等所有的REST請求。並將結果狀態持久存儲於集群狀態存儲系統(etcd)中。

kube-apiserver 支持同時提供 https(默認監聽在 6443 埠)和 http API(默認監聽在 127.0.0.1 的 8080 埠),其中 http API 是非安全介面,不做任何認證授權機制,不建議生產環境啟用。兩個介面提供的 REST API 格式相同

kube-controller-manager

Control Manager負責實現用戶通過API Server提交的終態聲明。它通過一系列操作步驟驅動API對象的當前狀態逼近或同於期望狀態。Kubernetes提供了驅動Node、Pod、Server、Endpoint、ServiceAccount和Token等數十種類型的API對象的控制器。從邏輯上講,每個控制器都是一個單獨的進程, 但是為了降低復雜性,它禪頃州們都被編譯到同一個可執行文件,並在一個進程中運行。

控制器包括:

kube-scheler

Scheler是指為API Server 接收到的每一個pod創建請求,並在集群中為其匹配出一個最佳的工作節點為。調度決策考慮的因素包括單個 Pod 和 Pod 集合的資源需求、硬體/軟體/策略約束、親和性和反親和性規范、數據位置、工作負載間的干擾和最後時限等特性。

etcd

kubernetes集群的所有狀態信息都需要持久存儲於存儲系統etcd中。etcd是由CoreOS基於Raft協議開發的分布式鍵值存儲。可用於服務發現。共享配置以及一致性保障。生產環境中應該以etcd集群的方式運行以確保其服務可用性,並需要制周期備份策略以確保數據安全可靠。

etcd還為其存儲的數據提供了監聽(watch)機制。用於監視和推送變更,API Server是kubernetes集群中唯一能夠與etcd通信的組件。封裝了這種監聽機制。並藉此同其他各組件高效協同。

Node組件是集群中的「體力」輸出者,因而一個集群通常會有多個Node以提供足夠的承載力來運行容器化應用和其他工作負載。

kubelet

kubelet是運行於每個node節點之上的「節點代理」服務,負責維護容器的生命周期,同時也負責Volume(CSI)和網路(CNI)的管理;其主要功能概括如下:

持續監聽node的健康狀態並向master匯報。

基於用戶自定義的探針進行存活狀態探測,並在任何Pod出現問題時將其重建為新實例。

准備pod所需的數據卷

返回pod的狀態

在node節點執行容器的健康檢測

Pod是一組容器組成的集合並包含這些容器的管理機制。安並未額外定義進程的邊界或其他更多抽象,因此真正負責運行容器的依然是底層的容器運行時。kubelet通過CRI(容器運行時介面)可支持多種類型的OCI容器運行時,例如docker、 containerd、CRI-O、runC、fraki和kata Containers等

kube-proxy

kube-proxy也是需要運行於集群中每個節點之上的服務進程。它把API Server上的Service資源對象轉換為當前節點上的iptables或與ipvs規則。這些規則能夠將那些發往該Service對象ClusterIP的流量分發至它後端的Pod端點上。kube-proxy是kubernetes的核心網路組件。它本質上更象是Pod的代理及負載均衡器。負責確保集群中Node、Service和Pod對象之間的有效通信 。

kube-proxy 不同的版本可支持三種工作模式

UserSpace: kubernetes V1.1之前使用,V1.2及以後就已淘汰

IPtables: Kubernetes 1.1版本開始支持。1.2開始為默認

IPVS: kubernetes 1.9引入到1.11為正式版本,需要安裝ipvadm、ipset工具包和載入ip_vs內核模塊。

kubectl 概述

是一個通過命令行對kubernetes集群管理的工具

基於Web的用戶介面,用於可視化k8s集群。dashborad可用於獲取集群中資源對象的詳細信息,Dashboard提供GUI,作為運維人員,使用kubectl命令行工具管理足矣

CoreDNS負責為整個集群提供DNS服務,它自1.11版本起默認使用CoreDNS,一種靈活,可擴展的DNS服務,之前的版本用到的是kube-dns項目,SkyDNS則是更早一代的解決方案。

熱點內容
萬科海上傳奇二期 發布:2024-11-01 14:22:52 瀏覽:59
u盤文件夾是空的 發布:2024-11-01 14:19:57 瀏覽:402
python包含字元串 發布:2024-11-01 14:19:17 瀏覽:479
c語言的精華 發布:2024-11-01 14:19:02 瀏覽:588
steam截圖文件夾 發布:2024-11-01 14:18:59 瀏覽:613
ipad怎麼往安卓傳照片 發布:2024-11-01 14:18:19 瀏覽:508
我的電腦沒有文件夾選項 發布:2024-11-01 14:13:55 瀏覽:546
vb創建資料庫表 發布:2024-11-01 14:11:55 瀏覽:872
sql聯合表 發布:2024-11-01 14:03:25 瀏覽:962
linux編程gcc 發布:2024-11-01 14:02:41 瀏覽:705