先做时间同步
查看: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%';