先做时间同步

查看:ssh ip date  ssh ip date 

环境:两台虚拟机

172.16.0.211 node1

172.16.0.212 node2

注意事项:测试环境建议关掉iptables,selinux

A:安装MySQL集群软件

1、在node1、node2 分别安装Percona-XtraDB-Cluster-5.7.16-rel10-27.19.1.Linux.x86_64.ssl101.tar.gz

上传软件包:

1、Percona-XtraDB-Cluster-5.7.16-rel10-27.19.1.Linux.x86_64.ssl101.tar.gz

2、mysql57-community-release-el6-8.noarch.rpm

groupadd mysql

useradd -r -g mysql -s /bin/false mysql

mkdir /home/data/mysql -p

cd /usr/local/

tar -zxvf /root/Percona-XtraDB-Cluster-5.7.16-rel10-27.19.1.Linux.x86_64.ssl101.tar.gz

ln -s Percona-XtraDB-Cluster-5.7.16-rel10-27.19.1.Linux.x86_64.ssl101/   mysql

cd mysql

 ls

mkdir mysql-files

chmod 750 mysql-files/

chown -R mysql:mysql .

bin/mysqld --initialize --user=mysql --datadir=/home/data/mysql  --basedir=/usr/local/mysql     --pid-file=/home/data/mysql/mysql-node1.pid       --socket=/home/data/mysql/mysql.sock    

(--pid-file=/home/data/mysql/mysql-node1.pid 、--pid-file=/home/data/mysql/mysql-node2.pid、--pid-file=/home/data/mysql/mysql-node3.pid)

bin/mysql_ssl_rsa_setup  --datadir=/home/data/mysql   

chown -R root .

chown -R mysql:mysql      /home/data/mysql

chown -R mysql   mysql-files


加入my.cnf

bin/mysqld_safe --user=mysql &

ps -ef |grep mysql

vi /home/data/mysql/mysql-error.log 

vi /etc/my.cnf 

bin/mysqld_safe --user=mysql &

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm -y

yum -y install Percona-XtraDB-Cluster-client-57-5.7.16-27.19.1.el6.x86_64 


使用服务启动

cp -af /usr/local/mysql/support-files/mysql.server  /etc/init.d/


vi /etc/init.d/mysqld

修改两处位置:

basedir=/usr/local/mysql

datadir=/home/data/mysql


修改root:

UPDATE mysql.user  SET authentication_string = PASSWORD('some34QA'), password_expired = 'N'  WHERE User = 'root' AND Host = 'localhost';




B:安装percona xtrabackup

1、yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm  (如果安装不成功则执行)

2、yum install -y wget 

      wget http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm --no-check-certificate   

      rpm -ivh  percona-release-0.1-3.noarch.rpm

3、yum install -y epel-release.noarch   (如果报错则修改 vi /etc/yum.repos.d/epel.repo  将baseurl注释取消,mirrorlist 添加注释  )

4、yum install  -y percona-xtrabackup-24

5、安装依赖包:

yum install -y git scons gcc g++ openssl check cmake bison \libboost-all-dev libasio-dev libaio-dev libncurses5-dev libreadline-dev \libpam-dev socat

yum  -y install git scons gcc gcc-c++ openssl check cmake bison boost-devel asio-devel libaio-devel ncurses-devel readline-devel pam-devel socat

yum -y install perl-DBD-MySQL  perl-DBI  perl-Time-HiRes


同步node1 node2

在生产数据库备份 表结构和表数据:

结构:

mysqldump -uroot -p -S /home/data/mysql/mysql.sock --single-transaction --set-gtid-purged=off --no-data --routines=off -B cash 

analysis electric 

数据:

mysqldump -uroot -p -S /home/data/mysql/mysql.sock --single-transaction --set-gtid-purged=off --no-create-info --no-create-db --

routines=off --triggers --add-drop-table=off -B cash analysis electric >date81.sql

备份完成后恢复到node1上(先恢复表结构,做表分区后再恢复数据,前提是需要做表分区才做),再node1上将g_game_bets表做分区


