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