多主機網絡下 Docker Swarm 模式的容器管理

多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

Docker Engine – Swarm 模式html

在多臺主機之上運行 MySQL 容器擁有必定程度的複雜性,而具體水平則取決於您所選擇的集羣技術。node

在嘗試利用容器加多主機網絡運行 MySQL 以前,咱們首先須要理解鏡像的起效原理、各資源的分配方式(包括磁盤、內存與 CPU)、網絡(覆蓋網絡驅動因素,默認狀況下包括 flannel 與 weave 等)以及容錯機制(容器如何實現從新定位、故障轉移以及負載均衡等)。mysql

這一切都會給數據庫的總體運行、正常運行時間以及性能表現形成影響。咱們建議你們使用編排工具保證 Docker 引擎集羣擁有更出色的可管理性與可擴展性。最新的 Docker Engine(版本爲 1.12,發佈於 2016 年 7 月 14 日)當中包含有 Swarm 模式,專門用於以原生方式管理名爲 Swarm 的 Docker Engine 集羣。linux

須要注意的是,Docker Engine Swarm 模式與 Docker Swarm 是兩個不一樣的項目,兩者雖然工做原理相似,但卻擁有不一樣的安裝步驟。算法

多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

下面咱們來看看着手進行以前,首先須要完成的準備工做:sql

必須首先打開如下端口:docker

  • 2377 (TCP) – 集羣管理
  • 7946 (TCP 與 UDP) – 節點通訊
  • 4789 (TCP 與 UDP) – 覆蓋網絡流量

節點類型分爲 2 種:數據庫

  • 管理節點 - 管理節點負責執行維護 Swarm 必要狀態所必需的編排與集羣管理功能。管理節點會選擇單一主管理方執行編排任務。
  • 工做節點 - 工做節點負責從管理節點處接收並執行各項任務。在默認狀況下,管理節點自己同時也做爲工做節點存在,但你們能夠經過配置保證其僅執行管理任務。

在本文中,咱們將立足於 3 臺 Docker 主機(docker一、docker2 與 docker3)在負載均衡 Galera Cluster 之上部署應用程序容器,同時將其接入一套覆蓋網絡。咱們將利用 Docker Engine Swarm 模式做爲編排工具。網絡

集羣構建架構

首先讓咱們將 Docker 節點歸入 Swarm 集羣當中。Swarm 模式要求利用奇數臺管理節點(固然不止一臺)以維持容錯能力。所以,咱們在這裏須要讓三臺節點所有做爲管理節點。須要注意的是,在默認狀況下,管理節點同時亦做爲工做節點。

多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

首先在 docker1 上對 Swarm 模式進行初始化。完成以後,該節點將成爲管理節點及當前管理方:

[root@docker1]$ docker swarm init --advertise-addr 192.168.55.111
Swarm initialized: current node (6r22rd71wi59ejaeh7gmq3rge) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join /
    --token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-dzvgu0h3qngfgihz4fv0855bo /
    192.168.55.111:2377
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

咱們還須要將其它兩個節點添加爲管理節點。使用 join 命令將這兩臺節點註冊爲管理節點:

[docker1]$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
 
    docker swarm join /
    --token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-7fd1an5iucy4poa4g1bnav0pt /
    192.168.55.111:2377

在 docker2 與 docker3 上,運行如下命令以進行節點註冊:

$ docker swarm join --token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-7fd1an5iucy4poa4g1bnav0pt 192.168.55.111:2377

驗證是否所有節點都已經正確添加:

[docker1]$ docker node ls
ID                           HOSTNAME       STATUS  AVAILABILITY  MANAGER STATUS
5w9kycb046p9aj6yk8l365esh    docker3.local  Ready   Active        Reachable
6r22rd71wi59ejaeh7gmq3rge *  docker1.local  Ready   Active        Leader
awlh9cduvbdo58znra7uyuq1n    docker2.local  Ready   Active        Reachable

到這裏,咱們的 docker1.local 做爲主管理節點。

覆蓋網絡

要讓不一樣主機之上的運行的容器彼此實現對接,唯一的方式就是使用覆蓋網絡。你們能夠將其視爲一套構建於另外一網絡(在本示例中爲物理主機網絡)之上的容器網絡。Docker Swarm 模式提供一套默認覆蓋網絡,其負責配合 libnetwork 與 libkv 實現一套基於 VxLAN 的解決方案。固然,你們也能夠選擇 Flannel、Calico 或者 Weave 等其它覆蓋網絡驅動方案,但須要執行額外的安裝步驟。
在 Docker Engine Swarm 模式當中,你們能夠單純立足管理節點建立一套覆蓋網絡,並且其不須要 etcd、consul 或者 Zookeeper 等額外的鍵值存儲機制。
這套 Swarm 僅爲集羣內的各節點提供覆蓋網絡。當你們建立一項須要用到覆蓋網絡的服務時,管理節點會自動將覆蓋網絡延伸至運行該服務任務的節點處。

