MySQL 高可用集群解决方案--pxc

一、pxc简介

pxc是percona公司的percona xtraDB cluster.简称PXC。它是基于GaLera协议的高可用集群方案。可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据强一致性。pxc提供了MySQL高可用的一种实现方法,pxc集群是由节点组成的,推荐配置至少3个节点
  • 优点总结

    • 服务高可用
    • 数据同步复制(并发复制),几乎无延迟
    • 多个可同时读写节点,可实现写扩展
    • 新节点可以自动部署,部署操作简单
    • 数据严格一致性
    • 完全兼容MySQL
  • 缺点总结

    • 只支持InnoDB引擎
    • pxc集群一致性控制机制,是有可能被终止,原因如下:
    集群允许在两个节点上同时执行操作同一行的两个事务,但是只有一个能执行成功,另一个会被终止,集群会给被终止的客户端返回死锁错误(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK))
    
    • 所有表都要有主键
    • 新加入的节点采用SST时代价高

二、原理描述

PXC是基于引擎层的同步复制,而不是异步复制,所以数据一致性更高。同时,基于引擎层,没有sql thread应用过程,所以没有延迟;PXC所有节点全都关掉后,不管怎么启动都有可能做SST的传输。原因是增量数据需要在内存里面记录,如果全部关闭,数据就是失效了,节点之间不知道同步到什么位置了

  • pxc会使用四个端口号
    • 3306:数据库对外服务端口号
    • 4444:请求SST
    • 4567:组成员之间进行沟通的一个端口号
    • 4568:传输IST用的
  • 名词说明
    • WS:写数据集
    • IST:增量同步
    • SST:全量同步

三、pxc集群的启动和关闭

  • 状态机变化阶段

    • 1)OPEN:节点启动成功,尝试连接到集群,如果失败则根据配置退出或创建新的集群
    • 2)PRIMARY:节点处于集群PC中,尝试从集群中选取donor进行数据同步
    • 3)JOINER:节点处于等待接收/接收数据文件状态,数据传输完成后在本地加载数据
    • 4)JOINED:节点完成数据同步工作,尝试保持和集群进度一致
    • 5)SYNCED:节点正常提供服务:数据的读写,集群数据的同步,新加入节点的sst请求
    • 6)DONOR(贡献数据者):节点处于为新节点准备或传输集群全量数据状态,对客户端不可用
  • 状态机变化因素

    • 新节点加入集群
    • 节点故障恢复
    • 节点同步失效
  • 传输SST的几种方法

    • mysqldump
    • xtrbackup
    • rsync

四、pxc节点挂掉处理方案

因为突然掉电,不确定哪个节点的数据是最新的,查看gvwstate.dat文件找出最新的seqno(cat /var/lib/mysql/gvwstate.dat )

  • 当普通节点挂掉
    • 重启该节点即可,重启后数据会同步到当前集群的最新数据
  • 当根节点挂掉
    • 删除这个节点,重新创建容器,以节点的方式挂载到这个节点之前的数据卷位置,看其他存活节点中/var/lib/mysql目录下gvwstate.dat 文件中的view_id对应的新的根节点,然后以这个新的根节点为CLUSTER_JOIN启动,之后数据将会全部进行同步
  • 当所有节点都挂掉
    • 如果pxc所有节点都挂掉时,建议删除所有节点以及挂载文件中的grastate.dat,然后以某个节点为根节点去启动集群(或者找到最后一个死亡的节点中的grastate.dat文件,修改文件中配置项safe_to_bootstrap为1,以该节点为master节点去启动集群)

五、grastate.dat文件内容详解

  • seqno
    • 当我们关闭一个节点时,其seqno会写入grastate.dat文件中,这时后续的seqno该节点将无法接收到
    • 注意数据库开启状态或者异常关闭时seqno值为-1
    • 当我们将所有节点关闭,准备重启时我们需要知道哪个节点是最后关闭的,并使用它来引导集群,这时查看seqno的值即可,最大的即可
  • safe_to_bootstrap
    • 安全引导即safe to bootstrap ,从3.19版本开始,Galera为防止在错误的节点上引导集群,引入了安全引导的保护
    • 如果我们使用safe_to_bootstrao为0的节点来引导,数据库将无法启动
    • 我们可以手动编辑该文件将值设置为1来引导,不过这样可能会造成数据丢失
    • 如果所有节点同时异常宕机,这时所有节点的值都为0,需要选择一台手动编辑

六、docker搭建pxc-mysql集群

  • 目录结构

    ./pxc
    ├── pxc-node1
    │   ├── data
    │   └── docker-compose.yml
    ├── pxc-node2
    │   ├── data
    │   └── docker-compose.yml
    └── pxc-node3
        ├── data
        └── docker-compose.yml
    
    • pxc-node1/docker-compose.yml
    version: "3.5"
    
    services:
      pxc-node1:
        image: percona/percona-xtradb-cluster:5.7
        container_name: pxc-node1
        restart: always
        privileged: true
        ports:
          - "33061:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - CLUSTER_NAME=pxc
        volumes:
          - $PWD/data:/var/lib/mysql
          
    
    networks:
      default:
        external:
          name: mysql_net
    
    • pxc-node2/docker-compose.yml
    version: "3.5"
    
    services:
      pxc-node2:
        image: percona/percona-xtradb-cluster:5.7
        container_name: pxc-node2
        restart: always
        privileged: true
        ports:
          - "33062:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=oa3uTgs9K2soZljX
          - CLUSTER_NAME=pxc
          - CLUSTER_JOIN=pxc-node1
        volumes:
          - $PWD/data:/var/lib/mysql
          
          
    networks:
      default:
        external:
          name: mysql_net
    
    • pxc-node3/docker-compose.yml
    version: "3.5"
    
    services:
      pxc-node3:
        image: percona/percona-xtradb-cluster:5.7
        container_name: pxc-node3
        restart: always
        privileged: true
        ports:
          - "33063:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=oa3uTgs9K2soZljX
          - CLUSTER_NAME=pxc
          - CLUSTER_JOIN=pxc-node1
        volumes:
          - $PWD/data:/var/lib/mysql
          
    
    networks:
      default:
        external:
          name: mysql_net
    
  • 启动服务

    • 以pxc-node1为根节点,先启动pxc-node1
      cd ./pxc/pxc-node1  && docker-compose up
      
    • 然后加入pxc-node2和pxc-node3普通节点
      cd ./pxc/pxc-node2  && docker-compose up
      cd ./pxc/pxc-node3  && docker-compose up
      
    • docker ps查看启动情况
  • 错误解决
    1、如果报错/entrypoint.sh: line 336: /var/lib/mysql//version_info: Permission denied,就修改一下data文件夹权限
    2、如果第一个启动的是普通节点,或者根节点写了- CLUSTER_JOIN=xxx,会报错
    [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1527: Failed to open channel 'pxc' at 'gcomm://pxc-master': -131 (State not recoverable)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,561评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,205评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,638评论 2 7