一、mysql的PXC類似於MGR模式,全稱Percona XtraDB Cluster,這個集羣的優缺點也是相對的。
二、優點
1)數據庫集羣高可用,數據強一致性。
2)真正的多節點讀寫。
3)改善了傳統binlog到replylog中存在的延遲問題。基本做到實時同步。
4)新節點自動部署,無需太多操作。
5)故障無縫轉移。
三、缺點
1)新加入節點開銷大,需要把數據完全複製一次。SST協議開銷大。
2)任何事務都要全局驗證,MGR是大多數就行。性能取結予最差的節點。
3)爲了保證數據一致性,在並寫的時候,鎖衝突會比較嚴重。
4)因爲樂觀鎖,建議小事務。
5)全局都需要寫入,存在寫擴大問題。
6)只支持innodb引擎。
7)沒有表鎖,只能鎖集羣。
8)必須存在主鍵(同MGR)。
9)不支持XA。
四、特性
1)同步複製,事務要麼在所有節點提交或不提交。
2)多主複製,可以在任意節點進行寫操作。
3)在從服務器上並行應用事件,真正意義上的並行複製。
4)節點自動配置,數據一致性,不再是異步複製。
PXC最大的優勢:強一致性、無同步延遲。
五、搭建
利用docker-compose搭建mysql的PXC集羣。
1、目錄結構
2、因爲PXC在mysql8.0以上都是要求CA證書的,所以第一部建立證書。
# 使用openssl創建CA證書 openssl genrsa -out ca-key.pem openssl req -new -x509 -nodes -key ca-key.pem -out ca.pem #創建服務器證書 openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem # 創建客戶端證書 openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem openssl rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem # 驗證 openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
最後這樣算是通過
如果存在一下錯誤:
在填寫信息的時候在common name寫上自定義的名稱。
CA和(CLIENT,SERVER)名稱不能一樣。
3、ca的東西生成過後,需要建立配置cert.cnf(放在cert/config下)
[mysqld] skip-name-resolve ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem [client] ssl-ca = /cert/ca.pem ssl-cert = /cert/client-cert.pem ssl-key = /cert/client-key.pem [sst] encrypt = 4 ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem
4、docker-compose部署
1)dockerfile,Dockerfile-pxc
FROM percona/percona-xtradb-cluster:8.0.19 MAINTAINER xbd COPY ./cert /cert COPY ./cert/conf /etc/percona-xtradb-cluster.conf.d
2)docker-compose.yml
version: "2" services: xbd-pxc-1: build: context: ./ dockerfile: ./Dockerfile-pxc image: xbd-pxc restart: always container_name: xbd-pxc-1 volumes: - /var/lib/mysql/xbd-pxc-1:/var/lib/mysql ports: - 3306:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root - CLUSTER_NAME=xbd-pxc-cluster privileged: true xbd-pxc-2: build: context: ./ dockerfile: ./Dockerfile-pxc image: xbd-pxc restart: always container_name: xbd-pxc-2 volumes: - /var/lib/mysql/xbd-pxc-2:/var/lib/mysql ports: - 3307:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root - CLUSTER_NAME=xbd-pxc-cluster - CLUSTER_JOIN=xbd-pxc-1 privileged: true xbd-pxc-3: build: context: ./ dockerfile: ./Dockerfile-pxc image: xbd-pxc restart: always container_name: xbd-pxc-3 volumes: - /var/lib/mysql/xbd-pxc-3:/var/lib/mysql ports: - 3308:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root - CLUSTER_NAME=xbd-pxc-cluster - CLUSTER_JOIN=xbd-pxc-1 privileged: true
啓動順序,先啓動1,然後在啓動2,3
5、考慮到集羣方式,需要獨立的連接方式,單獨暴露等等。
1)方案存在keepalived、proxysql、haproxy等。
2)keepalived的主要是通過虛擬IP來訪問,但是需要佔用物理資源,對docker不友好。
3)proxysql很強大,也是後面的主流,但是配置麻煩,還得配置數據庫,所以這裏採用了haproxy
4)haproxy,配置簡單,也有UI界面。這裏也使用的docker方式部署,簡單易用。
5)部署:
a、準備配置文件haproxy.cfg放在haproxy目錄下
b、dockerfile,Dockerfile-haproxy
FROM haproxy:2.7.3 MAINTAINER xbd USER haproxy COPY ./haproxy/haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
c、docker-compose.yml完整版
version: "2" services: xbd-pxc-1: build: context: ./ dockerfile: ./Dockerfile-pxc image: xbd-pxc restart: always container_name: xbd-pxc-1 volumes: - /var/lib/mysql/xbd-pxc-1:/var/lib/mysql ports: - 3306:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root - CLUSTER_NAME=xbd-pxc-cluster privileged: true xbd-pxc-2: build: context: ./ dockerfile: ./Dockerfile-pxc image: xbd-pxc restart: always container_name: xbd-pxc-2 volumes: - /var/lib/mysql/xbd-pxc-2:/var/lib/mysql ports: - 3307:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root - CLUSTER_NAME=xbd-pxc-cluster - CLUSTER_JOIN=xbd-pxc-1 privileged: true xbd-pxc-3: build: context: ./ dockerfile: ./Dockerfile-pxc image: xbd-pxc restart: always container_name: xbd-pxc-3 volumes: - /var/lib/mysql/xbd-pxc-3:/var/lib/mysql ports: - 3308:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root - CLUSTER_NAME=xbd-pxc-cluster - CLUSTER_JOIN=xbd-pxc-1 privileged: true xbd-pxc-haproxy: build: context: ./ dockerfile: ./Dockerfile-haproxy image: xbd-pxc-haproxy restart: always container_name: xbd-pxc-haproxy ports: - 6033:3306 - 33066:33066 privileged: true
6)啓動測試
六、最終測試
命令查看
show status like 'wsrep%'