MySQL 可重複讀,差點就讓我背上了一個 P0 事故!_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

小黑黑的碎碎念

哎,最近有點忙,備考複習不利,明天還要搬家,好難啊!!

本想着這周鴿了,但是想想還是不行,爬起來,更新一下,周更可不能斷。偷懶一下,修改一下之前的一篇歷史文章,重新發布一下。

先贊后看,微信搜索「程序通事」,關注就完事了

P0 事故:餘額多扣!

這是一個真實的生產事件,事件起因如下:

現有一個交易系統,每次產生交易都會更新相應賬戶的餘額,出賬扣減餘額,入賬增加餘額。

為了保證資金安全,餘額發生扣減時,需要比較現有餘額與扣減金額大小,若扣減金額大於現有餘額,扣減餘額不足,扣減失敗。

賬戶表(省去其他字段)結構如下:

CREATE TABLE `account`
(
    `id`      bigint(20) NOT NULL,
    `balance` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`id`)

) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;

扣減餘額時,sql 語序如下所示:

ps:看到上面的語序,有沒有個小問號?為什麼相同查詢了這麼多次?

其實這些 SQL 語序並不在同個方法內,並且有些方法被抽出復用,所以導致一些相同查詢結果沒辦法往下傳遞,所以只得再次從數據庫中查詢。

為了防止併發更新餘額,在 t3 時刻,使用寫鎖鎖住該行記錄。若加鎖成功,其他線程的若也執行到 t3,將會被阻塞,直到前一個線程事務提交。

t5 時刻,進入到下一個方法,再次獲取賬戶餘額,然後在 Java 方法內比較餘額與扣減金額,若餘額充足,在 t7 時刻執行更新操作。

上面的 SQL 語序看起來沒有什麼問題吧,實際也是這樣的,賬戶系統已經在生產運行很久,沒出現什麼問題。但是這裏需要說一個前提,系統數據庫是 Oracle

但是從上面表結構,可以得知此次數據庫被切換成 MySQL,系統其他任何代碼以及配置都不修改(sql 存在小改動)。

就是這種情況下,併發執行發生餘額多扣,即實際餘額明明小於扣減金額,但是卻做了餘額更新操作,最後導致餘額變成了負數。

下面我們來重現併發這種情況,假設有兩個事務正在發執行該語序,執行順序如圖所示。

注意點:數據庫使用的是 MySQL,默認事務隔離等級,即 RR。數據庫記錄為 id=1 balance=1000,假設只有當時只有這兩個事務在執行。

各位讀者可以先思考一下,t2,t3,t4,t5,t6,t11 時刻餘額多少。

下面貼一下事務隔離等級RR 下的答案。

事務1 的查詢結果為:

  • t2 (1,1000)
  • t4 (1,1000)
  • t6 (1,1000)

事務 2 的查詢結果為:

  • t3 (1,1000)
  • t5 (1,900)
  • t11 (1,1000)

有沒有跟你想的結果的一樣?

接着將事務隔離等級修改成 RC,同樣再來思考一下 t2,t3,t4,t5,t6,t11 時刻餘額。

再次貼下事務隔離等級RC 下的答案。

事務1 的查詢結果為:

  • t2 (1,1000)
  • t4 (1,1000)
  • t6 (1,1000)

事務 2 的查詢結果為:

  • t3 (1,1000)
  • t5 (1,900)
  • t11 (1,900)

事務 1 的查詢結果,大家應該會沒有什麼問題,主要疑問點應該在於事務 2,為什麼換了事務隔離等級結果卻不太一樣?

下面我們先帶着疑問,了解一下 MySQL 的相關原理 ,看完你就會明白這一切。

  • MVCC
  • 一致性視圖
  • 快照讀與當前讀

MVCC

我們先來看下一個簡單的例子,

事務隔離等級為 RR , id=1 balance=1000

事務 1 將 id=1 記錄 balance 更新為 900,接着事務 2 在 t5 時刻查詢該行記錄結果,很顯然該行記錄應該為 id=1 balance=1000

如果 t5 查詢最新結果 id=1 balance=900,這就讀取到事務 1 未提交的數據,顯然不符合當前事務隔離級別

從上面例子可以看到 id=1 的記錄存在兩個版本,事務 1 版本記錄為 balance=1000 ,事務 2 版本記錄為 balance=900

上述功能,MySQL 使用 MVCC 機制實現功能。

MVCC:Multiversion concurrency control,多版本併發控制。摘錄一段淘寶數據庫月報的解釋:

多版本控制: 指的是一種提高併發的技術。最早的數據庫系統,只有讀讀之間可以併發,讀寫,寫讀,寫寫都要阻塞。引入多版本之後,只有寫寫之間相互阻塞,其他三種操作都可以并行,這樣大幅度提高了InnoDB的併發度。在內部實現中,與Postgres在數據行上實現多版本不同,InnoDB是在undolog中實現的,通過undolog可以找回數據的歷史版本。找回的數據歷史版本可以提供給用戶讀(按照隔離級別的定義,有些讀請求只能看到比較老的數據版本),也可以在回滾的時候覆蓋數據頁上的數據。在InnoDB內部中,會記錄一個全局的活躍讀寫事務數組,其主要用來判斷事務的可見性。

可以看到 MVCC 主要用來提高併發,還可以用來讀取老版本數據。

在學習 MVCC 原理之前,首先我們需要了解 MySQL 記錄結構。

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

如上圖所示,account 表一行記錄,除了真實數據之外,還會存在三個隱藏字段,用來記錄額外信息。

  • DB_TRX_ID:事務id。

  • DB_ROLL_PTR: 回滾指針,指向 undolog。

  • ROW_ID:行 id,與此次無關。

MySQL InnoDB 裏面每個事務都會有一個唯一事務 ID,它在事務開始的時候會跟 InnoDB 的事務系統申請的,並且嚴格按照順序遞增的。

每次事務更新數據時,將會生成一個新的數據版本,然後會把當前的事務 id 賦值給當前記錄的 DB_TRX_ID。並且數據更新記錄(1,1000—->1,900)將會記錄在 undo log(回滾日誌)中,然後使用當前記錄的 DB_ROLL_PTR 指向 und olog。

