PXC是percona公司的percona  xtraDB  cluster,简称PXC。它是基于Galera协议的高可用集群方案。可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据强一致性。

PXC架构图:

 

 

三个节点都已经启动成功,这样在任意一个节点上面,执行一条DML语句的操作,都会同步到另外两个节点

PXC就属于一套近乎完美的MySQL高可用集群架构方案;

优点总结:

1.可以达到时时同步,无延迟现象发生

2.完全兼容MySQL

3.对于集群中新节点的加入,维护起来很简单

4.数据的强一致性

不足之处总结:

1.只支持Innodb存储引擎

2.存在多节点update更新问题,也就是写放大问题

3.在线DDL语句,锁表问题

4.sst针对新节点加入的传输代价过高的问题

实战过程:

环境介绍:3台centos 7

walt001192.168.150.138

walt002192.168.150.139

walt003192.168.150.143

安装之前的注意事项:

三台机器的防火墙iptables都要关闭,三台机器的server-id不能一样。

PXC软件包下载:

xtrabackup下载地址

https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.6/binary/tarball/percona-xtrabackup-2.4.6-Linux-x86_64.tar.gz

Percona-XtraDB-Cluster下载

https://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.26-25.12/binary/tarball/Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64.tar.gz

这里我下载的是:Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64

接下来三台机器上都需要针对基础软件包进行安装,使用yum安装即可,解决依赖性。

三台机器都需要操作的步骤:

· 把IP和主机名写到hosts文件里(这个不是主要项,方便主机名解析而已,我没有完全一样的hosts结果也成功,不成功 不用在这里纠结)

[root@xxx]# cat /etc/hosts

192.168.150.138  walt001

192.168.150.139  walt002

192.168.150.143  walt003

因为pxc本身包含mysql主程序,为防止端口占用删除多余数据库安装包

yum remove mariadb-* -y

安装依赖

yum install perl-IO-Socket-SSL.noarch perl-DBD-MySQL.x86_64 perl-Time-HiRes openssl openssl-devel socat -y

提前告诉你,如果系统是最小化安装事先做这两个软连接避免初始化报库文件缺失错误。

[root@xxx ~]# ln -sv /usr/lib64/libcrypto.so.10 /lib64/libcrypto.so.6

[root@xxx ~]# ln -sv /usr/lib64/libssl.so.10 /lib64/libssl.so.6

定位到解压目录 

[root@xxx ~]# cd /usr/local/

[root@xxx local]# tar xvf /rrot/percona-xtrabackup-2.4.6-Linux-x86_64.tar.gz 

[root@xxx local]# tar xvf /root/Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64.tar.gz

建个软连接,方便使用

[root@xxx local]# ln -sv Percona-XtraDB-Cluster-5.6.26-rel74.0-25.12.1.Linux.x86_64 mysql

[root@xxx local]# useradd  -s /sbin/nologin mysql

[root@xxx local]# chown mysql.mysql -R mysql

[root@xxx local]# cp percona-xtrabackup-2.4.6-Linux-x86_64/bin/* mysql/bin/

[root@xxx local]# mkdir -p /data/mysql

[root@xxx local]# chown mysql.mysql -R /data/mysql/

先配置第一台机器,并成功启动后再配置其他两台

在第一台主机上创建配置文件:

创建配置文件:

[root@xxx local]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket = /tmp/mysql.sock

pid-file=/data/mysql/mysql.pid

character_set_server = utf8

max_connections = 3000

back_log= 3000

skip-name-resolve

sync_binlog=0

innodb_flush_log_at_trx_commit=1

server-id = 1

#pxc主要配置项

default_storage_engine=Innodb

innodb_autoinc_lock_mode=2

binlog_format=row

wsrep_cluster_name=pxc_zs  #集群名称

wsrep_slave_threads=4   #开启的复制线程数,cpu核数*2

wsrep_cluster_address=gcomm://192.168.150.138,192.168.150.39,192.168.150.143 #集群所有服务器ip都加进来

wsrep_node_address=192.168.150.138 #本机ip

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth=sst:zs

把这个文件写好了,传到其他两台机器的 /etc 下面,修改 server-id 和 wsrep_node_address

每个主机的server-id 和wsrep_node_address 保持不同即可

初始化数据:

/usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/data/mysql/ –defaults-file=/etc/my.cnf –user=mysql

复制进程文件到系统服务目录,启动第一节点的服务:

[root@xxx local]#cd /usr/local/mysql/support-files