导入node1    在将node1 备份 还原到node2  


C:启动node1、node2

加入my.cnf

node1:


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

wsrep_cluster_address=gcomm://172.16.0.158,172.16.0.159

wsrep_node_name=mysql-s

wsrep_node_address=172.16.0.159

wsrep_sst_method=xtrabackup-v2

wsrep_cluster_name=my_centos_cluster

wsrep_sst_auth=sstuser:s3cret

pxc_strict_mode=ENFORCING

innodb_autoinc_lock_mode=2

wsrep_provider_options="gcache.size=2G;gcache.page_size=256M;"


node2:

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

wsrep_cluster_address=gcomm://172.16.0.158,172.16.0.159

wsrep_node_name=mysql-m

wsrep_node_address=172.16.0.158

wsrep_sst_method=xtrabackup-v2

wsrep_cluster_name=my_centos_cluster

wsrep_sst_auth=sstuser:s3cret

pxc_strict_mode=ENFORCING

innodb_autoinc_lock_mode=2

wsrep_provider_options="gcache.size=2G;gcache.page_size=256M;pc.ignore_sb = yes;"


1、启动node1:

/etc/init.d/mysqld bootstrap-pxc 

对复制帐号进行授权,并修改root密码,推荐使用grant方式:创建一个供xtrabackup创建SST的帐号   需和配置参数下的 wsrep_sst_auth=sstuser:s3cret 一样

GRANT RELOAD, LOCK TABLES, PROCESS,REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost' IDENTIFIED BY 's3cret';


grant all on *.* to root@'%' identified by 'some34QA' with grant option;

grant all on *.* to root@'localhost' identified by 'some34QA' with grant option;

show status like ’wsrep%’;

 

2、启动node2:

/etc/init.d/mysqld start

对复制帐号进行授权,并修改root密码,推荐使用grant方式:创建一个供xtrabackup创建SST的帐号   需和配置参数下的 wsrep_sst_auth=sstuser:s3cret 一样

GRANT RELOAD, LOCK TABLES, PROCESS,REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost' IDENTIFIED BY 's3cret';

grant all on *.* to root@'%' identified by 'some34QA' with grant option;

grant all on *.* to root@'localhost' identified by 'some34QA' with grant option;

FLUSH PRIVILEGES;

show status like ’wsrep%’;

 


D:配置PXC节点参数

       配置前将各节点关闭   /etc/init.d/mysqld  stop

1、修改node1的配置参数 

vi /etc/my.cnf

在【mysqld】下添加下列参数:

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

wsrep_cluster_address=gcomm://172.16.0.211,172.16.0.212  

wsrep_node_name=node1 

wsrep_node_address=172.16.0.211  

wsrep_sst_method=xtrabackup-v2     

wsrep_cluster_name=my_centos_cluster 

wsrep_sst_auth=sstuser:s3cret     

pxc_strict_mode=ENFORCING    

innodb_autoinc_lock_mode=2     

配置完成后启动node1   启动方式为:

/etc/init.d/mysqld bootstrap-pxc 


2、修改node2的配置参数 

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so    #库文件

wsrep_cluster_address=gcomm://172.16.0.211,172.16.0.212    #节点中所有ip

wsrep_node_name=node2   #节点的名称

wsrep_node_address=172.16.0.212   #节点的ip

wsrep_sst_method=xtrabackup-v2     #采用什么方式复制数据。还支持mysqldump,rsync

wsrep_cluster_name=my_centos_cluster   #集群名字

wsrep_sst_auth=sstuser:s3cret      #sst模式需要的用户名和密码 (和添加的用户、密码一样)

pxc_strict_mode=ENFORCING    #暂时不支持其他存储引擎,只支持innodb,当然可以支持myisam,需要另外参数打开

innodb_autoinc_lock_mode=2      #自增锁的优化

配置完成后启动node2   启动方式为:

/etc/init.d/mysqld start



E:添加node3 

添加node方式:

如果是集群是新搭建的,或者说直接使用SST的方式加入新节点,那么新节点的配置就直接按照前面的主节点配置来就可以了,只是把wsrep_node_address改成对应节点的IP即可,而对于已经运行了一段事件的集群,新加入节点使用SST传送全量数据的方式同步的代价比较高,所以下面讨论一个IST方式加入新节点同步数据的方式


1、安装MySQL、xtrabackup、安装依赖包

2、在node1上创建一个复制账号:

grant replication slave on *.* to 'toya'@'172.16.0.%' identified by 'some34QA';


flush privileges;


3、在node1上导出全量备份数据,为了方便使用mysqldump来导出备份,并scp到新节点上:

mysqldump --master-data=2 -S /home/data/mysql/mysql.sock -u root -p --single-transaction -A > node1.sql

4、查看到db.sql文件中的change master语句,后边要使用:

grep '\-\- CHANGE MASTER' node1.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=49792040;

将备份集node1.sql  scp到node3

scp node1 :/172.160.213:/root

5、在node3添加

basedir = /usr/local/services/mysql

datadir = /data/mysql/data

binlog_format=ROW     #binlog格式必须为row

default_storage_engine=InnoDB  #暂时不支持其他存储引擎,只支持innodb,当然可以支持myisam,需要另外参数打开

innodb_autoinc_lock_mode=2     #自增锁的优化

log_bin=mysql-bin

server-id=3

上面配置参数大多在my.cnf里面已经配置  如有就不用添加  只需要添加innodb_autoinc_lock_mode=2     #自增锁的优化

6、启动node3修改root密码,并导入node1.sql:

/etc/init.d/mysqld start

grant all on *.* to root@'172.16.0.%' identified by 'some34QA' with grant option;

grant all on *.* to root@'localhost' identified by 'some34QA' with grant option;

flush privileges;

source /root/node1.sql;

7、使用change master语句开启复制(把前面node1.sql文件中的change master语句补全,并在新节点上执行):

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=49792040,MASTER_USER='toya',MASTER_PASSWORD='some34QA',MASTER_HOST='172.16.0.211',MASTER_PORT=3306;

start slave;

8、同步正常之后,到主库上去创建一个库,表,并写入几条测试数据,然后到从库上看看同步成功没有(因为这里是测试环境,node1节点上没有数据,所以需要搞点测试数据,如果线上环境这步骤可以省略,直接在上一步骤同步建立完之后stop slave,再看一下show slave status记下Relay_Master_Log_File和Exec_Master_Log_Pos的二进制日志坐标即可进入跳过这个步骤)

在node1上创建测试数据

9、在新节点上停掉同步,并查看show slave status\G中的Relay_Master_Log_File和Exec_Master_Log_Pos的二进制日志坐标,记下它后边有用,然后停掉新节点的mysqld实例:

stop slave;

show slave status\G;


停掉mysqld实例:


service mysqld stop   或者  /etc/init.d/mysqld stop

10、到node1节点上flush logs以下,然后使用新节点上找到的同步坐标查找xid,这个xid就是新节点在gcache中需要从什么位置开始同步数据:

cd /home/data/mysql 

mysqlbinlog -v mysql-bin.000006 |grep -i xid   

 

可以看到,在主库上对应二进制日志坐标的xid=658283,记下这个数字,后边有用,顺序在node1上查看下这个xid是否在gcache缓存中有效:

show status like '%wsrep_local_cached_downto%';

  发现从658284开始(实际上658284不是开始数据,是做笔记的数据,真实的要小很多),说明xid为658284有效,继续后面的步骤

11、查看node1上的grastate.dat文件:

cat grastate.dat

# GALERA saved state

version: 2.1

uuid:    4aaf285d-da79-11e6-aa04-1f3d45ca1897

seqno:   -1

safe_to_bootstrap: 0

seqno为-1就表示这个节点已经在集群中,把这个文件复制到新节点的datadir目录下,并修改为mysql用户属主:


scp  grastate.dat 172.16.0.213:/home/datel/mysql/

chown mysql.mysql /home/datel/mysql/grastate.dat