這樣 MySQL 就可以通過 DB_ROLL_PTR 找到 undolog 推導出之前版本記錄內容。

查找過程如下:

若需要知道 V1 版本記錄,首先根據當前版本 V3 的 DB_ROLL_PTR 找到 undolog,然後根據 undolog 內容,計算出上一個版本 V2。以此類推,最終找到 V1 這個版本記錄。

V1,V2 並不是物理記錄,沒有真實存在,僅僅具有邏輯意義。

一行數據記錄可能同時存在多個版本,但並不是所有記錄都能對當前事務可見。不然上面 t5 就可能查詢到最新的數據。所以查找數據版本時候 MySQL 必須判斷數據版本是否對當前事務可見

一致性視圖

MySQL 會在事務開始后建立一個一致性視圖(並不是立刻建立),在這個視圖中,會保存所有活躍的事務(還未提交的事務)。

假設當前事務保存活躍事務數組為如下圖。

判斷版本對於當前事務是否可見時,基於以下規則判斷:

  1. 若版本事務 id 小於當前活躍事務 id 數組最小值,比如版本 id 為 40,小於活躍數組最小值 45。這就代表當前版本的事務已提交,當前版本對於當前事務可見。

  2. 若版本事務 id 大於當前活躍事務數組的最大值,如版本事務 id 為 100, 大於數組最大事務 id 90。說明了這個版本是當前事務創建之後生成,所以這個版本對於當前事務不可見。

  3. 若版本事務 id 是當前活躍數組事務之一,比如版本事務 id 為 56。代表記錄版本所屬事務還未提交,所以該版本對於當前事務不可見。

  4. 若版本事務 id 不是當前活躍數組事務之一,但是事務 id 位於活躍數組最小值與最大值之一,比如如事務 ID 57。代表當前記錄事務已提交,所以該版本對於當前事務可見。

  5. 若版本事務 id 為當前事務 id,代表該行數據是當前事務變更的,當然得可見。

4 這個規則可能比較繞,結合上面圖片比較好理解。

以上判斷規則可能比較抽象,看不懂,沒事,我們再用大白話解釋一下:

  1. 未提交事務生成的記錄版本,不可見。

  2. 視圖生成前,已提交事務生成記錄版本可見。

  3. 視圖生成后,新事務生成記錄版本不可見。

  4. 自身事務更新永遠可見。

一致性視圖只會在 RR 與 RC 下才會生成,對於 RR 來說,一致性視圖會在第一個查詢語句的時候生成。而對於 RC 來說,每個查詢語句都會重新生成視圖。

當前讀與快照讀

MySQL 使用 MVCC 機制,可以讀取之前版本數據。這些舊版本記錄不會且也無法再去修改,就像快照一樣。所以我們將這種查詢稱為快照讀

當然並不是所有查詢都是快照讀,select …. for update/ in share mode 這類加鎖查詢只會查詢當前記錄最新版本數據。我們將這種查詢稱為當前讀。

問題分析

講完原理之後,我們回過頭分析一下上面查詢結果的原因。

這裏我們將上面答案再貼過來。

事務隔離級別為 RR,t2,t3 時刻兩個事務由於查詢語句,分別建立了一致性視圖。

t4 時刻,由於事務 1 使用 select.. for update 為 id=1 這一行上了一把鎖,然後獲取到最新結果。而 t5 時刻,由於該行已被上鎖,事務 2 必須等待事務 1 釋放鎖才能繼續執行。

t6 時刻根據一致性視圖,不能讀取到其他事務提交的版本,所以數據沒變。t8 時刻餘額扣減 100,t9 時刻提交事務。

此時最新版本記錄為 id=1 balance=900

由於事務 1 事務已提交,行鎖被釋放,t5 成功獲取到鎖。由於 t5 是當前讀,所以查詢的結果為最新版本數據(1,900)。

重點來了,當前這條記錄的最新版本數據為 (1,900),但是最新版本事務 id,卻是事務 2 創建之後未提交的事務,位於活躍事務數組中。所以最新記錄版本對於事務 2 是不可見的。

沒辦法只能根據 undolog 去讀取上一版本記錄 (1,1000) ,這個版本記錄剛好對於事務 2 可見,所以 t11 的記錄為 (1,1000)

而當我們將事務隔離等級修改成 RC,每次都會重新生成一致性視圖。所以 t11 時刻重新生成了一致性視圖,這時候事務 1 已提交,當前最新版本的記錄對於事務 2 可見,所以 t11 的結果將會變為 (1,900)

總結

MySQL 默認事務隔離等級為 RR,每一行數據(InnoDB)的都可以有多個版本,而每個版本都有獨一的事務 id。

MySQL 通過一致性視圖確保數據版本的可見性,相關規則總結如下:

  • 對於 RR 事務隔離等級,普通查詢僅能查到事務啟動前就已經提交完成的版本數據。
  • 對於 RC 事務隔離等級,普通查詢可以查到查詢語句啟動前就已經提交完成的版本數據。
  • 當前讀總是讀取最新版本的數據。

幫助文檔

1: https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
2 http://mysql.taobao.org/monthly/2017/12/01/
3 http://mysql.taobao.org/monthly/2018/11/04/
4 https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
5 極客時間- MySQL 專欄–事務到底是隔離的還是不隔離的

歡迎關注我的公眾號:程序通事,獲得日常乾貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:studyidea.cn

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

10萬自主SUV怎麼選 工薪家庭的最愛哪些車?_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

0理念設計的首款SUV,造型非常的個性張揚,整體輪廓結實富有力量感,凌雲翼式的家族進氣格柵看上去很大氣端莊,層次感豐富。內飾雖然設計得比較簡單,但是很有特色,環抱式的設計搭配鋼琴烤漆面板和鍍鉻飾件,營造了很上檔次的氛圍,而六邊形的中控台和按鍵都是很有個性的設計,胎壓監測、上坡輔助、陡坡緩降、定速巡航、前排座椅加熱等配置非常豐富。

江鈴汽車-馭勝S330

