1. 程式人生 > 實用技巧 >mysql: 多時區的聚合統計

mysql: 多時區的聚合統計

本人要開始學docker了,不知道怎麼就越走越遠了呢,每天在自我懷疑中迴圈往復,我應該感謝所有外力的推動,但內心又在掙扎“這不是我喜歡的”,可是姐妹們都在提醒我成年人了,誰還會為“喜歡”活著,走走看吧。(我還是個孩子,我依舊不想長大)

一、WhyDocker?

這個我看懂了。。https://zhuanlan.zhihu.com/p/54512286

摘要幾點:

1.docker是什麼

軟體容器平臺

2.docker能帶來什麼好處

①開發人員不必再考慮環境(開發、測試、生產)不同帶來的麻煩(1.1)

實現方式:映象

  • 之前:在開發環境構建出了一個war包,想跑到Linux下執行。我們得先在Linux下載好Java、Tomcat、MySQL,配置好對應的環境變數,將war包丟到Tomcat的webapps資料夾下,才能跑起來。
  • 現在:在Linux下直接拉取一份映象(各種環境都配好了),將映象執行起來,把war包丟進去就好了。

② 運維人員可以在隔離容器中並行執行和管理應用,獲得更好的計算密度(1.2)

實現方式:linux的namespace和cgroup。

(lxc是早期版本docker的一個基礎元件,docker 主要用到了它對 Cgroup 和 Namespace 兩個核心特性的控制。新的Docker版本已經移除了對LXC的support,Docker推出libcontainer自己集成了linux核心中的很多特性,作為一個獨特、穩定且不受制於Linux的library,來實現自己生態系統的獨立)

③企業可以構建敏捷的軟體交付管道,可以更快的速度、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應用釋出新功能。

  • 之前,Windows和Mac使用Docker實際上就是跑了一層Linux虛擬機器。
    • 比如在Windows下安裝的是Docker Toolbox,它需要Oracle Virtual Box來跑Docker
  • 現在,Windows和Mac都已經原生支援Docker了。但需要一些安裝的條件,詳情可以檢視官網
    • 比如Windows:Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V

2.1namespace &cgroups

簡單來說,就是:

namespace做隔離

cgroup做資源限制

Linux Namespace 幫助程序隔離出自己的單獨空間,而 Cgroups 則可以限制每個空間的大小。Cgroups 提供了對一組程序及將來子程序的資源限制、控制和統計的能力。

複雜一點,就是:

Namespace
Namespace又稱為名稱空間,它主要做訪問隔離(環境的隔離)。其原理是針對一類資源進行抽象,並將其封裝在一起提供給一個容器使用,對於這類資源,因為每個容器都有自己的抽象,而他們彼此之間是不可見的,所以就可以做到訪問隔離。namespace 主要有以下namespace:

  • PID(Process ID) 程序隔離(同一個程序在不同的 PID Namespace 中可以擁有不同的 PID。一個程序在容器裡一個pid,宿主機上又是另一個pid)
  • NET(Network) 管理網路隔離(隔離網路設定、IP 地址和埠號等網路棧)
  • IPC(InterProcess Communication) 管理跨程序通訊的訪問(訊號量、訊息佇列和共享記憶體)
  • MNT(Mount) 管理掛載點(用來隔離各個程序看到的掛載點檢視)
  • UTS(Unix Timesharing System) 隔離核心和版本標識,例如主機名與域名
  • USER:主要是隔離使用者的使用者組 ID。也就是說,一個程序的 User ID 和 Group ID 在 User Namespace 內外可以是不同的

docker底層的2個核心技術分別是Namespaces和Control groups

Namespace:是容器虛擬化的核心技術,用來隔離各個容器,可解決容器之間的衝突。

主要通過以下六項隔離技術來實現:

  • UTS(Unix Timesharing System):程序隔離。允許每個container擁有獨立的hostname(主機名)和domainname(域名),使其在網路上可以被視作一個獨立的節點而非Host上的一個程序。
  • IPC(InterProcess Communication):contaner中程序互動還是採用linux常見的程序間互動方法,包括常見的訊號量,訊息佇列和共享記憶體。container的程序間互動實際上還是host上具有相同pid中的程序互動。
  • PID(Process ID):不同使用者的程序就是通過pid namesapce隔離開的,且不同namespace中可以有相同pid。所有的LXC(linux containers)程序在docker中的父程序為docker程序,每個LXC程序具有不同的namespace。
  • NET(Network):管理網路隔離。不同使用者的程序就是通過pidnamespace隔離開的,且不同namespace中可以有相同pid。所有的LXC程序在docker中的父程序為docker程序,每個lxc程序具有不同的namespace。
  • MNT(Mount)管理掛載點(用來隔離各個程序看到的掛載點檢視):檔案系統的掛載點。
  • USRE:每個container可以有不同的user和groupid,也就是說可以在container內部用container內部的使用者執行程式而非Host上的使用者。

只要解耦了這6項,其他系統資源即便有共用的情況,計算機也認為是在兩個不同的系統中。

