Linux PXC 安装详解

PXC 主要特点

官网资料

Docker 方式安装

  • Docker 官方仓库:https://hub.docker.com/r/percona/percona-xtradb-cluster/
  • 下载镜像:docker pull percona/percona-xtradb-cluster
  • 创建需要挂载的目录:mkdir -p /data/docker/pxc/node1/mysql /data/docker/pxc/node2/mysql /data/docker/pxc/node3/mysql
  • 创建需要挂载的目录:mkdir -p /data/docker/pxc/node1/backup
  • 赋权:chmod 777 -R /data/docker/pxc
  • 创建 Docker 网段:docker network create --subnet=172.18.0.0/24 pxc-net
  • 启动镜像:
# 初次初始化比较慢,给个 2 分钟左右吧,同时这个节点也用来做全量备份
docker run -d -p 3307:3306 -v /data/docker/pxc/node1/mysql:/var/lib/mysql -v /data/docker/pxc/node1/backup:/data/backup -e MYSQL_ROOT_PASSWORD=gitnavi123456 -e CLUSTER_NAME=pxc-cluster -e XTRABACKUP_PASSWORD=gitnavi123456 --privileged --name=pxc-node-1 --net=pxc-net --ip 172.18.0.2 percona/percona-xtradb-cluster
  • 使用 SQLyog 测试是否可以连上去,可以才能继续创建其他节点。
    • 连接地址是宿主机 IP,端口是:3307
docker run -d -p 3308:3306 -v /data/docker/pxc/node2/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=gitnavi123456 -e CLUSTER_NAME=pxc-cluster -e XTRABACKUP_PASSWORD=gitnavi123456 -e CLUSTER_JOIN=pxc-node-1 --privileged --name=pxc-node-2 --net=pxc-net --ip 172.18.0.3 percona/percona-xtradb-cluster

docker run -d -p 3309:3306 -v /data/docker/pxc/node3/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=gitnavi123456 -e CLUSTER_NAME=pxc-cluster -e XTRABACKUP_PASSWORD=gitnavi123456 -e CLUSTER_JOIN=pxc-node-1 --privileged --name=pxc-node-3 --net=pxc-net --ip 172.18.0.4 percona/percona-xtradb-cluster
  • 测试集群
    • 用 SQLyog 连上 3 个节点,随便找一个节点创建库,其他几个节点会同时产生库。以此类推,创建表、插入数据,然后查看其他库情况。

负载均衡

  • 因为 PXC 是同步是双向的,都支持读写,所以就可以考虑使用负载均衡实现流量分发
  • 使用使用 HAProxy(支持 HTTP 协议、TCP/IP 协议,并且支持虚拟化,可以直接用 Docker 安装)
  • 创建需要挂载的目录:mkdir -p /data/docker/haproxy/conf
  • 赋权:chmod 777 -R /data/docker/haproxy
  • 创建一个用于 MySQL 心跳检测的用户:
    • 连上 PXC 任意一个数据库:CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
  • 创建配置文件:vim /data/docker/haproxy/conf/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:8118
    #访问协议
    mode        http
    # URI 相对地址(访问 haproxy 监控地址:http://192.168.0.105:8118/dbs)
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息(登录名 admin,密码:gitnavi123456)
    stats auth  admin:gitnavi123456
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3316
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在 MySQL 中创建一个没有权限的 haproxy 用户,密码为空。Haproxy 使用这个账户对MySQL数据库心跳检测
    option  mysql-check user haproxy
    #这里填写的端口是 docker 容器的端口,而不是宿主机端口
    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
    #使用keepalive检测死链
    option  tcpka
  • 官网 Docker 镜像:https://hub.docker.com/_/haproxy/
  • 运行容器:docker run -it -d -p 4001:8118 -p 4002:3316 -v /data/docker/haproxy/conf:/usr/local/etc/haproxy --name pxc-haproxy-1 --privileged --net=pxc-net haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  • 浏览器访问:http://192.168.0.105:4001/dbs
    • 输入:admin
    • 输入:gitnavi123456
    • 可以看到 HAProxy 监控界面
  • SQLyog 连接
    • IP:192.168.0.105
    • 端口:4002
    • 用户:root
    • 密码:gitnavi123456
    • 然后在上面创建对应的数据,如果所有节点都有对应的数据,则表示部署成功

XtraBackup 热备份

  • XtraBackup 备份过程不锁表
  • XtraBackup 备份过程不会打断正在执行的事务
  • XtraBackup 备份资料经过压缩,磁盘空间占用低

全量备份

  • 容器内安装 XtraBackup,并执行备份语句
apt-get update
apt-get install -y percona-xtrabackup-24

# 全量备份,备份到 docker 容器的 /data 目录下:
innobackupex --user=root --password=gitnavi123456 /data/backup/full/201806

还原全量备份

  • PXC 还原数据的时候,必须解散集群,删除掉只剩下一个节点,同时删除节点中的数据
    • 进入容器:rm -rf /var/lib/mysql/*
  • 回滚备份时没有提交的事务:innobackupex --user=root --password=gitnavi123456 --apply-back /data/backup/full/2018-04-15_05-09-07/
  • 还原数据:innobackupex --user=root --password=gitnavi123456 --copy-back /data/backup/full/2018-04-15_05-09-07/

增量备份(未整理)

资料

教程来源于Github,感谢judasn大佬的无私奉献,致敬!

技术教程推荐

React实战进阶45讲 -〔王沛〕

深入拆解Java虚拟机 -〔郑雨迪〕

邱岳的产品实战 -〔邱岳〕

编辑训练营 -〔总编室〕

移动端自动化测试实战 -〔思寒〕

Java业务开发常见错误100例 -〔朱晔〕

TensorFlow 2项目进阶实战 -〔彭靖田〕

PyTorch深度学习实战 -〔方远〕

Vue 3 企业级项目实战课 -〔杨文坚〕