天天看點

基于pxc5.7的mysql叢集

作者:空山細兩
基于pxc5.7的mysql叢集

pxc叢集的最大優點是高一緻性,每一個節點都可以讀寫。因為是高一緻,當向一個節點寫入資料時,必須要所有節點都成功,才傳回成功狀态,是以,寫入的性能比單一節點的資料庫和主從叢集的資料庫略差,但對于需要高一緻要求的資料,可以保證資料的安全。

注意這兒使用的是 pxc:5.7版本。此版本叢集之間節點互相認證不需要證書,後面有pxc8.0基于證書的叢集。

叢集應該安裝到多台真實的主控端上,如果是在一台宿主上安裝多個容器的叢集,這種形式隻能用于學習。

在多台真機上安裝mysql叢集時,為保證互相的通訊,可以使用--network=host主控端網絡模式,也可以先建立一個docker swarm叢集,實作通過ingress在多主控端容器之間通訊。

步1、下載下傳鏡像

下載下傳位址:https://hub.docker.com/r/percona/percona-xtradb-cluster。

# docker pull percona/percona-xtradb-cluster:5.7

步2、建立一個獨立的網絡給pxc叢集使用

$ docker network create -d bridge --attachable pxc-net

基于pxc5.7的mysql叢集

步3、建立三個資料卷

如果不建立資料卷,在後面啟動時,也可以使用-v指定影射目錄:

基于pxc5.7的mysql叢集

步4、建立三個pxc容器

參數說明:

  • CLUSTER_NAME叢集之間需要有相同的叢集名稱。
  • CLUSTER_JOIN後啟動的PXC目标節點的名稱。預設第一個啟動的PXC容器,會先建立一個PXC叢集并等待後續節點加入。
  • 也可以直接使用docker-compose.yml建立,效果相同。

第一個:

#!/bin/bash
docker run --name node1 -d \
-p 3301:3306 \
-v v1:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
--privileged \
--network pxc-net \
percona/percona-xtradb-cluster:5.7 \
--character-set-server=utf8 --collation-server=utf8_generic_ci           
基于pxc5.7的mysql叢集

第二個,注意添加join語句:

#!/bin/bash
docker run --name node2 -d \
-p 3302:3306 \
-v v2:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=node1 \
--privileged \
--network pxc-net \
percona/percona-xtradb-cluster:5.7 \
--character-set-server=utf8 --collation-server=utf8_generic_ci           
基于pxc5.7的mysql叢集

第三個,注意添加join語句:

#!/bin/bash
docker run --name node3 -di \
-p 3303:3306 \
-v v3:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=node1 \
--privileged \
--network pxc-net \
percona/percona-xtradb-cluster:5.7 \
--character-set-server=utf8 --collation-server=utf8_generic_ci           
基于pxc5.7的mysql叢集

步5、驗證叢集

分别通過MySql Client連接配接三台不同的主機,并建立資料庫,建立資料表、寫入資料,分别查詢其他幾台主機上的資料内容,如果資料已經同步,說明叢集已經可以工作了:

基于pxc5.7的mysql叢集

步6、配置MySql叢集的負載均衡

這兒我們使用haproxy給mysql叢集做負載均衡

基于pxc5.7的mysql叢集

下載下傳haproxy

下載下傳位址:https://hub.docker.com/_/haproxy

docker pull haproxy           

2、建立haproxy的配置檔案

在任意目錄下,建立一個haproxy.cfg配置檔案,内容如下 :

注意,每一行如果最前面有空格,請使用4個空格,行内空格使用1個空格即可。

global
			#工作目錄,需要與建立容器指定的目錄相同
			# chroot /usr/local/etc/haproxy
			#日志檔案
			log 127.0.0.1 local5 info
			#守護程序
daemon
				defaults
				log global
				mode http
				#日志格式
				option httplog
				#日志中不記錄負載均衡的心跳檢測記錄
				option dontlognull
				#連接配接逾時時間毫秒
				timeout connect 5000
				#用戶端逾時
				timeout client 50000
				#伺服器逾時
				timeout server 50000
#監控界面
listen admin_stats
				bind 0.0.0.0:8888
				mode http
				stats uri /dbs_monitor
				#統計報告
				stats realm global\statistics
				#登入賬戶
				stats auth admin:admin
#資料負載均衡
listen proxy-mysql
				#通路的ip:port
				bind 0.0.0.0:3306
				mode tcp
				#負載均衡算法
				balance roundrobin
				#日志格式
				option tcplog
				#在mysql中建立一個沒有權限的haproxy使用者密碼為空
				#haproxy使用這個賬戶對mysql進行監控
				option mysql-check user haproxy
				server MySQL_1 node1:3306 check weight 1 maxconn 2000
				server MySQL_2 node2:3306 check weight 1 maxconn 2000
				server MySQL_3 node3:3306 check weight 2 maxconn 2000
				option tcpka           
基于pxc5.7的mysql叢集
基于pxc5.7的mysql叢集
基于pxc5.7的mysql叢集

3、建立haproxy使用者

在pxc資料庫上,建立haproxy使用者,密碼必須為空,此使用者用于haproxy對mysql進行健康檢查,不用授權任何權限。 登入pxc叢集的任何節點,執行建立即可:

mysql> create user 'haproxy'@'%' identified by “”;           

啟動haproxy

8888為監控界面端口,3306為資料庫端口。

-v ~/a 為包含有haproxy.cfg的配置檔案的目錄。

#!/bin/bash
docker run --name haproxy -d \
-p 8888:8888 -p 3306:3306 \
-v ~/a:/usr/local/etc/haproxy \
--privileged \
--network pxc-net \
haproxy           
基于pxc5.7的mysql叢集

通路8888端口

位址:http://192.168.56.61:8888/dbs_monitor

基于pxc5.7的mysql叢集

測試連接配接

使用mysql client訪3306(haproxy代理的mysql的端口)。

# mysql -uroot -p123456 -h192.168.56.61 -P3306           

MYSQL>

或使用MySQLClient UI(任何可以連接配接mysql的ui)都可以通過haproxy 3306端口操作mysql.

連接配接成功:

基于pxc5.7的mysql叢集

步7、停止主節點重新啟動

處理兩個地方:

1: 修改主節點資料目錄下grastate.dat檔案,将safe_to_bootstrap修改為1。

2:添加CLUSTER_JOIN參數等于任何一個正在運作的mysql服務。

基于pxc5.7的mysql叢集

啟動參數添加:

-e CLUSTER_JOIN=mysql-node2

然後再重新啟動即可,啟動後查詢叢集的狀态:

show status like ‘wsrep_%’,如果顯示3台伺服器,就可以了:

基于pxc5.7的mysql叢集

關于safe_to_bootstrap值的說明:

一般下情況,在叢集中,隻會有一個pxc節點的safe_to_bootstrap值為1,即為初始化建立叢集的節點,pxc叢集建立成且其他節點加入成功後,任何的節點都可以執行讀寫,資料之間互相同步。

如果三台主機依次關閉,則最後一台關閉的主機safe_to_bootstrap的值為1,即此主機擁有最新的資料,啟動時,應該先啟動這個節點。

如果三台主機,同時關閉,則有可能三台主機的safe_to_bootstrap的值都是0,則隻需要任何一台的safe_to_bootstrap=1,後先啟動這台主機,再其他其他主機,就可以成功啟動叢集。

繼續閱讀