MySQL高可用—PXC集群
percona xtradb cluster
percona:基于mysql数据库二次开发的数据库产品
xtradb:存储引擎
要搭建pxc集群,需要三台虚拟机。三台虚拟机之间不是主从的模式,而是各自为主,三者属于对等的关系,不分主从,这个叫多主架构
实现PXC集群的原理
客户端写入数据——接收数据的节点完成写入——将写入的内容广播支集群中的其他两个节点——两个节点接收到请求后,会先核实,看执行的操作是否会和本身存在的数据冲突——如果不冲突,就执行,然后将完成结果报告给接收数据的节点——当所有节点都汇报完——最后返回给客户端结果“完成写入操作”
PXC集群特点
1、多主架构,集群没有主从
2、节点的数据强一致性
3、并行复制
4、集群中节点故障,在添加新节点之后,节点会进行自动同步,不需要手动同步
5、支持增量复制也支持全量复制
使用的端口
3306:用来提供数据库服务
4567:集群中节点之间的通信端口
4568:节点之间增量复制的端口
4444:节点之间全量复制的端口
部署PXC集群
实验环境
三台基础环境的liunx(能联网),环境中不能存在数据库服务
192.168.1.1(接收数据节点)
192.168.1.4
192.168.1.6
实验步骤
第一步
三台服务器需要做一下相同的操作来安装
使用网络源下载percona网络源(请找一个vpn)
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
编辑此yum源
[root@localhost ~]# vim /etc/yum.repos.d/percona-release.repo
修改
gpgcheck = 0 # 第八行
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Percona # 第九行删除
gpgcheck = 0 # 第十四行
# 十四行以下全部删除
接着使用yum安装percona,因为自带的网络源没有percona,需要网络很好的情况下,否则会一直尝试其他镜像
[root@localhost ~]# yum -y install Percona-XtraDB-Cluster-57
第二步
部署一个接收数据节点,这里以192.168.1.1主机为例
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
修改几个注释的地方
[mysqld]
server-id=1 # 三台服务器的id不能相同
datadir=/usr/local/pxc/data # 数据文件的目录
socket=/var/lib/mysql/mysql.sock
log-error=/usr/local/pxc/log/mysqld.log # 错误日志的目录
pid-file=/usr/local/pxc/data/mysqld.pid # pid存放的目录
log-bin=mysql-bin # 开启二进制文件
log_slave_updates
expire_logs_days=7
第三步
创建配置文件中的所需目录
mkdir -p /usr/local/pxc/data /usr/local/pxc/log
chown -R mysql:mysql /usr/local/pxc/ # 给目录授权
第四步
调整集群配置文件
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
修改
wsrep_cluster_address=gcomm://192.168.1.1,192.168.1.4,192.168.1.6 #指定集群的节点
wsrep_node_address=192.168.1.1 # 指定当前节点的ip
wsrep_cluster_name=pxc-cluster # 集群名称
wsrep_node_name=pxc-cluster-node-1 # 本节点名称
pxc_strict_mode=PERMISSIVE # 同步数据时的为宽容模式
wsrep_sst_auth="sstuser:123.com" # sst全量备份时使用的身份验证的用户
将改过的配置文件传到其他两台服务器
[root@localhost ~]# cd /etc/percona-xtradb-cluster.conf.d/
[root@localhost percona-xtradb-cluster.conf.d]# scp wsrep.cnf mysqld.cnf root@192.168.1.4:/etc/percona-xtradb-cluster.conf.d/
[root@localhost percona-xtradb-cluster.conf.d]# scp wsrep.cnf mysqld.cnf root@192.168.1.6:/etc/percona-xtradb-cluster.conf.d/
第五步
调整其他两台集群配置文件
192.168.1.4
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
修改
server-id=2
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
修改
wsrep_node_address=192.168.1.4
wsrep_node_name=pxc-cluster-node-2
创建配置文件中的所需目录
mkdir -p /usr/local/pxc/data /usr/local/pxc/log
chown -R mysql:mysql /usr/local/pxc/ # 给目录授权
192.168.1.6
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
修改
server-id=3
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
修改
wsrep_node_address=192.168.1.6
wsrep_node_name=pxc-cluster-node-3
创建配置文件中的所需目录
mkdir -p /usr/local/pxc/data /usr/local/pxc/log
chown -R mysql:mysql /usr/local/pxc/ # 给目录授权
验证
在此之前每台服务器关闭防火墙沙盒
192.168.1.1
因为当开启数据库之后没有权限所以需要在配置文件中添加一行内容
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
添加:
skip-grant-tables # root没有密码 使用这个选项跳过权限认证
在1.1启动服务
systemctl start mysql@bootstrap
因为在初始环境mysql没有密码,所以需要登录到mysql设置密码
在这里改密码
mysql -u root
# 在用户表中插入用户
mysql> update mysql.user set authentication_string=password('123.com') where User='root';
# 必须先刷新 否则没有权限授权
mysql> flush privileges;
# 授权给全量复制的用户,此用户和配置文件的sstuer:123.com要对应一致
mysql> grant all on *.* to "sstuser"@"localhost" identified by "123.com";
更改密码的第二种方法
mysql> set password=password("123.com"); #给root设置密码 会有警告需要设置密码的时间
ERROR 1133 (42000): Can't find any matching row in the user table # 这个报错可能会有
mysql> alter user "root"@"localhost" password expire never; #让root密码永久生效
设置密码之后就可以将第一台1.1中配置文件的跳过密码配置给去掉
[root@localhost ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld
skip-grant-tables # 这一行删除
然后重启服务(建议先停止在启动)出错不负责
[root@localhost ~]# systemctl stop mysql@bootstrap
[root@localhost ~]# systemctl start mysql@bootstrap
尝试使用密码登录mysql
mysql -u root -p123.com
其他两台的服务还没启动,启动后同样登录尝试
[root@localhost ~]# systemctl start mysqld # 启动时间稍微比平常服务长点
[root@localhost ~]# mysql -uroot -p123.com
在接收数据的节点创建数据库,以验证是否同步
创建数据库前必须使用alter user重置用户密码,即使不重置,对数据库的任何操作都会报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user 'root'@'localhost' identified by '123.com';
然后接着创建数据库
mysql> create database cyj;
去其他两台查看数据库验证,也同样需要重置密码
mysql> alter user 'root'@'localhost' identified by '123.com';
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cyj |
| mysql |
| performance_schema |
| sys |
+--------------------+