12、修改新节点上/home/datel/mysql/grastate.dat文件中的seqno为前面找到的xid:

# GALERA saved state

version: 2.1

uuid:    4aaf285d-da79-11e6-aa04-1f3d45ca1897

seqno:   658283

safe_to_bootstrap: 0

13、添加PXC配置参数:

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

wsrep_cluster_address=gcomm://172.16.0.211,172.16.0.212,172.16.0.213

wsrep_node_name=node3

wsrep_node_address=172.16.0.213

wsrep_sst_method=xtrabackup-v2

wsrep_cluster_name=my_centos_cluster

wsrep_sst_auth=sstuser:s3cret

pxc_strict_mode=ENFORCING

innodb_autoinc_lock_mode=2

14、按照常规启动新节点,然后查看错误日志是否有错误,没有错误就在集群中的两个节点上各写一条数据, 验证下数据是否都能相互同步成功

/etc/init.d/mysqld start

在新节点创建库、表、插入数据 如果几个节点都同步 至此,使用IST方式加入PXC新节点的方式目的达到。且同步瞬间已经正常了,新节点上的slave信息可以不需要了,直接stop slave;reset slave all即可。



节点启动:

关闭:node1 node2 node3

启动:node3 node2 node1  或者 node3 node1 node2   

最后关闭的节点必须最先启动


如果node3是在集群后面再加的节点  启动的时候需要在node1 或者node2 添加node3节点的IP地址,如果启动之前未添加ip 则会报以下错误代码:


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

Starting MySQL (Percona XtraDB Cluster)................................... ERROR! The server quit without updating PID file (/home/data/mysql/mysql-node2.pid).

 ERROR! MySQL (Percona XtraDB Cluster) server startup failed!



同时mysql-error.log会报如下错误:

2017-01-15T02:07:09.759080+08:00 0 [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection timed out)

         at gcomm/src/pc.cpp:connect():158

2017-01-15T02:07:09.759101+08:00 0 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():208: Failed to open backend connection: -110 (Connection timed out)

2017-01-15T02:07:09.759181+08:00 0 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1407: Failed to open channel 'my_centos_cluster' at 'gcomm://172.16.0.211,172.16.0.212': -110 (Connection timed out)

2017-01-15T02:07:09.759205+08:00 0 [ERROR] WSREP: gcs connect failed: Connection timed out

2017-01-15T02:07:09.759214+08:00 0 [ERROR] WSREP: wsrep::connect(gcomm://172.16.0.211,172.16.0.212) failed: 7

2017-01-15T02:07:09.759221+08:00 0 [ERROR] Aborting



如果意外三个节点同时关闭,启动任何节点都会报以下错误代码:

[root@node1 ~]# /etc/init.d/mysqld bootstrap-pxc 

Bootstrapping PXC (Percona XtraDB Cluster) ERROR! MySQL (Percona XtraDB Cluster) is not running, but PID file exists


此时查看 vi /home/data/mysql/grastate.dat      将safe_to_bootstrap: 0  改为 safe_to_bootstrap: 1   然后在启动

# GALERA saved state

version: 2.1

uuid:    2844f0f6-da73-11e6-b3f9-0bc3f31f9c21

seqno:   -1

safe_to_bootstrap: 0


监控状态说明

集群完整性检查:

wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.

wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复的时候应该会恢复一样的值.

wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.

wsrep_cluster_status:集群组成的状态.如果不为”Primary”,说明出现”分区”或是”split-brain”状况.

节点状态检查:

wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.

wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)

wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.

复制健康检查:

wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.

wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.

wsrep_flow_control_sent:表示该节点已经停止复制了多少次.

wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.

最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.

检测慢网络问题:

wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶

冲突或死锁的数目:

wsrep_last_committed:最后提交的事务数目

wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目

MySQL Galera监控

    查看MySQL版本:   mysql> SHOW GLOBAL VARIABLES LIKE 'version';

    查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';

    查看wsrep有关的所有变量: mysql> SHOW VARIABLES LIKE 'wsrep%' \G

    查看Galera集群状态: mysql> show status like 'wsrep%';