docker搭建pxc集羣

前言

隨着mysql存儲的數據量越來越大,mysql查詢單表時的響應速度也會隨之變慢,尤其是當單節點承載的數據量超出一定的範圍後,比如單表超過2000萬之後,查詢響應速度會下降的很快,因此,一方面可以考慮mysql集羣,另一方面可以考慮讀寫分離,這兩種方案的出發點不同,集羣更多是從單節點可容納的併發連接數考慮,比如單節點的mysql服務器支持的最大連接數是有限的;而讀寫分離可以提升mysql服務總體的讀寫性能,避免讀請求和寫請求都打到同一個節點上,分攤壓力

總結來說,可以歸納爲單節點的mysql服務始終是有瓶頸的,因此需要考慮集羣化的解決方案,業界比較成熟的方案包括PXC集羣和replication集羣

pxc集羣

PXC介紹

Percona XtraDB Cluster(簡稱PXC集羣)提供了MySQL高可用的一種實現方法

  • 集羣是有節點組成的,推薦配置至少3個節點,但是也可以運行在2個節點上,生產環境建議不要超過15個,否則整體性能下降的很快
  • 每個節點都是普通的mysql/percona服務器,可以將現有的數據庫服務器組成集羣,反之,也可以將集羣拆分成單獨的服務器
  • 每個節點都包含完整的數據副本
    PXC集羣主要由兩部分組成:Percona Server with XtraDB和Write Set Replication patches(使用了Galera library,一個通用的用於事務型應用的同步、多主複製插件)

PXC特性

  • 同步複製,事務要麼在所有節點提交或不提交。
  • 多主複製,可以在任意節點進行寫操作。
  • 在從服務器上並行應用事件,真正意義上的並行複製。
  • 節點自動配置,數據一致性,不再是異步複製。
  • PXC最大的優勢:強一致性、無同步延遲

PXC優勢

  • 服務高可用
  • 數據同步複製(併發複製),幾乎無延遲
  • 多個可同時讀寫節點,可實現寫擴展,不過最好事先進行分庫分表,讓各個節點分別寫不同的表或者庫,避免讓galera解決數據衝突
  • 新節點可以自動部署,部署操作簡單
  • 數據嚴格一致性,尤其適合電商類應用
  • 完全兼容MySQL

pxc集羣搭建

下面演示如何使用docker快速搭建一個2個節點的pxc集羣

1、環境準備

兩臺安裝了docker的虛擬機或者阿里雲,基於centos7.X

機器IP 節點屬性
192.168.145.128 docker1 - master
192.168.145.129 docker2 - worker

2、開放如下防火牆端口

如下端口是PXC集羣之間互相通信時要用到的端口

firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanent

firewall-cmd --reload

3、下載PXC鏡像

docker pull percona/percona-xtradb-cluster:5.7.21
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
docker rmi percona/percona-xtradb-cluster:5.7.21

注意在每個節點上都要執行
在這裏插入圖片描述
4、創建並初始化集羣

  1. 第一個啓動的PXC節點是主節點,它要初始化PXC集羣
  2. PXC啓動之後,就沒有主節點的角色了
  3. PXC集羣中任何節點都是可以讀寫數據

在機器1上執行:

docker swarm init

執行完畢,產生如下的一行命令,將這行命令分別拷貝到其他的節點進行執行,表示其他節點都加入到這個集羣中來
在這裏插入圖片描述
將這段命令拷貝到docker2執行

docker swarm join --token SWMTKN-1-5b0lg8fdyovq4nrlrzxg5wfaqxeuhucms481zeefphm2m8phql-dzz5r37e33sv7o9jt92tw0s60 192.168.145.128:2377

在這裏插入圖片描述
可以看到,docker2節點作爲一個worker節點

swarm集羣維護常用命令

docker node ls [查看集羣節點]
docker node rm 節點 【強制移除運行中的節點】
docker swarm leave -f  [強制解散當前的swarm集羣]