指導價:8.88-14.08萬

馭勝S330外觀非常年輕時尚,車頭設計得非常穩重,誇張的大進氣格柵搭配着兩側的C型日間行車燈,給人很兇猛的感覺,車身側面的腰線強而有力,懸浮式的車頂非常炫酷,后尾燈的造型與頭燈相互呼應,非常耐看。

中控台的造型較為方正,運用了大量平直的線條,整體看上很簡潔、大氣,軟質材料包裹,鍍鉻飾件、真皮等材質處理過的中控台質感上面還是很不錯的,觸碰感應的中控區域沒有任何物理按鍵,很有科技感,無鑰匙進入/啟動、感應雨刷、自動頭燈、倒車影像等配置應有盡有。

座椅的造型比較運動,填充物的軟硬適中,乘坐感受還是挺舒適的,腿部空間很寬敞,全景天窗也是其一大亮點,後備箱大小也足夠日常使用;全系標配1.5T發動機最大功率163馬力,搭配6擋手動或者6擋手自一體變速器,動力輸出較為平順,底盤調校以舒適為主。

廣汽乘用車-傳祺GS4

指導價:9.98-15.38萬

傳祺GS4算得上是來勢洶洶的一輛SUV了,一上市的銷量就破萬,這也難怪,其外觀的自主原創度非常高,是廣汽採用光影雕塑2.0理念設計的首款SUV,

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

造型非常的個性張揚,整體輪廓結實富有力量感,凌雲翼式的家族進氣格柵看上去很大氣端莊,層次感豐富。

內飾雖然設計得比較簡單,但是很有特色,環抱式的設計搭配鋼琴烤漆面板和鍍鉻飾件,營造了很上檔次的氛圍,而六邊形的中控台和按鍵都是很有個性的設計,胎壓監測、上坡輔助、陡坡緩降、定速巡航、前排座椅加熱等配置非常豐富。

4510*1852*1708mm的車身尺寸在同級別車型中不佔優勢,但是實際空間表現還是令人滿意的,身高180cm的體驗者後排腿部空間達到兩拳,頭部空間還有一拳,1.3T發動機採用多點電噴、雙渦管渦輪增壓等技術,最大功率137馬力,已經達到部分2.0L自吸發動機的水平了,搭配7速雙離合變速器,低扭表現充足,動力輸出線性。

長城汽車-哈弗H2

指導價:8.68-12.88萬

對於哈弗的車型有人就搞不清楚了 ,紅標藍標的糾結是什麼鬼,其實這個就是哈弗產品線戰略,紅色LOGO車型側重豪華,實用;而藍色LOGO車型更加運動時尚,哈弗H2的整個風格更偏向於運動,六邊形的進氣格柵更加個性化,雙邊雙出的排氣管運動氣息濃厚。

藍標H2的內飾中控台材質用料更加講究,鍍鉻飾條、烤漆面板的合理搭配營造了很好的質感享受,真皮打孔的方向盤手感不錯,电子駐車和自動駐車是藍標全系標配,非常的厚道,自動頭燈、倒車影像、無鑰匙進入/啟動、胎壓監測等配置一應俱全。

雙色拼接的座椅看起來很時尚,2560mm軸距帶來的空間感受中規中矩,儲物空間也比較豐富,滿足日常使用,動力是大家熟悉的1.5T發動機最大功率150馬力,搭配6擋手動或者6擋手自一體變速箱,動力強勁,加速很線性,前後獨立懸挂的組合兼顧操控以及舒適性。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

Apple 準備好了?爆料者披露該公司預計將在三月推出有 12 核心的新 Mac_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

Apple 透過 M1 這顆整合了自家技術實力在內的新處理器,向世界宣示要讓 Mac 從此走入採用自製處理器的新里程碑。不過光是 M1 的效能強悍還不夠,很多在電腦效能上需求更高的用戶仍然不夠滿意。畢竟先不說效能上還有許多相容問題需要克服,M1 畢竟是針對筆電使用情境而生的省電型處理器。Apple 還缺乏一顆夠強的桌上型電腦用的處理器。有爆料者就稱,Apple 很快會推出 Apple Silicon 的第二顆處理器,而且這個處理器將具有 12 核心:

▲(圖片來源)

M1 的威力很多人都領教到了。雖然這個打頭陣的先鋒在玩家眼中仍然有許多進步空間,例如軟體相容性之類的問題。但 Apple 確實讓 M1 收穫了許多用戶的心。一個效能上打旗艦處理器,節能又打擊許多超低電壓處理器的新鮮玩意,即便有許多缺點存在,仍然讓許多用戶痴迷不已。

M1 後繼處理器將具備 12 核心,可能在三月問世

不過,M1 的後繼者會不會有更好的表現,並且要等待多久才會推出,這些都是很多焦急的高階用戶關心的地方。要知道 M1 效能雖強,但對於重度應用來說仍有所不足之處。用戶仍然希望 Apple 盡快把更快的處理器生產出來,應用在新 Mac 上。

一位 Twitter 用戶 LeaksApplePro 就挖掘了一條關於新處理器的八卦出來。,表示 Apple 將在三月推出新的處理器,這顆處理器目前型號不明,按照過去慣例,可能叫做 M1X 或 M2。除此之外更爆料新處理器具備更多的 12 核心。如果架構相近甚至幾乎一樣的話,更多的核心理所當然的效能會更高。若是全新架構,那麼處理器蘊藏的潛能恐怕要比現在的 M1 更強更快也說不定:

▲(翻攝自Twitter)

這顆處理器會應用在哪裡呢?根據名分析師郭明錤的推測,新的 Macbook Pro 將於 2021 年第二季問世,除了是重新設計的外觀外,還具備 14 與 16 兩種螢幕尺寸的版本。如此看來,這個 12 核心的新處理器或許就在新的 Macbook Pro 上推出。但也有玩家認為,Apple 至今尚未推出 Apple Silicon 版的 iMac 電腦,或許下次看到新 iMac 或 iMac Pro 電腦發表時,就是搭載新處理器的時候:

▲(圖片來源)

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