[root@xxx support-files]#cp mysql.server /etc/init.d/mysql

[root@xxx support-files]# /etc/init.d/mysql bootstrap-pxc

 
 

创建环境变量,让系统变量读到MySQL的路径:

[root@xxx opt]# echo “export PATH=$PATH:/usr/local/mysql/bin” > /etc/profile.d/mysql.sh && source /etc/profile.d/mysql.sh

登陆或者初始化的时候提示缺少库文件,find命令依次查找库文件做软连接到/lib64

[root@xxx ~]# find / -name “libreadline*

/usr/lib64/libreadline.so.6

/usr/lib64/libreadline.so.6.2

[root@xxx ~]# ln -sv /usr/lib64/libreadline.so.6 /lib64/libreadline.so.5

[root@xxx ~]# ln -sv /usr/lib64/libcrypto.so.10 /lib64/libcrypto.so.6

[root@xxx ~]# ln -sv /usr/lib64/libssl.so.10 /lib64/libssl.so.6

启动成功之后,维护数据库环境并创建用户

进入数据库 ,默认密码是空的

#mysql -uroot -p

mysql> delete from mysql.user where user!=’root’ or host!=’localhost’;

mysql> grant all privileges on *.* to ‘sst‘@’%’ identified by ‘zs’;

mysql> grant all privileges on *.* to ‘sst’@’localhost’ identified by ‘zs’;

mysql> flush privileges;     #mysql 5.6以后这个命令可以不用,授权都是立即生效的

当第一个主节点成功启动,并创建了授权的用户后,开始配置其他的机器

安装步骤和上面相同,只要保证配置文件的server-id 和wsrep_node_address 不同即可

wsrep_node_address 填写当前机器的IP

启动命令和第一台不同,用下面的命令启动:

[root@xxx mysql]# /etc/init.d/mysql start

第二台动后查看集群状态:

在第一个机器上执行:

[root@xxx mysql]#mysql -v  #空密码的状态下这个命令可以直接登录mysql

mysql> show status like ‘wsrep%’;

 
 

注意:我一开始第二台怎么都启动不了,  刷日志发现一直连接超时,各种抓狂,然后试着远程连接mysql   失败,想到应该是被防火墙挡住了,出现开头那个报错 金融系统开发找上海捌跃网络科技有限公司

#关闭selinux,防火墙打开pxc所需端口,或者取消注释直接关闭防火墙

sed -i s/”SELINUX=enforcing”/”SELINUX=disabled”/g  /etc/selinux/config #reboot后生效

setenforce 0  #临时关闭selinux

#systemctl stop firewalld

#systemctl disable firewalld

#iptables -F

firewall-cmd –zone=public –add-port=80/tcp –permanent

firewall-cmd –zone=public –add-port=3306/tcp –permanent

firewall-cmd –zone=public –add-port=4567/tcp –permanent

firewall-cmd –zone=public –add-port=4568/tcp –permanent

firewall-cmd –zone=public –add-port=4444/tcp –permanent

firewall-cmd –reload

生产环境还是添加端口为好,有硬件防火墙,直接关闭系统防火墙即可。

后面的第三台,第xx台就没什么问题了。集群创建成功后,执行 mysql_secure_installation 来安全初始化。

安全初始化如果报错(概率不大)可以尝试登录mysql执行:

set global wsrep_provider_options=”pc.bootstrap  = yes”;

当然在生产环境,我还是小心的配置了ip访问限制,安全才是王道。

注意:

全部关闭需要采用滚动关闭方式:

1.  关闭node1,修复完后,启动加回来;

2.  关闭node2,    修复完后,启动加回来;

3. ………………….,直到最后一个节点

4.  原则要保持Group里最少一个成员活着

数据库关闭之后,最会保存一个last Txid,所以启动时,先要启动最后一个关闭的节点,启动顺序和关闭顺序刚好相反。

wsrep_recover=on参数在启动时加入,用于从log中分析gtid。

怎样避免关闭和启动时数据丢失?

1. 所有的节点中最少有一个在线,进行滚动重启;

2. 利用主从的概念,把一个从节点转化成PXC里的节点。

pxc注意的问题

1. 脑裂

任何命令执行出现unkown command ,表示出现脑裂,集群两节点间4567端口连不通,无法提供对外服务。

SET GLOBAL wsrep_provider_options=”pc.ignore_sb=true”;

2. 并发写