cgroup(控制程式對資源的佔用)

實現cgroup是的主要目的是為不同使用者層面的資源管理,提供一個統一化的介面。從單個程序的資源控制到作業系統層面的虛擬化。

cgroup的作用:

1) 資源的限制:cgroup可以對程序組使用的資源總額進行限制。
2) 優先順序分配:通過分配的cpu時間片數量及磁碟IO頻寬大小,實際上就是相當於控制了程序執行的優先順序
3) 資源統計:Cgroup可以統計系統資源使用量。比如cpu使用時間,記憶體使用量等。
可用於按量計費。
4) 程序控制:可以對程序組執行掛起,恢復等操作。

Cgroup
Cgroup是control group,又稱為控制組,它主要是做資源控制。原理是將一組程序放在放在一個控制組裡,通過給這個控制組分配指定的可用資源,達到控制這一組程序可用資源的目的。

一個容器如果不對其做任何資源限制,則宿主機會允許其佔用無限大的記憶體空間,有時候會因為程式碼bug程式會一直申請記憶體,直到把宿主機記憶體佔完。
為了避免此類的問題出現,宿主機有必要對容器進行資源分配限制,比如CPU,記憶體等,Linux Cgroups的全稱是Linux Control Groups,它最主要的作用就是限制一個程序組能夠使用的資源上限,包括CPU,記憶體,磁碟,網路頻寬等等。
此外,Linux Cgroups還能夠對程序優先順序設定,以及將程序掛起和恢復等操作。

Cgroups 有三個元件:

  • cgroup 負責對程序分組管理,一個 cgroup 包含一組程序並可以設定程序引數
  • subsystem 是一組資源控制模組,可以關聯到 cgroup 上,並對 cgroup 中的程序做出相應限制。
  • hierarchy 可以把一組 cgroup 串成一個樹狀結構,這樣 cgroup 可以做到繼承。

再詳細一點,參考:

https://www.cnblogs.com/yinzhengjie/p/12183066.html

https://www.centos.bz/2018/08/docker-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E4%B9%8B-namespace-cgroup/

https://segmentfault.com/a/1190000009732550

https://zhuanlan.zhihu.com/p/55099839

https://blog.csdn.net/qq_43337384/article/details/105921675

2.1.1 什麼是cgroups

CGroups 全稱control groups,用來限定一個程序的資源使用,由Linux 核心支援,可以限制和隔離Linux程序組 (process groups) 所使用的物理資源 ,比如cpu,記憶體,磁碟和網路IO。

cgroups的一個設計目標是為不同的應用情況提供統一的介面,從控制單一程序到作業系統層虛擬化(像OpenVZ,Linux-VServer,LXC)。

cgroups提供:
資源限制:組可以被設定不超過設定的記憶體限制;這也包括虛擬記憶體。
優先順序:一些組可能會得到大量的CPU或磁碟IO吞吐量。
結算:用來衡量系統確實把多少資源用到適合的目的上。
控制:凍結組或檢查點和重啟動。

Cgroups提供了以下功能:
1.資源限制:限制程序組可以使用的資源數量(Resource limiting )。比如:memory子系統可以為程序組設定一個memory使用上限,一旦程序組使用的記憶體達到限額再申請記憶體,就會觸發OOM(out of memory)。
2.優先順序:程序組的優先順序控制(Prioritization )。比如:可以使用cpu子系統為某個程序組分配特定cpu share。
3.記錄程序組使用的資源數量(Accounting )。比如:可以使用cpuacct子系統記錄某個程序組使用的cpu時間
4.程序組隔離(Isolation)。比如:使用ns子系統可以使不同的程序組使用不同的namespace,以達到隔離的目的,不同的程序組有各自的程序、網路、檔案系統掛載空間。
5.程序組控制(Control)。比如:使用freezer子系統可以將程序組掛起和恢復。

2.2 LXC(Linux Container)

3.docker的

一、為什麼需要Docker

官方介紹(中文版):

Docker 是世界領先的軟體容器平臺
開發人員利用 Docker 可以消除協作編碼時“在我的機器上可正常工作”的問題。
運維人員利用 Docker 可以在隔離容器中並行執行和管理應用,獲得更好的計算密度。
企業利用 Docker 可以構建敏捷的軟體交付管道,以更快的速度、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應用釋出新功能。

1.1環境(切換/配置)麻煩

一般我們寫程式的,能接觸到好幾個環境:

  • 自己寫程式碼的環境叫做開發環境。
  • 給測試去跑的環境叫做測試環境。
  • 測試完可以對外使用的叫做生產環境。

其實我們在學習程式設計中,很多時間都浪費在“環境”上:

  • 如果我現在重灌了系統,我想要跑我的war/jar包,我得去安裝一下JDK、Tomcat、MySQL等配置各種的環境變數才能跑起來。
  • 開開心心地跟著博主給出的步驟去寫Demo,但總是有Bug。(這裡我將版本/依賴也歸納在環境的範疇裡邊)。
  • 好不容易在測試環境下跑起來了,在生產環境就各種出錯!
  • 跟著教學視訊做分散式/叢集的專案,跑一堆的虛擬機器,每個虛擬機器都要安裝對應的環境。