不過,關於桌上型電腦的部分,Apple 具傳正在開發採用 5nm 製程的 A14T 晶片來應用在桌機上。由於桌機不似筆電那樣需要續航力的部分,或許這顆 A14T 才會是新 iMac 所採用的處理器。但 A14T 與這個謠傳 12 核心的新處理器是不是同一個,則要看 Apple 官方公布時給出的資訊是哪一個啦。

消息來源:LeaksApplePro、wccftech

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

小米 10i 5G 印度發表:搭載高通 750G 5G 處理器、1.08 億像素主相機、 120Hz更新率螢幕與 4820mAh 大電量_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

小米在中國、印度以及其他海外市場,經常會有些手機以不同名稱在當地推出,像是昨(5)日才剛於印度發表的「小米 10i 5G」就是很好的例子。昨天小米在印度發表小米 10i 5G 這款新機,眼尖的人或許會發現他有些眼熟,因為它其實就是去年小米在中國推出的 Redmi Note 9 Pro 更名上市新機。

小米 10i 5G 印度發表:搭載高通 750G 5G 處理器、1.08 億像素主相機、 120Hz更新率螢幕與 4820mAh 大電量

去年印度率先發表 Redmi Note 9 Pro ,隨後在中國也推出了 Redmi Note 9 Pro 但在外觀、規格皆與印度版本不同。近日小米於印度發表「小米 10i 5G」新機,也就是中國版的 Redmi Note 9 Pro 。
硬體規格方面,小米 10i 5G 搭載 Qualcomm Snapdragon 750G 5G 處理器、配備最高 8GB LPDDR4X RAM、256GB UFS2.2 ROM :

相機方面,小米 10i 5G 配備 1.08 億像素四鏡頭主相機,鏡頭依序為 1.08 億像素標準鏡頭(Samsung ISOCELL HM2 感光元件)、800 萬像素 120° 超廣角鏡頭、200 萬像素微距鏡頭以及 200 萬像素景深鏡頭,前置鏡頭則配被 1600 萬像素自拍相機。

小米 10i 5G 採用 6.67 吋 FHD+ 解析度螢幕,螢幕具備 120Hz 更新率、240Hz 觸控採樣率,顯示支持 HDR10 格式。此外,螢幕採用康寧第五代大猩猩玻璃保護,小米 10i 5G 也具備 IP53 防潑水等級。

電量方面,小米 10i 5G 內建 4820mAh 大電量電池,支持 33W 功率的有線快充能在 58 分鐘為小米 10i 充電至 100% :

其他方面,小米 10i 5G 亦具備 NFC、保留 3.5mm 耳機孔以及採用側邊指紋辨識器進行指紋辨識解鎖。顏色方面,小米 10i 5G 在印度推出 Midnight Black(午夜黑)、Atlantic Blue(大西洋藍)以及帶有漸層色的 Pacific Sunrise(太平洋日出)等三種配色選擇。

小米 10i 5G 在印度共推出三個版本,價格依序為 6GB+64GB 版本售價 23,999  印度盧比(約合新台幣 9,153 元)、8GB+128GB 版本售價 24,999 印度盧比(約合新台幣 9,534 元)、8GB+256GB 版本售價 27,999 印度盧比(約合新台幣 10,678 元),在當地使用特定銀行卡可享 2,000 印度盧比的折扣。

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

圖片/消息來源:Mi India

延伸閱讀:
Redmi K40 Pro 最新渲染圖曝光:可能是最便宜的 S888 旗艦 5G 手機之一

疑似 OPPO Find X3 安兔兔跑分曝光,搭載高通 S888 旗艦處理器測出 77.1 萬分刷新最高分紀錄

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

MySql輕鬆入門系列——第一站 從源碼角度輕鬆認識mysql整體框架圖_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

一:背景

1. 講故事

最近看各大技術社區,不管是知乎,掘金,博客園,csdn基本上看不到有小夥伴分享sqlserver類的文章,看來在國內大環境下是不怎麼流行了,看樣子我再寫sqlserver是不可能再寫了,這輩子都不會寫了,只能靠技術輸出mysql維持生活這樣子。

二:了解架構圖

mysql最大的好處就是開源, 手握百萬源碼,有什麼問題搞不定呢? 這一點要比sqlserver爽多了,不用再dbcc搗來搗去。

1. 從架構圖入手

大家都知道做/裝修房子都要有一張圖紙,其實軟件也是一樣,只要有了這麼一張圖紙,大方向就定下來了,再深入到細節也不會亂了方向,然後給大家看一下我自己畫的架構圖,畫的不對請輕拍。

其實SqlServer,Oracle,MySql架構都大同小異,MySql的鮮明特點就是存儲引擎做成了插拔式,這就牛逼了,現行最常用的是InnoDB,這就讓我有了一個想法,有一套業務準備用 InMemory 模式跑一下,厲害了~~~

2. 功能點介紹

MySql其實就兩大塊,一塊是MySql Server層,一塊就是Storage Engines層。

<1> Client

不同語言的sdk遵守mysql協議就可以與mysqld進行互通。

<2> Connection/Thread Pool

MySql使用C++編寫,Connection是非常寶貴的,在初始化的時候維護一個池。

<3> SqlInterface,Parse,Optimizer,Cache

對sql處理,解析,優化,緩存等處理和過濾模塊,了解了解即可。

<4> Storage Engines

負責存儲的模塊,官方,第三方,甚至是你自己都可以自定義實現這個數據存儲,這就把生態做起來了,。

三: 源碼分析

關於怎麼去下載mysql源碼,這裏就不說了,大家自己去官網搗鼓搗鼓哈,本系列使用經典的 mysql 5.7.14版本。

1. 了解mysql是如何啟動監聽的

手握百萬行源碼,怎麼找入口函數呢??? ,其實很簡單,在mysqld進程上生成一個dump文件,然後看它的託管堆不就好啦。。。

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

從圖中可以看到,入口函數就是 mysqld!mysqld_main+0x227 中的 mysqld_main, 接下來就可以在源碼中全文檢索下。

<1> mysqld_main 入口函數 => sql/main.cc