通過上面這些命令,可以用來管理swarm集羣,比如移除【下線】集羣中的某個節點,解散某個集羣,需要說明的一個問題是,當我們從主節點強制解散某個節點的時候,下一次在重新創建一個再把其他節點加入進來的時候,一定要在其他節點上面執行leave的命令,否則會報加入失敗

5、創建docker網絡

試想在真實的應用中,當需要創建很多個PXC集羣的時候,集羣中不同的節點進行網絡通訊時,都使用宿主機網絡就很不好維護和管理,因此可以使用dockek創建網絡,然後讓各自的PXC集羣使用這個網絡,這樣就可以將不同的PXC集羣進行網絡區分,便於運維管理

創建一個docker網絡給下面的PXC集羣使用

docker network create -d overlay --attachable swarm_mysql

創建成功後,可以通過命令進行查看

docker network ls

在這裏插入圖片描述
也可以刪除自建的docker網絡

docker network rm swarm_mysql [移除虛擬網絡]

6、創建PXC主節點

通過下面的命令創建集羣的主節點

docker run -d -p 9001:3306  \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC1 \
-e XTRABACKUP_PASSWORD=123456 \
-v pnv1:/var/lib/mysql --privileged \
--name=pn1 --net=swarm_mysql \
pxc

簡單解釋下命令:

  1. *docker run -d -p 9001:3306 *
    將docker容器的mysql的3306端口映射到宿主機的9001端口
  2. *-e MYSQL_ROOT_PASSWORD=123456 *
    設置mysql客戶端連接密碼
  3. *-e CLUSTER_NAME=PXC1 *
    給PXC集羣起一個名字,這裏叫做PXC1
  4. *-v pnv1:/var/lib/mysql --privileged *
    宿主機的pnv1數據卷目錄掛載容器1的mysql目錄
  5. *–name=pn1 --net=swarm_mysql *
    使用上面創建的虛擬網絡

這裏需要解釋下,採用docker搭建PXC集羣時,不支持文件目錄的掛載方式,而只支持數據卷的掛載方式,因此上面的pnv1爲宿主機的數據卷,可以提前創建,如果不存在,執行上面的命令時會自動在宿主機進行創建

數據卷的常用命令如下:

docker volume ls  【查看已有的數據卷】
docker volume create pnv1 【創建一個叫做pnv1的數據卷】
docker volume rm 數據卷名字 【刪除某個數據卷】、
docker volume inspect pnv1  【查看某個數據卷詳情】

將上面的創建PXC主節點命令執行一下
在這裏插入圖片描述
執行成功後,稍等1~2分鐘可以使用navicat客戶端進行連接使用了
在這裏插入圖片描述

同時我們可以通過上面的數據卷命令查看掛載的詳情
在這裏插入圖片描述
7、創建PXC從節點

執行如下命令

docker run -d -p 9001:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC1 \
-e XTRABACKUP_PASSWORD=123456 \ 
-e CLUSTER_JOIN=pn1 \
-v pnv2:/var/lib/mysql --privileged \ 
--name=pn2 --net=swarm_mysql \
pxc

上面的命令和創建主節點的基本相同,額外新增的是下面這行命令

-e CLUSTER_JOIN=pn1 \

想必大家可以猜到,這是加入集羣名爲pn1的意思,正是如此,等待1~2分鐘docker進程起來之後,我們使用navicat進行連接,也能正常連接了
在這裏插入圖片描述
8、PXC集羣測試

在本文的開篇我們說,PXC集羣屬於同步複製類型的集羣,即在某個幾點上操作DB之後,其他節點同步會去複製數據,比如我們在節點1上面創建一個test的數據庫,很快你會發現在第二個節點的庫中也創建了
在這裏插入圖片描述

同時,我們再在2庫上面創建一張表,第一個節點的庫中也立即產生了,這個時間差,對於使用者來講,幾乎感覺不到
在這裏插入圖片描述

如果想擴展更多的節點,只需要拷貝上面的命令稍加修改即可,本篇的講解到此結束,最後感謝觀看!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章