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

在Docker中運行MySQL:多主機網絡下Docker Swarm模式的容器管理

開發 開發工具
本文將以多主機網絡環境為基礎,探討如何利用內置編排工具 Docker Swarm 模式對各主機上的容器加以管理。

[[174869]]

本文將以多主機網絡環境為基礎,探討如何利用內置編排工具 Docker Swarm 模式對各主機上的容器加以管理。

Docker Engine – Swarm 模式

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

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

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

需要注意的是,Docker Engine Swarm 模式與 Docker Swarm 是兩個不同的項目,二者雖然工作原理類似,但卻擁有不同的安裝步驟。

下面我們來看看著手進行之前,首先需要完成的準備工作:

必須首先打開以下端口:

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

節點類型分為 2 種:

  • 管理節點 - 管理節點負責執行維護 Swarm 必要狀態所必需的編排與集群管理功能。管理節點會選擇單一主管理方執行編排任務。
  • 工作節點 - 工作節點負責從管理節點處接收并執行各項任務。在默認情況下,管理節點本身同時也作為工作節點存在,但大家可以通過配置保證其僅執行管理任務。

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

集群構建

首先讓我們將 Docker 節點納入 Swarm 集群當中。Swarm 模式要求利用奇數臺管理節點(當然不止一臺)以維持容錯能力。因此,我們在這里需要讓三臺節點全部作為管理節點。需要注意的是,在默認情況下,管理節點同時亦作為工作節點。

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

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

我們還需要將其它兩個節點添加為管理節點。使用 join 命令將這兩臺節點注冊為管理節點:

  1. [docker1]$ docker swarm join-token manager 
  2. To add a manager to this swarm, run the following command: 
  3.   
  4.     docker swarm join \ 
  5.     --token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-7fd1an5iucy4poa4g1bnav0pt \ 
  6.     192.168.55.111:2377 

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

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

驗證是否全部節點都已經正確添加:

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

到這里,我們的 docker1.local 作為主管理節點。

覆蓋網絡

要讓不同主機之上的運行的容器彼此實現對接,惟一的方式就是使用覆蓋網絡。大家可以將其視為一套構建于另一網絡(在本示例中為物理主機網絡)之上的容器網絡。Docker Swarm 模式提供一套默認覆蓋網絡,其負責配合 libnetwork 與 libkv 實現一套基于 VxLAN 的解決方案。當然,大家也可以選擇 Flannel、Calico 或者 Weave 等其它覆蓋網絡驅動方案,但需要執行額外的安裝步驟。

在 Docker Engine Swarm 模式當中,大家可以單純立足管理節點創建一套覆蓋網絡,而且其不需要 etcd、consul 或者 Zookeeper 等額外的鍵值存儲機制。

這套 Swarm 僅為集群內的各節點提供覆蓋網絡。當大家創建一項需要用到覆蓋網絡的服務時,管理節點會自動將覆蓋網絡延伸至運行該服務任務的節點處。

下面讓我們為各容器創建一套覆蓋網絡。在這里,我們需要將 Percona XtraDB 集群與應用程序容器分別部署在各 Docker 主機之上,用以實現容錯性。這些容器必須運行在同一覆蓋網絡當中,從而確保其能夠彼此通信。

這里我們將網絡命名為“mynet”。大家只能在管理節點上完成這一創建工作:

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

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

  1. [docker1]$ docker network ls 
  2. NETWORK ID          NAME                DRIVER              SCOPE 
  3. 213ec94de6c9        bridge              bridge              local 
  4. bac2a639e835        docker_gwbridge     bridge              local 
  5. 5b3ba00f72c7        host                host                local 
  6. 03wvlqw41e9g        ingress             overlay             swarm 
  7. 9iy6k0gqs35b        mynet               overlay             swarm 
  8. 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 容器,其具體命令為:

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

在此之后,使用生成的 URL 作為“-discovery”值,同時為 etcd 創建該服務:

  1. [docker1]$ docker service create \ 
  2. --name etcd \ 
  3. --replicas 1 \ 
  4. --network mynet \ 
  5. -p 2379:2379 \ 
  6. -p 2380:2380 \ 
  7. -p 4001:4001 \ 
  8. -p 7001:7001 \ 
  9. elcolio/etcd:latest \ 
  10. -name etcd \ 
  11. -discovery=https://discovery.etcd.io/a293d6cc552a66e68f4b5e52ef163d68 

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

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

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

到這里,我們的架構如下圖所示:

部署數據庫集群