extern int mysqld_main(int argc, char **argv);

int main(int argc, char **argv)
{
  return mysqld_main(argc, argv);
}

這裏大家可以用visualstudio打開C++源碼,使用查看定義功能,非常好用。

<2> 創建監聽


int mysqld_main(int argc, char **argv)
{
    //創建服務監聽線程
    handle_connections_sockets();
}

void handle_connections_sockets()
{
     //監聽連接
     new_sock= mysql_socket_accept(key_socket_client_connection, sock,
                                    (struct sockaddr *)(&cAddr), &length);

    if (mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock))
      thd->security_ctx->set_host((char*) my_localhost);

    //創建連接
    create_new_thread(thd);
}

//創建新線程處理處理用戶連接
static void create_new_thread(THD *thd){
   
   thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
   
   //線程進了線程調度器
   MYSQL_CALLBACK(thread_scheduler, add_connection, (thd));   
}

至此mysql就開啟了一個線程對 3306 端口進行監控,等待客戶端請求觸發 add_connection 回調。

2. 理解mysql是如何處理sql請求

這裏我以Insert操作為例稍微解剖下處理流程:

當用戶有請求sql過來之後,就會觸發 thread_scheduler的回調函數add_connection


static scheduler_functions one_thread_per_connection_scheduler_functions=
{
  0,                                     // max_threads
  NULL,                                  // init
  init_new_connection_handler_thread,    // init_new_connection_thread
  create_thread_to_handle_connection,    // add_connection
  NULL,                                  // thd_wait_begin
  NULL,                                  // thd_wait_end
  NULL,                                  // post_kill_notification
  one_thread_per_connection_end,         // end_thread
  NULL,                                  // end
};

scheduler_functions 中可以看到,add_connection 對應了 create_thread_to_handle_connection,也就是請求來了會觸發這個函數,從名字也可以看出,用一個線程處理一個用戶連接。

<1> 客戶端請求被 create_thread_to_handle_connection 接管及調用棧追蹤


void create_thread_to_handle_connection(THD *thd)
{
     if ((error= mysql_thread_create(key_thread_one_connection, &thd->real_id, &connection_attrib,
                                     handle_one_connection,(void*) thd))){}
}
//觸發回調函數  handle_one_connection
pthread_handler_t handle_one_connection(void *arg)
{
     do_handle_one_connection(thd);
}
//繼續處理
void do_handle_one_connection(THD *thd_arg){
    while (thd_is_connection_alive(thd))
    {
      mysql_audit_release(thd);
      if (do_command(thd))  break;  //這裏的 do_command 繼續處理
    }
}
//繼續分發
bool do_command(THD *thd)
{
    return_value= dispatch_command(command, thd, packet+1, (uint) (packet_length-1));
}
bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet_length)
{
      switch (command) {
         case COM_INIT_DB: ....  break;
         ...
         case COM_QUERY:   //查詢語句:  insert xxxx
             mysql_parse(thd, thd->query(), thd->query_length(), &parser_state);  //sql解析
           break;
      }
}
//sql解析模塊
void mysql_parse(THD *thd, char *rawbuf, uint length, Parser_state *parser_state)
{
      error= mysql_execute_command(thd);
}

<2> 到這裏它的Parse,Optimizer,Cache都追完了,接下來看sql的CURD類型,繼續追。。。


//繼續執行
int mysql_execute_command(THD *thd)
{
  switch (lex->sql_command) 
  {
      case SQLCOM_SELECT:  res= execute_sqlcom_select(thd, all_tables);  break;

      //這個 insert 就是我要追的
      case SQLCOM_INSERT:   res= mysql_insert(thd, all_tables, lex->field_list, lex->many_values,
		                                      lex->update_list, lex->value_list,
                                              lex->duplicates, lex->ignore);
  }
}
//insert插入操作處理
bool mysql_insert(THD *thd,TABLE_LIST *table_list,List<Item> &fields, List<List_item> &values_list,
                  List<Item> &update_fields, List<Item> &update_values, 
                  enum_duplicates duplic, bool ignore)
{
      while ((values= its++))
      {
           error= write_record(thd, table, &info, &update);
      }
}
//寫入記錄
int write_record(THD *thd, TABLE *table, COPY_INFO *info, COPY_INFO *update)
{
    if (duplicate_handling == DUP_REPLACE || duplicate_handling == DUP_UPDATE)
    {
         // ha_write_row  重點是這個函數
         while ((error=table->file->ha_write_row(table->record[0])))
         {
             ....
         }
    }
}

可以看到,調用鏈還是挺深的,追到 ha_write_row 方法基本上算是追到頭了,再往下的話就是 MySql ServerStorage Engine提供的接口實現了,不信的話繼續看唄。。。

<3> 繼續挖 ha_write_row


int handler::ha_write_row(uchar *buf)
{
    MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error= write_row(buf); })
}

//這是一個虛方法
virtual int write_row(uchar *buf __attribute__((unused)))
{
    return HA_ERR_WRONG_COMMAND;
}

看到沒有,write_row是個虛方法,也就是給底層方法實現的,在這裏就是給各大Storage Engines的哈。

3. 調用鏈圖

這麼多方法,看起來有點懵懵的吧,我來畫一張圖,幫助大家理解下這個調用堆棧。

三:總結

大家一定要熟讀架構圖,有了架構圖從源碼中找信息就方便多了,總之學習mysql成就感還是滿滿的。

如您有更多問題與我互動,掃描下方進來吧~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

不到10萬SUV做出30萬的氣勢 除了眾泰 還有誰?_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

98-14。98萬獵豹汽車 CS10售價:9。68-14。68萬奇瑞汽車 瑞虎5售價:8。88-15。19萬總結:今天所介紹的這幾款SUV真的不差,眾泰T600與東風580都是屬於目前市場上的爆款車型,受到很多消費者的認可,瑞虎5雖然被自家的瑞虎7轉移了不少消費者的目光,但瑞虎家族長期的良好口碑使得它仍然熱度不減,最後的獵豹CS10雖然不聲不響,但銷量一直非常穩定,總體來說這幾款車型都是很值得購買的。