多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

下面讓咱們爲各容器建立一套覆蓋網絡。在這裏,咱們須要將 Percona XtraDB 集羣與應用程序容器分別部署在各 Docker 主機之上,用以實現容錯性。這些容器必須運行在同一覆蓋網絡當中,從而確保其可以彼此通訊。

這裏咱們將網絡命名爲「mynet」。你們只能在管理節點上完成這一建立工做:

[docker1]$ docker network create --driver overlay mynet

下面來看咱們的現有網絡:

[docker1]$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
213ec94de6c9        bridge              bridge              local
bac2a639e835        docker_gwbridge     bridge              local
5b3ba00f72c7        host                host                local
03wvlqw41e9g        ingress             overlay             swarm
9iy6k0gqs35b        mynet               overlay             swarm
12835e9e75b9        none                null                local

如今 Swarm 當中擁有 2 套覆蓋網絡。其中「mynet」網絡正是咱們在部署容器時所建立的成果。而「ingress」覆蓋網絡則爲默認提供。Swarm 管理節點會利用 ingress 負載均衡以將服務公佈至集羣以外。

利用服務與任務實現部署

接下來咱們將經過服務與任務進行 Galera 集羣容器部署。當你們建立一項服務時,須要指定使用哪套容器鏡像並在容器內執行哪些命令。服務類型共分爲兩種:

  • 複製服務——將一系列複製任務分發至各節點當中,具體取決於您所須要的設置狀態,例如「--replicas 3」。
  • 全局服務——適用於集羣內所有可用節點上的服務任務,例如「--mode global」。若是你們在 Swarm 集羣中設有 7 臺 Docker 節點,則所有節點之上都將存在對應容器。

Docker Swarm 模式在管理持久數據存儲方面功能有限。當一臺節點發生故障時,管理節點會繞過各相關容器並建立新容器,用於繼續保持原有運行狀態。因爲容器在下線後會被丟棄,所以咱們會失去其中的所有數據分卷。幸運的是,Galera 集羣容許各 MySQL 容器以自動方式在加入時利用狀態/數據接受配置。

部署鍵-值存儲

咱們在這裏使用的 docker 鏡像爲 Percona-Lab。這套鏡像要求各 MySQL 容器訪問一套鍵-值存儲(僅支持 etcd)以實現集羣初始化與引導過程當中的 IP 地址發現。各容器將在 etcd 當中搜索其它 IP 地址,從而利用正確的 "wsrep_cluster_address" 完成 MySQL 啓動。不然,首套容器將使用 gcomm:// 做爲引導地址。

首先部署咱們的 etcd 服務。你們能夠點擊此處獲取咱們使用的 etcd 鏡像。其要求咱們根據所需部署的 etcd 節點數量使用一條發現 URL。在這種狀況下,咱們須要設置單獨的 etcd 容器,其具體命令爲:

[docker1]$ curl -w "/n" 'https://discovery.etcd.io/new?size=1'
https://discovery.etcd.io/a293d6cc552a66e68f4b5e52ef163d68

在此以後,使用生成的 URL 做爲「-discovery」值,同時爲 etcd 建立該服務:

[docker1]$ docker service create /
--name etcd /
--replicas 1 /
--network mynet /
-p 2379:2379 /
-p 2380:2380 /
-p 4001:4001 /
-p 7001:7001 /
elcolio/etcd:latest /
-name etcd /
-discovery=https://discovery.etcd.io/a293d6cc552a66e68f4b5e52ef163d68

到這裏,Docker Swarm 模式將編排其中一臺 Docker 主機上的容器部署工做。

檢索etcd服務虛擬IP地址。咱們須要在下一步部署集羣時使用此IP地址:

[docker1]$ docker service inspect etcd -f "{{ .Endpoint.VirtualIPs }}"
[{03wvlqw41e9go8li34z2u1t4p 10.255.0.5/16} {9iy6k0gqs35bn541pr31mly59 10.0.0.2/24}]

到這裏,咱們的架構以下圖所示:

多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

部署數據庫集羣

利用如下命令爲 etcd 指定虛擬 IP 地址,用於部署 Galera(Percona XtraDB 集羣)容器:

[docker1]$ docker service create /
--name mysql-galera /
--replicas 3 /
-p 3306:3306 /
--network mynet /
--env MYSQL_ROOT_PASSWORD=mypassword /
--env DISCOVERY_SERVICE=10.0.0.2:2379 /
--env XTRABACKUP_PASSWORD=mypassword /
--env CLUSTER_NAME=galera /
perconalab/percona-xtradb-cluster:5.6