三个节点的自增起始值为1、2、3,步长都为3,解决了insert问题,但update同时对一行操作就会有问题,出现:Error: 1213 SQLSTATE: 40001,所以更新和写入在一个节点上操作。

3. DDL

引起全局锁,采用:pt-online-schema-change

4. MyISAM引擎不能被复制,只支持innodb

5. pxc结构里面必须有主键

如果没有主建,有可能会造成集中每个节点的Data page里的数据不一样

6. 不支持表级锁

不支持lock /unlock tables

7. pxc里只能把slow log ,query log 放到File里

8. 不支持XA事务

9. 性能由集群中性能最差的节点决定

如果不幸PXC全部节点宕机,无法连接,那么先启动第一节点,后面的节点cd到mysql,data目录下:

如:

#cd /data.mysql

#rm -f gvwstate.dat

这样后面的节点就可以启动了。

整理自:

http://blog.51cto.com/13555753/2317462

https://www.jianshu.com/p/4b766325bf4a

Mysql 高可用集群PXC的更多相关文章

  1. MySQL高可用集群方案

    一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+ ...

  2. Mysql高可用集群环境介绍

    MySQL高可用集群环境搭建 01.MySQL高可用环境方案 02.MySQL主从复制原理 03.MySQL主从复制作用 04.在Linux环境上安装MySQL 05.在MySQL集群环境上配置主从复 ...

  3. 部署MYSQL高可用集群

                                                  mysql-day08     部署MYSQL高可用集群 u 集群架构                   ...

  4. MySQL高可用集群MHA方案

    MySQL高可用集群MHA方案 爱奇艺在用的数据库高可用方案 MHA 是目前比较成熟及流行的 MySQL 高可用解决方案,很多互联网公司正是直接使用或者基于 MHA 的架构进行改造实现 MySQL 的 ...

  5. keepalived+MySQL高可用集群

    基于keepalived搭建MySQL的高可用集群   MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Clus ...

  6. corosync+pacemaker and drbd实现mysql高可用集群

    DRBD:Distributed Replicated Block Device 分布式复制块设备,原理图如下 DRBD 有主双架构和双主架构的,当处于主从架构时,这个设备一定只有一个节点是可以读写的 ...

  7. heatbeat-gui实现基于nfs的mysql高可用集群

    一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...

  8. 构建MHA实现MySQL高可用集群架构

    一.MHA简介 MHA(Master HighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开 ...

  9. MYSQL高可用集群架构-MHA架构

    1  MHA简介:MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司 ...

随机推荐

  1. Vue.js 父子组件相互传递数据

    父传子 : 子组件接收变量名=父组件传递的数据 如::f-cmsg="fmsg"  注意驼峰问题 子传父:@子组件关联的方法名 = 父组件接受的方法名 如:@func=" ...

  2. (转) 从0移植uboot(五) _实现串口输出

    ref : https://www.cnblogs.com/xiaojiang1025/p/6500520.html 串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可 ...

  3. 整理一下rmq

    rmq(int i,int j,int a)表示查询a数组i到j区间的内容中的最大/最小值核心部分为二分区间以及st预处理算法 先说st预处理算法吧 int dp[i][j];//表示以i开始 长度为 ...

  4. (三)引用中央仓库中不存在的jar包

    有些jar包有版权oracle.sqlserver等,所以在maven的中央仓库是不提供下载引用的,但是这个jar包我们可以在别的地方下载到电脑,这是我们需要收工安装到本地仓库,然后再引用 A:手工安 ...

  5. 通过Kubeadm搭建Kubernetes集群

    历经断断续续学习的两天,终于完成了一个简单k8s集群. 参考 https://www.cnblogs.com/edisonchou/p/aspnet_core_on_k8s_deepstudy_par ...

  6. lambda select和where区别

    本文用一个linq to xml语法作为示例,以下是用来操作的xml:<?xml version="1.0" encoding="utf-8" stand ...

  7. 常用的bug管理工具

    1. QC(Quality Center)是原Mercury Interactive公司(现已被HP收购)生产的企业级基于WEB測试管理工具,须要安装配置IIS和数据库.系统资源消耗比較 大:功能非常 ...

  8. 对SPI进行参数化结构设计

    前言 为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸. SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有3线和四线. SPI slave有啥用呢,当外部主 ...

  9. springboot 上传图片,地址,在页面展示图片

    package com.cxwlw.zhcs.controller.api;import org.springframework.stereotype.Controller;import org.sp ...

  10. 去“BAT”这样面试,拿到offer的几率是80%

    一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:“面试官为什么会 ...