目前自主SUV非常火熱,近來消費者對於自主SUV支持力度也很大,

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

很多人都在問到底什麼車型比較值得購買,除了時下一些熱門的SUV之外,一些缺少宣傳的SUV車型無論在銷量與性價比都表現出色。接來下細看就清楚了。

東風小康 東風風光580

售價:7.29-9.99萬

眾泰汽車 T600

售價:7.98-14.98萬

獵豹汽車 CS10

售價:9.68-14.68萬

奇瑞汽車 瑞虎5

售價:8.88-15.19萬

總結:今天所介紹的這幾款SUV真的不差,眾泰T600與東風580都是屬於目前市場上的爆款車型,受到很多消費者的認可,瑞虎5雖然被自家的瑞虎7轉移了不少消費者的目光,但瑞虎家族長期的良好口碑使得它仍然熱度不減,最後的獵豹CS10雖然不聲不響,但銷量一直非常穩定,總體來說這幾款車型都是很值得購買的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

國際原能總署:伊朗持續增產濃縮鈾 庫存高於限制5倍_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

摘錄自2020年6月8日自由時報報導

國際原子能總署(IAEA)表示,伊朗仍持續增加濃縮鈾的庫存,超過2015年協議規範的5倍,且濃度也仍高於限制。

綜合外媒報導,根據伊朗2015年與美國、英國、法國、德國、俄羅斯和中國簽署的聯合全面行動計畫(JCPOA)中規定,伊朗只能持有上限300公斤的濃縮鈾,且濃度不能超過3.67%。自美國2018年退出協議後,各國越來越難要求伊朗遵守協議規範。

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

在國際原子能總署給成員國的報告中表示,截至5月20日,伊朗持有1571.6公斤的濃縮鈾,高於2月19日的1020.9公斤,且濃度維持在4.5%。報告指出,四個多月以來,伊朗政府不斷在阻止IAEA人員檢查兩個可疑地點。

據悉,國際原子能總署預計將在6月中旬針對報告中的調查結果進行討論。

能源議題
能源轉型
國際新聞
伊朗
國際原能總署
濃縮鈾

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

kubeadm實現k8s高可用集群環境部署與配置_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

高可用架構

k8s集群的高可用實際是k8s各核心組件高可用,這裏使用主備模式,架構如下:

主備模式高可用架構說明:

核心組件 高可用模式 高可用實現方式
apiserver 主備 keepalived
controller-manager 主備 leader election
scheduler 主備 leader election
etcd 集群 kubeadm
  • apiserver 通過keepalived實現高可用,當某個節點故障時觸發keepalived vip 轉移;
  • controller-manager k8s內部通過選舉方式產生領導者(由–leader-elect 選型控制,默認為true),同一時刻集群內只有一個controller-manager組件運行;
  • scheduler k8s內部通過選舉方式產生領導者(由–leader-elect 選型控制,默認為true),同一時刻集群內只有一個scheduler組件運行;
  • etcd 通過運行kubeadm方式自動創建集群來實現高可用,部署的節點數為奇數,3節點方式最多容忍一台機器宕機。

部署環境

k8s版本

kubelet version kubeadm version kubectl version
v1.15.1 v1.15.1 v1.15.1

主機配置

Centos版本 系統內核 docker version flannel version Keepalived version
7.8.2003 4.4.223 19.03.9 v0.11.0 v1.3.5

主機列表

主機名 ip 主機配置 備註
master01 192.168.213.181 4U4G control plane
master02 192.168.213.182 4U4G control plane
master03 192.168.213.183 4U4G control plane
node01 192.168.213.192 2U2G node
node02 192.168.213.192 2U2G node
VIP 192.168.213.200 4U4G 在control plane上浮動

私有倉庫

主機名 ip 主機配置 備註
docker-registry 192.168.213.129 2U1G reg.zhao.com

其他準備

系統初始化,docker安裝,k8s(kubelet、kubeadm和kubectl)安裝省略

  • kubelet 運行在集群所有節點上,用於啟動Pod和容器
  • kubeadm 用於初始化集群,啟動集群
  • kubectl 用於和集群通信,部署和管理應用,查看各種資源,創建、刪除和更新各種組件

啟動kubelet並設置開機啟動 systemctl enable kubelet && systemctl start kubelet

keepalived安裝

在所有master節點上安裝

安裝keepalived

[root@master01 ~]# yum -y install keepalived

keepalived配置

master01

[root@master01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id master01
}
vrrp_instance VI_1 {
    state MASTER 
    interface ens33
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.213.200
    }
}

master02

[root@master02 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id master02
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens33
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.213.200
    }
}

master03

[root@master03 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id master03
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens33
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.213.200
    }
}

啟動keepalived並設置開機啟動

[root@master01 ~]# systemctl start keepalived
[root@master01 ~]# systemctl enable keepalived

VIP查看

配置master節點

初始化master01節點

master01初始化

#初始化的配置文件
[root@master01 ~]# cat kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
apiServer:
  certSANs:		##填寫所有kube-apiserver節點的hostname、IP、VIP
  - master01
  - master02
  - master03
  - node01
  - node02
  - 192.168.213.181
  - 192.168.213.182
  - 192.168.213.183
  - 192.168.213.191
  - 192.168.213.192
  - 192.168.213.200
controlPlaneEndpoint: "192.168.213.200:6443"
networking:
  podSubnet: "10.244.0.0/16"
[root@master01 ~]# kubeadm init --config=kubeadm-config.yaml|tee kubeadim-init.log

記錄kubeadm join的輸出,後面需要這個命令將備master節點和node節點加入集群中

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.213.200:6443 --token ebx4uz.9y3twsnoj9yoscoo \
    --discovery-token-ca-cert-hash sha256:1bc280548259dd8f1ac53d75e918a8ec99c234b13f4fe18a71435bbbe8cb26f3

加載環境變量

[root@master01 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master01 ~]# source .bash_profile

安裝flannel網絡

