mysql之PXC集羣模式(docker+mysql8+pxc實現)

  一、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%'

 

 

 

 

  

 

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