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

   UI:IP:33066/dbs

posted @ 2023-02-17 13:51  小不点丶  阅读(1374)  评论(0编辑  收藏  举报