[root@master01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

備master節點加入集群

配置免密登錄

配置master01到master02、master03免密登錄

#創建秘鑰
[root@master01 ~]# ssh-keygen -t rsa
#將秘鑰同步至master02,master03
[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.213.182
[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.213.183
#免密登陸測試
[root@master01 ~]# ssh master02
[root@master01 ~]# ssh 192.168.213.183

master01分發證書

在master01上運行腳本cert-main-master.sh,將證書分發至master02和master03

[root@master01 ~]# cat cert-main-master.sh
USER=root # customizable
CONTROL_PLANE_IPS="192.168.213.182 192.168.213.183"
for host in ${CONTROL_PLANE_IPS}; do
    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
    # Quote this line if you are using external etcd
    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
done
[root@master01 ~]# ./cert-main-master.sh

備master節點移動證書至指定目錄

在master02,master03上運行腳本cert-other-master.sh,將證書移至指定目錄

[root@master02 ~]# cat cert-other-master.sh
USER=root # customizable
mkdir -p /etc/kubernetes/pki/etcd
mv /${USER}/ca.crt /etc/kubernetes/pki/
mv /${USER}/ca.key /etc/kubernetes/pki/
mv /${USER}/sa.pub /etc/kubernetes/pki/
mv /${USER}/sa.key /etc/kubernetes/pki/
mv /${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
mv /${USER}/front-proxy-ca.key /etc/kubernetes/pki/
mv /${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# Quote this line if you are using external etcd
mv /${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
[root@master02 ~]# ./cert-other-master.sh 

備master節點加入集群

在master02和master03節點上運行加入集群的命令

kubeadm join 192.168.213.200:6443 --token ebx4uz.9y3twsnoj9yoscoo \
    --discovery-token-ca-cert-hash sha256:1bc280548259dd8f1ac53d75e918a8ec99c234b13f4fe18a71435bbbe8cb26f3

備master節點加載環境變量

此步驟是為了在備master節點上也能執行kubectl命令

scp master01:/etc/kubernetes/admin.conf /etc/kubernetes/
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile

node節點加入集群

加入集群

在node節點運行初始化master生成的加入集群的命令

kubeadm join 192.168.213.200:6443 --token ebx4uz.9y3twsnoj9yoscoo \
    --discovery-token-ca-cert-hash sha256:1bc280548259dd8f1ac53d75e918a8ec99c234b13f4fe18a71435bbbe8cb26f3

集群節點查看

[root@master01 ~]# kubectl get nodes
[root@master01 ~]# kubectl get pod -o wide -n kube-system 

所有control plane節點處於ready狀態,所有的系統組件也正常

對接私有倉庫

私有倉庫配置省略,在所有節點上執行以下步驟

修改daemon.json

[root@master01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.213.181 master01
192.168.213.182 master02
192.168.213.183 master03
192.168.213.191 node01
192.168.213.192 node02
192.168.213.129 reg.zhao.com
[root@master01 ~]# cat /etc/docker/daemon.json
{
    "registry-mirrors": ["https://sopn42m9.mirror.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
        "log-opts": {
            "max-size": "100m"
        },
    "insecure-registries": ["https://reg.zhao.com"]
}
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker

創建認證secret

使用Kuberctl創建docker register認證secret

[root@master01 ~]# kubectl create secret docker-registry myregistrykey --docker-server=https://reg.zhao.com --docker-username=admin --docker-password=Harbor12345 --docker-email=""
secret/myregistrykey created
[root@master02 ~]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-6mrjd   kubernetes.io/service-account-token   3      18h
myregistrykey         kubernetes.io/dockerconfigjson        1      19s

在創建Pod的時通過imagePullSecret引用myregistrykey

imagePullSecrets:
  - name: myregistrykey

集群功能測試

測試私有倉庫

[root@master02 ~]# cat test_sc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: reg.zhao.com/zhao/myapp:v1.0
#  imagePullSecrets:
#    - name: myregistrykey

打開註釋,應用密鑰,可以拉取到鏡像

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

測試集群高可用

測試master節點高可用

通過ip查看apiserver所在節點,通過leader-elect查看scheduler和controller-manager所在節點

[root@master01 ~]# ip a|grep ens33
[root@master01 ~]# kubectl get endpoints kube-scheduler -n kube-system -o yaml |grep holderIdentity
[root@master01 ~]# kubectl get endpoints kube-controller-manager -n kube-system -o yaml |grep holderIdentity

組件名 所在節點
apiserver master01
controller-manager master01
scheduler master01

關閉master01,模擬宕機,master01狀態為NotReady

[root@master01 ~]# init 0

VIP飄到了master02,controller-manager和scheduler也發生了遷移

組件名 所在節點
apiserver master02
controller-manager master03
scheduler master02

測試node節點高可用

K8S 的pod-eviction在某些場景下如節點 NotReady,資源不足時,會把 pod 驅逐至其它節點

Kube-controller-manager 周期性檢查節點狀態,每當節點狀態為 NotReady,並且超出 pod-eviction-timeout 時間后,就把該節點上的 pod 全部驅逐到其它節點,其中具體驅逐速度還受驅逐速度參數,集群大小等的影響。最常用的 2 個參數如下:
pod-eviction-timeout:NotReady 狀態節點超過該時間后,執行驅逐,默認 5 min
node-eviction-rate:驅逐速度,默認為 0.1 pod/秒

創建pod,維持副本數3

[root@master02 ~]# cat myapp_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: stabel
  template:
    metadata:
      labels:
        app: myapp
        release: stabel
        env: test
    spec:
      containers:
      - name: myapp
        image: library/nginx
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80

可以看到pod分佈在node01和node02節點上
關閉node02,模擬宕機,node02狀態為NotReady
可以看到 NotReady 狀態節點超過指定時間后,pod被驅逐到 Ready 的節點上,deployment維持運行3個副本

問題

初始化master節點失敗

如果初始化失敗,可執行kubeadm reset后重新初始化

[root@master01 ~]# kubeadm reset
#非root用戶還須執行rm -rf $HOME/.kube/config

flanne文件下載失敗

方法一:可以直接下載kube-flannel.yml文件,然後再執行apply
方法二:配置域名解析
在https://site.ip138.com查詢服務器IP
echo "151.101.76.133 raw.Githubusercontent.com" >>/etc/hosts

節點狀態NotReady

在節點機器上執行journalctl -f -u kubelet查看kubelet的輸出日誌信息如下:

Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

出現這個錯誤的原因是網絡插件沒有準備好,在節點上執行命令 docker images|grep flannel 查看flannel鏡像是否已經成功拉取,這個花費的時間可能會很長

如果很長時間仍然沒有拉下來flannel鏡像,可以使用如下方法解決

docker save把主節點上的flannel鏡像保存為壓縮文件(或在官方倉庫https://github.com/coreos/flannel/releases下載鏡像傳到主機上,要注意版本對應),在節點機器上執行docker load加載鏡像

[root@master02 ~]# docker save -o my_flannel.tar quay.io/coreos/flannel:v0.11.0-amd64
[root@master02 ~]# scp my_flannel.tar node01:/root
[root@node01 ~]# docker load < my_flannel.tar

unexpected token `$’do\r”

shell,運行出錯:syntax error near unexpected token `$’do\r”

原因:Linux和windows下的回車換行符不兼容

解決方法:將windows下面的CR LF,轉換為Linux下面的LF
用notepad++打開文件,編輯->檔案格式轉換->轉換為UNIX格式->保存即可

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

20多萬的車給你50萬的配置!而且這些車相當有面子_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

內飾依然是主打的簡約商務風格,仿木紋面板,鋼琴烤漆面板,石英鐘等裝飾件使質感大大的提升了,貫穿式的空調出風口設計誇張大膽,使整个中控台更有層次感,最具亮點的就是全液晶的儀錶盤了,中間位置多達10種界面可觀查看,丹拿音響、車道偏離系統、感應後備箱等配置非常豐富。

那就需要一個舒適性很好的座椅了,說起座椅,不少人都想起什麼真皮打孔啊,座椅記憶、座椅加熱/通風等功能已經是很不錯了,現在座椅按摩這個高逼格的配置也應用在不少中型車上了,想象一下享受着座椅按摩,打開自適應巡航,多麼舒適愜意,下面來隨小編一起來看一下都配備座椅按摩功能的車型吧!

原理很簡單了,一般低端點的車型是靠座椅裏面的電機來執行按摩的,而高端一點的車型則是靠着氣墊的充氣放氣來達到一個按摩的效果。

上汽通用別克-君越

指導價:22.58-33.98萬

君越在外觀上比老款更加銳利,經典的直瀑式進氣格柵搭配着飛翼式鍍鉻裝飾條,令前臉看上去非常有活力,而且全系標配了主動式進氣格柵,在冬天能迅速的提升水溫,微微上翹的鴨尾式設計尾部很動感流暢,在造型別緻的尾燈襯托下,透露出低調奢華的氣息。

君越環抱式的座艙設計給人很足的安全感,在視覺上給人很寬敞的感覺,木紋飾板和鍍鉻飾條的合理搭配簡單而不失豪華,非常上檔次,常規儀錶+液晶屏的組合依然很方便醒目,自適應遠近光、自動泊車、主動安全系統、HUD抬頭显示等高科技配置一應俱全。

君威的長*寬*高分別為5018*1866*1459mm,軸距達到2905mm,達到了中大型車的水準,乘坐空間上面不必擔憂了,儲物空間數量上也是比較多的,動力系統方面提供了1.5T+7速雙離合/2.0T+6擋手自一體的組合,由於車身減重了很多,加上渦輪介入的轉速較早,動力輸出很線性,提速很流暢平順。

一汽-大眾-邁騰

指導價:18.99-31.69萬

新邁騰相比於老款不再有那麼濃厚的商務氣息了,車燈、中網等整體造型變得更加扁平,貫穿車身的腰線從前翼子板一直延伸到尾燈,

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

流暢而富有激情,全LED的尾燈造型也是十分別緻,飽滿而層次感豐富,四邊形的排氣管設計動感時尚,整車給人成熟穩重的感覺。

內飾依然是主打的簡約商務風格,仿木紋面板,鋼琴烤漆面板,石英鐘等裝飾件使質感大大的提升了,貫穿式的空調出風口設計誇張大膽,使整个中控台更有層次感,最具亮點的就是全液晶的儀錶盤了,中間位置多達10種界面可觀查看,丹拿音響、車道偏離系統、感應後備箱等配置非常豐富。

邁騰的長*寬*高分別為4866*1832*1464mm,軸距達到2871mm,屬於中規中矩的類型,後排可獨立控制空調並配備了220V插口和USB充電口,非常貼心,可摺疊後排頭枕舒適性強,動力系統提供很豐富的選擇,1.4T/1.8T/2.0T+6擋雙離合/7擋雙離合,2.0T發動機動力表現十分出色,隨叫隨到,推背感強烈,懸挂硬朗中帶着韌性,兼顧舒適和操控性。

長安福特-金牛座

指導價:23.38-36.98萬

作為福特品牌旗下的高端旗艦車型,金牛座有着直逼奧迪A6L等C級車的車身尺寸和應該有的強大氣場,前臉採用了經典的大嘴型進氣格柵設計,配合修長的大燈,給人很兇猛的感覺,硬朗有力的腰線令車身側面變得更加協調,表現得更為穩重了。

內飾主打是黑色的主色調配以木紋飾板的點綴,襯托出端莊典雅的氛圍,簡約明了的功能分區布局彰顯了大氣商務的氣息,上乘的內飾用料和嚴謹的裝配工藝,至少視覺上是給人很舒服的感覺,自動駐車、方向盤換擋、前後排座椅加熱/通風/按摩、SONY音響等配置很豐富。

金牛座的後排簡直可以用奢華來形容了,貨真價實的老闆座,獨立空調、座椅按摩、多媒體控制等配置基本齊全,2949mm的軸距帶來了寬敞的乘坐空間,動力方面提供1.5T/2.0T/2.7T的選擇,均搭配6擋手自一體變速箱,日常駕駛中底盤的厚重感較強,動力輸出很平順。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

英國石油預測:全球石油需求2019年封頂、2040年降50%_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家