天天看點

MySQL叢集的搭建

1、為什麼要搭建MySQL叢集呢,首先來簡單說一下單節點資料庫的弊病

大型網際網路程式使用者群體龐大,是以架構必須要特殊設計;
單節點的資料庫無法滿足性能上的要求;
單節點的資料庫沒有備援設計,無法滿足高可用。           

2、常見MySQL叢集方案

  • Repliaction 叢集方案
  • PXC 叢集方案( Percona XtraDB Cluster )
MySQL叢集的搭建

       1)Repliaction 叢集方案

        PXC方案在任何一個節點寫入的資料都會同步到其他節點,資料雙向同步的(在任何節點上都可以同時讀寫)。

MySQL叢集的搭建

        2)Repliaction 叢集方案

        Replication方案隻能在Master資料庫進行寫操作,在Slave資料庫進行讀操作。如果在Slave資料庫中寫入資料,Master資料庫是不能知道的(單向同步的)。

MySQL叢集的搭建

        3)PXC 資料的強一緻性

        PXC 采用同步複制,事務在所有叢集節點要麼同時送出,要麼不送出。 

MySQL叢集的搭建

         當一個寫入請求到達PXC叢集中的一個 mysql(node1資料庫) 資料庫時,node1資料庫會将該寫入請求同步給叢集中的其他所有資料庫,等待所有資料庫都成功送出事務後,node1節點才會将寫入成功的結果告訴給 node1的用戶端。

        Replication 采用異步複制,無法保證資料的一緻性。

MySQL叢集的搭建

        當一個寫入請求到達 Master資料庫時,Master資料庫執行寫入操作,然後 Master 向用戶端傳回寫入成功,同時異步的複制寫入操作給 Slave資料庫,如果異步複制時出現問題,從資料庫将無法執行寫入操作,而用戶端得到的是寫入成功。這也是弱一緻性的展現。

3、搭建PXC的MySQL叢集--資料強一緻性

        1)PXC叢集安裝介紹

Docker的鏡像倉庫中包含了PXC資料庫的鏡像,下載下傳即可
https://hub.docker.com/r/percona/percona-xtradb-cluster/           
MySQL叢集的搭建

    2)安裝PXC鏡像

        下載下傳鏡像

docker pull percona/percona-xtradb-cluster

#建議使用5.7.21PXC鏡像
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           

3)出于安全考慮,需要給PXC叢集執行個體建立Docker内部網絡

docker network create net1
docker network inspect net1
docker network rm net1           
MySQL叢集的搭建

4)建立Docker卷

        容器中的PXC節點映射資料目錄的解決辦法

docker volume create --name v1           
MySQL叢集的搭建

5)建立PXC容器

        隻需要向PXC鏡像傳入運作參數就能建立出PXC容器

docker run -d\
    --name node1\
    -p 3306:3306\
    -v v1:/var/lib/mysql\
    -e MYSQL_ROOT_PASSWORD=abc123456\
    -e CLUSTER_NAME=PXC\
    -e XTRABACKUP_PASSWORD=abc123456\
    --net net1\
    --ip 172.18.0.2\
    --privileged\
    docker.io/percona/percona-xtradb-cluster:5.7.21

docker run -d\
    --name node2\
    -p 3307:3306\
    -v v2:/var/lib/mysql\
    -e MYSQL_ROOT_PASSWORD=abc123456\
    -e CLUSTER_NAME=PXC\
    -e XTRABACKUP_PASSWORD=abc123456\
    -e CLUSTER_JOIN=node1\
    --net net1\
    --ip 172.18.0.3\
    --privileged\
    docker.io/percona/percona-xtradb-cluster:5.7.21

docker run -d\
    --name node3\
    -p 3308:3306\
    -v v3:/var/lib/mysql\
    -e MYSQL_ROOT_PASSWORD=abc123456\
    -e CLUSTER_NAME=PXC\
    -e XTRABACKUP_PASSWORD=abc123456\
    -e CLUSTER_JOIN=node1\
    --net net1\
    --ip 172.18.0.4\
    --privileged\
    docker.io/percona/percona-xtradb-cluster:5.7.21

docker run -d\
    --name node4\
    -p 3309:3306\
    -v v4:/var/lib/mysql\
    -e MYSQL_ROOT_PASSWORD=abc123456\
    -e CLUSTER_NAME=PXC\
    -e XTRABACKUP_PASSWORD=abc123456\
    -e CLUSTER_JOIN=node1\
    --net net1\
    --ip 172.18.0.5\
    --privileged\
    docker.io/percona/percona-xtradb-cluster:5.7.21

docker run -d\
    --name node5\
    -p 3310:3306\
    -v v5:/var/lib/mysql\
    -e MYSQL_ROOT_PASSWORD=abc123456\
    -e CLUSTER_NAME=PXC\
    -e XTRABACKUP_PASSWORD=abc123456\
    -e CLUSTER_JOIN=node1\
    --net net1\
    --ip 172.18.0.6\
    --privileged\
    docker.io/percona/percona-xtradb-cluster:5.7.21           

        檢視建立的5個pxc容器

MySQL叢集的搭建

4、資料庫負載均衡

        使用Haproxy做負載均衡,請求被均勻發給每個節點,單節點負載低,性能好。

MySQL叢集的搭建
MySQL叢集的搭建

        Docker倉庫中儲存了Haproxy的鏡像

docker pull haproxy           

        建立Haproxy配置檔案,配置檔案詳情參考https://zhang.ge/5125.html

touch /home/soft/haproxy/haproxy.cfg

global
	#工作目錄
	chroot /usr/local/etc/haproxy
	#日志檔案,使用rsyslog服務中local5日志裝置(/var/log/local5),等級info
	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
	#監控界面的通路的IP和端口
	bind  0.0.0.0:8888
	#通路協定
    mode        http
	#URI相對位址
    stats uri   /dbs
	#統計報告格式
    stats realm     Global\ statistics
	#登陸帳戶資訊
    stats auth  admin:abc123456
#資料庫負載均衡
listen  proxy-mysql
	#通路的IP和端口
	bind  0.0.0.0:3306  
    #網絡協定
	mode  tcp
	#負載均衡算法(輪詢算法)
	#輪詢算法:roundrobin
	#權重算法:static-rr
	#最少連接配接算法:leastconn
	#請求源IP算法:source 
    balance  roundrobin
	#日志格式
    option  tcplog
	#在MySQL中建立一個沒有權限的haproxy使用者,密碼為空。Haproxy使用這個賬戶對MySQL資料庫心跳檢測
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
	server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
	server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
	server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
	#使用keepalive檢測死鍊
    option  tcpka             

        建立容器

docker run -d\
    -p 4001:8888\
    -p 4002:3306\
    -v /home/soft/haproxy:/usr/local/etc/haproxy\
    --name h1\
    --privileged\
    --net=net1\
    --ip=172.18.0.7\
    docker.io/haproxy


haproxy -f /usr/local/etc/haproxy/haproxy.cfg 
           

        配置完成之後,檢視一下監控畫面

http://192.168.0.103:4001/dbs           
MySQL叢集的搭建

5、高可用方案

        為什麼要采用雙機熱備?單節點Haproxy不具備高可用,必須備援設計。

MySQL叢集的搭建

        利用Keepalived實作雙機熱備

MySQL叢集的搭建

        Haproxy雙機熱備方案

MySQL叢集的搭建

繼續閱讀