利用以下命令為 etcd 指定虛擬 IP 地址,用于部署 Galera(Percona XtraDB 集群)容器:

  1. [docker1]$ docker service create \ 
  2. --name mysql-galera \ 
  3. --replicas 3 \ 
  4. -p 3306:3306 \ 
  5. --network mynet \ 
  6. --env MYSQL_ROOT_PASSWORD=mypassword \ 
  7. --env DISCOVERY_SERVICE=10.0.0.2:2379 \ 
  8. --env XTRABACKUP_PASSWORD=mypassword \ 
  9. --env CLUSTER_NAME=galera \ 
  10. perconalab/percona-xtradb-cluster:5.6 

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

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

可以看到,mysql-galera 服務目前已經開始運行。下面列出全部現有服務:

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

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

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

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

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

到這里,我們的架構如下圖所示:

部署應用程序

最后,大家可以創建應用程序服務并將 MySQL 服務名稱(mysql-galera)作為數據庫主機值進行交付:

  1. [docker1]$ docker service create \ 
  2. --name wordpress \ 
  3. --replicas 2 \ 
  4. -p 80:80 \ 
  5. --network mynet \ 
  6. --env WORDPRESS_DB_HOST=mysql-galera \ 
  7. --env WORDPRESS_DB_USER=root \ 
  8. --env WORDPRESS_DB_PASSWORD=mypassword \ 
  9. wordpress 

部署完成之后,我們隨后能夠通過“docker service inspect”命令檢索 wordpress 服務的虛擬 IP 地址:

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

現在再來看目前的架構示意圖:

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

接入服務與負載均衡

到這里,以下端口都已經在集群中的全部 Docker 節點上被打開(基于每條“docker service create”命令上的-p標記),而無論各節點目前是否正在運行該服務任務:

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

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

  1. [docker1]$ while true; do mysql -uroot -pmypassword -h127.0.0.1 -P3306 -NBe 'select @@wsrep_node_address'; sleep 1; done 
  2. 10.255.0.10 
  3. 10.255.0.8 
  4. 10.255.0.9 
  5. 10.255.0.10 
  6. 10.255.0.8 
  7. 10.255.0.9 
  8. 10.255.0.10 
  9. 10.255.0.8 
  10. 10.255.0.9 
  11. 10.255.0.10 
  12. ^C 

現在,Swarm 管理節點負責負載均衡的內部管理,而且我們無法配置該負載均衡算法。在此之后,我們可以利用外部負載均衡器將外部流量路由至各 Docker 節點當中。一旦任何 Docker 節點發生故障,該服務將被重新定位至其它可用節點。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2023-09-15 10:15:43

Docker網絡

2021-12-24 09:58:37

DockerMySQLLinux

2014-12-15 10:40:40

DockerSwarm集群管理

2019-06-26 08:00:39

Docker容器運行命令

2024-01-02 08:00:00

云計算容器Docker

2024-01-15 00:11:04

Docker網絡系統

2023-10-10 17:09:19

2023-09-04 15:09:03

容器編排工具KubernetesDocker

2016-12-01 13:37:42

OpenStack MDocker Swar容器

2015-01-08 10:29:59

Shipyardweb管理集中化

2020-09-19 18:03:42

Docker

2014-06-03 09:55:34

DockerLinux容器Ubuntu

2018-07-23 09:02:18

容器KubernetesAmazon

2017-08-23 08:09:11

UDPDocker容器

2014-05-07 10:04:57

DockerLinux容器Ubuntu

2016-01-11 10:29:36

Docker容器容器技術

2021-11-22 08:00:00

Kubernetes容器集群

2017-03-31 14:25:19

手動docker swar集群

2022-10-08 07:17:14

架構

2017-02-14 16:39:56

docker容器化主機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区免费 | 免费观看一级黄色录像 | 午夜爽爽男女免费观看hd | 日韩图区 | 欧美日本一区二区 | 看av网址 | 欧美人妇做爰xxxⅹ性高电影 | 九九九久久国产免费 | 日本综合在线观看 | 国产免费一区二区 | 日韩在线 | 中文字幕第二区 | 亚洲国产精品久久 | 麻豆精品一区二区三区在线观看 | 精品久久精品 | 久久中文免费视频 | 欧美区在线 | 日韩精品在线网站 | 国产精品国产三级国产aⅴ原创 | 91一区二区三区在线观看 | 日韩欧美一级片 | 亚洲精品久久久 | 天天夜天天操 | 欧美日韩在线观看一区 | 亚洲一区成人 | 在线看日韩av | 免费h在线 | 亚洲精品片 | 色又黄又爽网站www久久 | 国产日韩精品一区二区 | 99国产精品久久久久久久 | 日本精品一区二区三区视频 | 成人av网站在线观看 | 中文字幕不卡视频在线观看 | 日韩精品一区二区三区视频播放 | 最新黄色毛片 | 亚洲社区在线 | 国产精品久久久久久中文字 | 久久一热| 国产一级一级毛片 | 国产欧美精品一区二区三区 |