所以就有個笑話《千萬不要跟程式設計師說,你的程式碼有bug》:

  • 他的第一反應是你的環境有問題,第二就是你是傻逼不會用吧。
  • 你要跟他這麼說:“這個程式執行的怎麼執行的跟預期不一樣,是我操作有問題嗎?”。
  • 這貨就會第一反應“我擦,這是不是出bug了?”

1.2應用之間需要隔離

比如我寫了兩個應用(網站),這兩個應用部署在同一臺伺服器上,那可能會出現什麼問題?

  • 如果一個應用出現了問題,導致CPU佔100%。那另一個應用也會受到關聯,跟著一起涼涼了。
  • 這兩個應用是完全不同技術棧的應用,比如一個PHP,一個.NET。這兩個應用各種的依賴軟體都安裝在同一個伺服器上,可能就會造成各種衝突/無法相容,這可能除錯就非常麻煩了。

二、Docker是如何解決上述的問題的

2.1解決環境(切換/配置)

不知道大家有沒有裝過系統,比如說裝Linux虛擬機器,重灌Windows系統,都是需要映象的。

有了這個映象,我們就可以執行這個映象,來進行安裝系統的操作(此處省略N個下一步),於是我們的系統就裝好了。一般來說,我們去官方渠道下載的映象,都是純淨的。比如去官方下載Windows映象,裝完後之後桌面只有一個回收站。

但有過了解裝系統的同學可能就會知道,有的映象裝完可能還有360這些軟體,但系統的的確確是變了。簡單來說,就是這些映象添加了其他的東西(比如360軟體、騰訊、千千靜聽等等軟體)。

Docker也是這種思路,可以將我們的想要的環境構建(打包)成一個映象,然後我們可以推送(釋出)到網上去。想要用這個環 境的時候,在網上拉取一份就好了。

有了Docker,我們在搭環境的時候,跟以前的方式就不一樣了。

  • 之前:在開發環境構建出了一個war包,想跑到Linux下執行。我們得先在Linux下載好Java、Tomcat、MySQL,配置好對應的環境變數,將war包丟到Tomcat的webapps資料夾下,才能跑起來。
  • 現在:在Linux下直接拉取一份映象(各種環境都配好了),將映象執行起來,把war包丟進去就好了。

將Docker的映象執行起來就是一兩秒的事情而已,十分方便的。

2.2解決應用之間隔離

說到這裡,就得提出一個大家可能不認識的概念:LXC(Linux Containers)--->Linux容器。

2.2.1Linux容器

在Linux核心中,提供了cgroups功能,來達成資源的區隔化。它同時也提供了名稱空間(namespace)區隔化的功能,使應用程式看到的作業系統環境被區隔成獨立區間,包括程序樹,網路,使用者id,以及掛載的檔案系統。

簡單來說就是:LXC是一個為Linux核心包含特徵的使用者介面。通過強大的API和簡單的工具,它可以讓Linux使用者輕鬆的建立和託管系統或者應用程式容器。

2.2.2回到Docker

我們在翻看Docker的官方文件的時候,也很容易看見cgroup和namespace這兩個名詞:

來源維基百科:

Early versions of Docker used LXC as the container execution driver, though LXC was made optional in v0.9 and support was dropped in Docker v1.10.

lxc是早期版本docker的一個基礎元件,docker 主要用到了它對 Cgroup 和 Namespace 兩個核心特性的控制。新的Docker版本已經移除了對LXC的support。

2.2.3Docker在Windows和Mac

上面說了,Docker底層用的Linux的cgroup和namespace這兩項技術來實現應用隔離,那Windows和Mac使用者能用Docker嗎?

  • 之前,Windows和Mac使用Docker實際上就是跑了一層Linux虛擬機器。
    • 比如在Windows下安裝的是Docker Toolbox,它需要Oracle Virtual Box來跑Docker
  • 現在,Windows和Mac都已經原生支援Docker了。但需要一些安裝的條件,詳情可以檢視官網
    • 比如Windows:Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V

參考資料:

三、虛擬機器和Docker

說到應用隔離和映象,我就想起了虛擬機器。今年下半年(此處省略.....),文體兩開花(此處省略.....),要是我寫文章寫得不好,我是需要向XX謝罪的。

估計大家都用過虛擬機器,虛擬機器也能實現對應用的隔離,安裝特定的映象也能跑出我們想要的環境。虛擬機器已經發展了很久了,為什麼我們還需要Docker呢?

這部分內容在官網也有相關的介紹:

一句話總結:Docker容器比虛擬機器輕量多了!

最後

Docker可以幹嘛?

  • 將一整套環境打包封裝成映象,無需重複配置環境,解決環境帶來的種種問題。
  • Docker容器間是程序隔離的,誰也不會影響誰。

其實這篇文章主要是講為什麼我們需要Docker(在學習一項技術之前,必須要知道這項技術是用來幹嘛的)