整個部署流程須要耗費一段時間,包括將鏡像下載至對應的工做/管理節點。你們可使用如下命令驗證其部署狀態:

[docker1]$ docker service ps mysql-galera
ID                         NAME                IMAGE                                  NODE           DESIRED STATE  CURRENT STATE            ERROR
8wbyzwr2x5buxrhslvrlp2uy7  mysql-galera.1      perconalab/percona-xtradb-cluster:5.6  docker1.local  Running        Running 3 minutes ago
0xhddwx5jzgw8fxrpj2lhcqeq  mysql-galera.2      perconalab/percona-xtradb-cluster:5.6  docker3.local  Running        Running 2 minutes ago
f2ma6enkb8xi26f9mo06oj2fh  mysql-galera.3      perconalab/percona-xtradb-cluster:5.6  docker2.local  Running        Running 2 minutes ago

能夠看到,mysql-galera 服務目前已經開始運行。下面列出所有現有服務:

[docker1]$ docker service ls
ID            NAME          REPLICAS  IMAGE                                  COMMAND
1m9ygovv9zui  mysql-galera  3/3       perconalab/percona-xtradb-cluster:5.6
au1w5qkez9d4  etcd          1/1       elcolio/etcd:latest                    -name etcd -discovery=https://discovery.etcd.io/a293d6cc552a66e68f4b5e52ef163d68

Swarm 模式包含一項內部 DNS 組件,其負責自動爲 Swarm 中的每項服務分配一條 DNS 入口。所以,你們可使用該服務名稱以解析至對應的虛擬 IP 地址:

[docker2]$ docker exec -it $(docker ps | grep etcd | awk {'print $1'}) ping mysql-galera
PING mysql-galera (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.078 ms
64 bytes from 10.0.0.4: seq=1 ttl=64 time=0.179 ms

或者直接使用"docker service inspect"命令檢索該虛擬 IP 地址:

[docker1]# docker service inspect mysql-galera -f "{{ .Endpoint.VirtualIPs }}"
[{03wvlqw41e9go8li34z2u1t4p 10.255.0.7/16} {9iy6k0gqs35bn541pr31mly59 10.0.0.4/24}]

到這裏,咱們的架構以下圖所示:
多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

部署應用程序

最後,你們能夠建立應用程序服務並將 MySQL 服務名稱("mysql-galera")做爲數據庫主機值進行交付:

[docker1]$ docker service create /
--name wordpress /
--replicas 2 /
-p 80:80 /
--network mynet /
--env WORDPRESS_DB_HOST=mysql-galera /
--env WORDPRESS_DB_USER=root /
--env WORDPRESS_DB_PASSWORD=mypassword /
wordpress

部署完成以後,咱們隨後可以經過「docker service inspect」命令檢索 wordpress 服務的虛擬 IP 地址:

[docker1]# docker service inspect wordpress -f "{{ .Endpoint.VirtualIPs }}"
[{p3wvtyw12e9ro8jz34t9u1t4w 10.255.0.11/16} {kpv8e0fqs95by541pr31jly48 10.0.0.8/24}]

如今再來看目前的架構示意圖:

多主機網絡下 Docker Swarm 模式的容器管理多主機網絡下 Docker Swarm 模式的容器管理

咱們的分佈式應用程序與數據庫設置已經由 Docker 容器部署完成。

接入服務與負載均衡

到這裏,如下端口都已經在集羣中的所有 Docker 節點上被打開(基於每條「docker service create」命令上的「-p」標記),而不管各節點目前是否正在運行該服務任務:

  • etcd - 2380, 2379, 7001, 4001
  • MySQL - 3306
  • HTTP - 80

若是咱們直接利用簡單循環接入"PublishedPort",則可看到 MySQL 服務已經在各容器之上實現負載均衡:

[docker1]$ while true; do mysql -uroot -pmypassword -h127.0.0.1 -P3306 -NBe 'select @@wsrep_node_address'; sleep 1; done
10.255.0.10
10.255.0.8
10.255.0.9
10.255.0.10
10.255.0.8
10.255.0.9
10.255.0.10
10.255.0.8
10.255.0.9
10.255.0.10
^C

如今,Swarm 管理節點負責負載均衡的內部管理,並且咱們沒法配置該負載均衡算法。在此以後,咱們能夠利用外部負載均衡器將外部流量路由至各 Docker 節點當中。一旦任何 Docker 節點發生故障,該服務將被從新定位至其它可用節點。

原文來自:https://linux.cn/article-7903-1.html

本文地址:http://www.linuxprobe.com/docker-mysql-docker.html

相關文章
相關標籤/搜索