日期 | 作者 | 版本 | 备注 |
---|---|---|---|
2020-06-19 | 丁斌 | V1.0 | |
1. PXC介绍
1.1. PXC简介
PXC是Percona XtraDB Cluster的缩写,是 Percona 公司出品的免费MySQL集群产品。PXC的作用是通过mysql自带的Galera集群技术,将不同的mysql实例连接起来,实现多主集群。在PXC集群中每个mysql节点都是可读可写的,也就是主从概念中的主节点,不存在只读的节点。
Percona Server是MySQL的改进版本,使用 XtraDB 存储引擎,在功能和性能上较 MySQL 有着很显著的提升,如提升了在高负载情况下的 InnoDB 的性能,为 DBA 提供了一些非常有用的性能诊断工具,另外有更多的参数和命令来控制服务器行为。
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;
1.2. PXC特性和优点
A. 完全兼容 MySQL。
B. 同步复制,事务要么在所有节点提交或不提交。
C. 多主复制,可以在任意节点进行写操作。
D. 在从服务器上并行应用事件,真正意义上的并行复制。
E. 节点自动配置,数据一致性,不再是异步复制。
F. 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
G. 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;
PXC最大的优势:强一致性、无同步延迟
1.3. PXC的局限和劣势
1) 复制只支持InnoDB 引擎,其他存储引擎的更改不复制
2) 写入效率取决于节点中最慢的一台
1.4. PXC 常用端口
1) 3306:数据库对外服务的端口号。
2) 4444:请求SST的端口。
3) 4567:组成员之间进行沟通的一个端口号
4) 4568:用于传输IST。
名词解释:
SST(State Snapshot Transfer): 全量传输
IST(Incremental state Transfer):增量传输
1.5. PXC限制
(一) 存储引擎:
基于PXC的复制仅适用于InnoDB存储引擎。
对其他存储引擎的表,包括mysql.*表之类的系统表,任何写入都不会被复制。
那创建用户那岂不是无法同步了?关于这个问题。对于基于DDL方式的语句还是被支持的。
DDL语句使用基于语句级别的方式来实现(即不使用row模式)。
对mysql.*表的所有已DDL方式的更改都将以语句级别式进行复制。
如:CREATE USER… DDL被复制(语句级)INSERT INTO mysql.user… myisam存储引擎,不会被复制,因为非DDL语句当然也可以配置wsrep_replicate_myisam参数实现(不建议使用)
(二) 不支持的查询:
LOCK TABLES在多主模式中不支持UNLOCK TABLES以及LOCK TABLES
锁定功能,如GET_LOCK(),RELEASE_LOCK()等也不被支持
(三) 查询日志不能定向到表:
如果启用查询日志记录,则必须将日志转发到文件
使用general_log和general_log_file选择查询日志记录和日志文件名称
log_output = file # Author : Leshami # Blog : https://blog.csdn.net/leshami
(四) 最大事务大小:
允许的最大事务大小由wsrep_max_ws_rows和wsrep_max_ws_size变量定义
LOAD DATA INFILE方式处理每10000行提交一次。对于大的事务将被分解众多小型事务
(五) 集群乐观并发控制:
PXC集群使用乐观并发控制,事务发出COMMIT可能仍会在该阶段中止
可以有两个事务写入相同的行并在单独的Percona XtraDB集群节点中提交,并且只有其中一个可以成功提交。
失败的将被中止。对于集群级中止,Percona XtraDB集群返回死锁错误代码: (Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
(六) 不支持XA事务:
(七) 硬件配置短板限制:
整个群集的写吞吐量受最弱节点的限制。如果一个节点变慢,整个集群变慢。
如果您对稳定的高性能有要求,那么它应该由相应的硬件支持。
(八) 建议的最小群集大小是3个节点。第三个节点可以是仲裁者。
(九) InnoDB虚假更改功能不受支持。
(十) enforce_storage_engine=InnoDB与wsrep_replicate_myisam=OFF(默认)不兼容 。
(十一) 所有表必须有主键,不支持不带主键条件的delete。
(十二) 高负载时避免ALTER TABLE … IMPORT / EXPORT
在集群模式下运行Percona XtraDB集群时,请避免ALTER TABLE … IMPORT / EXPORT工作负载。如果未在所有节点上同步执行,则可能导致节点不一致。
2. pxc和proxysql安装
本节将叙述从当前pxc官网https://www.percona.com/software/mysql-database/percona-xtradb-cluster公布的最新的pxc版本:8.0.19版本(兼容支持mysql8.0版本),在3台centos7.5 操作系统服务器上,以具备sudo权限的用户安装在系统标准路径(一般是/usr/bin下)的实践流程细节。
此外,鉴于pxc集群对外提供读写查询服务需要负载均衡和读写分离功能,需要在在pxc集群安装完成之后,再安装一个高可用mysql中间件代理。常用的mysql中间件有mycat、proxysql等等。Pxc官网percona强烈推荐安装proxysql作为中间件负载均衡代理服务器,来负责分发所有外界到pxc集群的读写和查询操作。因此本节也将叙述pxc中间件代理服务器proxysql的安装细节。一般来说proxysql最好是在不同于pxc服务结点机器上安装,也可以在某一个pxc服务结点上安装。本文安装过程是在pxc1结点机器上安装的。
此外补充说明几点:
1) pxc官网提供的pxc集群常规和主流安装方法都是pxc软件所有命令(其实安装之后命令名称是mysql)都安装在系统标准路径(这里是/usr/bin)下。并不支持将其安装在其他用户特意指定目录下。因此建议一切想讲pxc命令工具集安装到用户指定目录下的尝试都终止,建议不要去尝试,因为这样的安装方法非主流,官网也没提供这种支持。
2) 本节只叙述pxc集群和proxysql代理命令的下载安装和初步启动证明命令是否安装成功可用。关于 pxc集群详细配置细节和集群部署细节、proxy的连接pxc集群的细节将在下节“pxc集群部署和proxysql代理中间件配置使用”中详细阐述。
3) Percona 官网提供了一份<
2.1. 准备工作
2.1.1. 环境准备
分布式pxc集群至少要求运行在3台或以上服务器上,否则会有脑裂等一致性问题发生。本文讲述是基于安装在3台vmware虚拟机上,各虚拟机机器结点如下表:
本节使用的所有vmware虚拟机配置均为CPU:8核,内存6G,硬盘足够。
2.1.2. 系统准备
以下所有操作都需要在所有机器上以root用户或具备sudo权限的用户去执行。
2.1.2.1. 创建pxc集群的basedir路径
以root用户权限在3台机器上统一特定路径位置创建pxc集群的basedir。后续该basedir目录下将分别创建出pxc集群的datadir /tmpdir/logdir等。必须保证basedir路径的硬盘空间适应未来业务数据增长的需求,硬盘空间足够大。本文basedir路径为/opt/pxc。
2.1.2.2. 新建专门的linux用户和组
新建专门的linux用户和组,以便安全方式运行进程
a) groupadd mysql
创建group mysql
vim /etc/group
会发现最后一行有mysql用户组
b) adduser -g mysql mysql
创建mysql用户,同时加入mysql用户组,自动创建mysql的homedir为/home/mysql
vim /etc/passwd 可以看到最后一行是mysql用户。
c) passwd mysql
为mysql用户新设立密码
d) 将mysql用户加入sudo权限
chmod +w /etc/sudoers
vim /etc/sudoers
然后再执行chmod -w /etc/sudoers
e) mkdir /opt/pxc/data
mkdir /opt/pxc/tmp
mkdir /opt/pxc/log
chown -R pxc:pxc /opt/pxc
修改pxc集群的basedir 路径/opt/pxc的所属user和group为mysql用户名和mysql组。以上的data tmp log 3个目录将分别是mysql服务的datadir logdir tmpdir等。
注意:后文中所有涉及到pxc集群安装的操作,都可以以mysql用户加sudo 执行。或者直接以root用户执行也可。
2.1.2.3. 卸载对pxc安装有影响的软件或库
可见3台机器上/usr/bin路径之前已经安装好了mysql PerconaXtraDBCluster。 (这是之前做的测试安装的结果,现在重新安装之前,要把之前标准路径位置安装的mysql相关程序命令全部卸载掉。)
如果之前是通过yum install percona-xtradb-cluster 安装的,卸载方法是:
yum remove percona-xtradb-cluster
移除完了percona-xtradb-cluster后which mysql
发现mysql命令还在,继续处理,通过rpm -qa 查询所有带mysql字样的rpm安装包如下:
然后挨个执行rpm -e --nodeps 或者执行yum remove xxxx移除如下:
Cent7b机器上卸载过程如下:
以上表明cent7b机器卸载完成。
Cent7a机器卸载过程如下:
至此,cent7a/cent7b/cent7c 3台机器上已经安装的mysql或percona相关命令都已经被移除完毕。
g) 有些 CentOS 版本默认捆绑了mariadb-libs,在安装PXC之前需要先将其卸载
yum -y remove mari*
以上操作可见通过
yum remove mari* 或rpm -qa | grep -i mari | xargs rpm -ev –nodeps 都是可以的。
2.1.2.4. 防火墙、selinux和端口准备
CentOS7 端口的开放关闭查看都是用防火墙来控制的,Centos 从6升级到7之后,不再是用之前的iptables 命令控制linux端口,centos7取而代之的是用firewalld代替了原来centos6的iptables。
2.1.2.4.1. Centos7防火墙用法简述
以下简述centos7防火墙相关操作用法:
查看防火墙状态:(active (running) 即是开启状态)
1) 查看防火墙服务状态
systemctl status firewalld
2) 开启/关闭防火墙:
开启防火墙:systemctl start firewalld
关闭防火墙:systemctl stop firewalld
禁止firewalld开机启动:systemctl disable firewalld
firewalld开机启动:systemctl enable firewalld
3) 查询端口号3306 是否开启
firewall-cmd --query-port=3306/tcp
可见3306防火墙端口未开启
4) 查询有哪些端口是开启的
firewall-cmd --list-port
5) 重启防火墙
firewall-cmd --reload
6) 开启端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
--zone #作用域
--add-port=3306/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
注意:开启端口后必须执行firewall-cmd --reload 以重启防火墙才能生效,否则不生效。
2.1.2.4.2. pxc集群部署涉及需要的防火墙端口操作
如前文章节所述,pxc集群需要默认开放4个端口:3306,4444,4567,4568。
3306-mysql实例端口
4567-pxc cluster相互通讯的端口
4444-用于SST传送的端口
4568-用于IST传送的端口
要保证pxc集群机器之间端口正常通讯,要么直接关闭每个机器的防火墙,要么开启所有机器的防火墙但同时开启如下4个端口。
方案1:关闭防火墙systemctl stop firewalld
方案2:开启防火墙但是同时开放4个端口如下
systemctl start firewalld
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --reload
本文采取方案2,开启防火墙但同时开启以上4个端口,效果如下:
注意开启防火墙要执行以下:systemctl enable firewalld 保证下次开启启动防火墙。
2.1.2.4.3. pxc集群部署涉及需要的selinux操作
pxc集群部署需要把 SELINUX 值设置成 disabled
查看现在selinux的状态:sestatus
修改文件中SELINUX=disable即可。
至此,pxc集群安装所需的全部准备工作全部完成。下面开始安装pxc集群。
2.2. 安装pxc集群
Percona官网讲述了3种pxc集群安装方案:
1) 通过percona仓库安装;
2) 通过下载的二进制包安装;
3) 源码编译安装。
以上3种安装方法中3)源码编译安装最复杂,编译时需要解决众多依赖,速度慢过程复杂是不建议的安装方法。Percona最推荐的安装方案是推荐percona仓库安装。当然,通过从percona官网下载二进制包直接安装也是官网比较推荐的安装方法。
通过percona仓库安装和通过下载的二进制包安装这2中安装方案各有优缺点:通过percona仓库安装操作最为简单,centos的yum或 ubuntu的apt-get等软件安装器能自动寻找安装所需依赖库,一键完成安装,操作简单。缺点是安装过程下载的依赖包等下载速度慢,需要等待较长时间。通过下载的二进制包安装因为二进制包提前已经下载好,省去了下载的过程,安装耗时短。缺点是依赖需要自己一步步安装好,操作稍显复杂。
本文着力采用2)通过下载的二进制包安装。但会对1)通过percona仓库安装方案实践过程做个简述。生产环境下还是建议使用2) 通过下载的二进制包安装。
最后再次说明本文叙述的pxc集群安装是指:从当前pxc官网
https://www.percona.com/software/mysql-database/percona-xtradb-cluster
公布的最新的pxc版本:8.0.19版本(兼容支持mysql8.0版本),在3台centos7.5 操作系统服务器上,以具备sudo权限的用户安装在系统标准路径(一般是/usr/bin下)的实践流程细节。
2.2.1. 通过percona仓库安装pxc集群
在centos7上通过yum可有直接安装pxc集群命令,但需要特殊配置一下yum源。Percona官网为此特地提供了配置工具:percona-release以简化yum安装pxc集群的yum源配置过程。Percona-release详细用法可参见网页:
https://www.percona.com/doc/percona-repo-config/percona-release.html#rpm-based-gnu-linux-distributions。
以下简述其安装步骤:
2.2.1.1. 安装percona-release
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
安装完成之后会发现percona-release命令可以使用了,其yum源目录:/etc/yum.repos.d/目录下多了一个percona-origin-release.repo的yum源配置文件。
2.2.1.2. 配置安装pxc80和相关依赖工具所需要的yum源
执行:percona-release enable-only pxc-80 release 命令,导致yum源目录重新生成了yum安装pxc8.0所需要的yum源文件:percona-pxc-80-release.repo, 之前的percona-original-release.repo文件被重命名为percona-original-release.repo.bak了。(注意:/etc/yum.repos.d目录下只有.repo后缀的文件才能生效,其他文件不生效。)
接着执行:percona-release enable tools release 配置yum 安装pxc8.0所需依赖工具集的yum源。完成后,/etc/yum.repos.d目录下新生成percona-tools-release.repo源文件。
2.2.1.3. yum 执行install percona-xtradb-cluster
yum install percona-xtradb-cluster
一键安装,不过安装过程下载非常缓慢,非常耗时,大约等待好几个小时。
安装完成后,执行which mysql,可以看到/usr/bin目录下出现mysql。通过mysql –version可以发现这就是安装好的pxc8.0版本的mysql。
鉴于yum install pxc8.0过程下载太耗时,我们在生产环境下更强烈推荐下节的通过下载好的二进制包文件来安装pxc集群。进入下节之前,请按照前文方法卸载或移除所有yum安装好的mysql 或percona相关文件。
2.2.2. 通过下载的二进制包安装pxc集群
2.2.2.1. 下载二进制包文件
通过https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/ 下载相关的二进制包:
下载非常慢,大约好几个小时。
虽然主程序二进制包下载完成,但还不够。此外pxc8.0的二进制包还需要下载依赖包如下:
percona-xtrabackup-80
qpress
接下来,别从https://repo.percona.com/release/7/RPMS/x86_64/ 依次下载:
percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm
percona-xtrabackup-80-debuginfo-8.0.13-1.el7.x86_64.rpm
percona-xtrabackup-test-80-8.0.13-1.el7.x86_64.rpm
以上3个文件和
qpress-11-1.el7.x86_64.rpm 文件;
再从https://repo.percona.com/release/7/os/x86_64/ 或https://www.percona.com/downloads/proxysql2/下载proxysql2-2.0.12-1.1.el7.x86_64.rpm 这个proxysql2 程序包。(proxysql2后文会再提到具体用法,是推荐的较好的pxc集群的负载均衡中间件。)
以上5个文件和Percona-XtraDB-Cluster-8.0.19-r217-el7-x86_64-bundle.tar 解压后的10个文件汇合一处,共计15个文件,形成的pxc8.0_on_centos7_tarball文件夹就是centos7本地安装二进制包所需要的全部二进制文件。
pxc8.0_on_centos7_tarball 压缩包见项目文件pxc8.0_on_centos7_tarball.tar.gz,文件大小1.1Gb。链接地址是:pxc8.0_on_centos7_tarball.tar.gz,提取码是:dqxu。因此,参照本文档安装时,不再需要从头下载每一个文件,直接使用项目文件pxc8.0_on_centos7_tarball.tar.gz即可。否则下载过程及其耗时,长达数小时之久。
2.2.2.2. 安装本地二进制包文件
注意:生产环境下建议用本节方法安装pxc集群。
安装之前先用yum install安装可用用到的第三方依赖库如下:
yum install -y openssl socat procps-ng chkconfig procps-ng coreutils shadow-utils grep libaio libev libcurl perl-DBD-MySQL perl-Digest-MD5 libgcc libstdc++ libgcrypt libgpg-error zlib glibc openssl-libs
接下来正式安装pxc8.0。
分别在cent7a/cent7b/cent7c 3台机器上以root用户创建/root/tmp,
解压项目清单中的pxc8.0_on_centos7_tarball.tar.gz 到/root/tmp目录下:
2.2.3. 初次启动mysql服务并修改管理员用户(root)密码
从现在开始,启动mysql服务或修改它的配置都切换到mysql用户下。
初次启动mysql服务一定做如下处理:
修改mysql服务配置文件中datadir tmpdir logdir和logdir等配置路径。
如前节所述,已经将/opt/pxc目录作为pxc集群的basedir.
Centos 下Pxc集群中的mysql默认配置文件是/etc/my.cnf。
vim /etc/my.cnf
默认的配置文件如下:
上述配置将pxc对外提供服务的默认端口(是3306)改为8888。并创建/opt/pxc下data tmp log3个目录分别作为mysql服务的数据存储目录,tmp目录和log目录。依旧将所有目录改为mysql用户和mysql组。
mkdir -p /opt/pxc/data
mkdir -p /opt/pxc/tmp
mkdir -p /opt/pxc/log
lower_case_table_names=1使得数据库表明不区分大小写。
default_authentication_plugin=mysql_native_password 是为了兼容旧版mysql的密码加密方式。
接下来启动每个节点上的mysql服务。注意必须切换到mysql用户以sudo systemctl start mysql 命令启动。(当然sudo service mysql start命令启动也可以。)
sudo systemctl status mysql #查询mysql服务状态
sudo systemctl stop mysql #停止mysql服务
vim /opt/pxc/log/mysqld.log 可以看到mysql服务启动日志如下:
接下来很重要的一个工作是首次登陆,输入密码,修改root密码,并且创建root@%账户使得root可以从任意host连接mysql服务。
执行 grep password /opt/pxc/log/mysqld.log 从日志中查询mysql首次临时密码
然后修改root@localhost密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass';
FLUSH PRIVILEGES;
修改了root@localhost的密码后 exit退出后重新以新密码登陆试试。
此外很重要的一个操作是:创建root@%用户使得root用户可以从任意host连接mysql服务。
CREATE USER 'root'@'%' IDENTIFIED BY 'rootPass' ;
GRANT ALL ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
接下来在远程主机上用navicat连接尝试如下:
另外两个服务器上重复上述设置操作完成即可。
至此,pxc集群命令工具安装完成。此时每一个mysql服务都是一个单独孤立的实例,并不形成集群。
接下来讲述pxc集群部署和proxysql代理中间件配置使用。
3. 部署pxc集群
部署pxc集群基于前节3个节点上mysql 命令都可以正常启动连接了。接下来如下操作:
3.1. 停止所有节点上的mysql服务
在cent7a、cent7b 、cent7c 三个节点上依次执行命令:sudo systemctl stop mysql
3.2. 修改cent7a节点上/etc/my.cf
sudo vim /etc/my.cf
重要的修改如上两图所示,简单说明如下:
server-id是pxc实例在pxc集群中的唯一id,必须是数字,不能重复,不同pxc集群节点依次设置1,2,3....
wsrep_provider维持固定设置就可以。
wsrep_cluster_address是pxc集群地址,至少为集群所有节点的1个值。但强烈建议把所有集群节点ip都写上。
wsrep_node_address当前pxc节点的ip地址。
wsrep_cluster_name是pxc集群名,所有节点的这个值必须一致。
wsrep_node_name当前pxc节点的名称,不同节点必须不一致。
重点要说明的是:pxc-encrypt-cluster-traffic的值有ON和OFF两个可能的取值。其默认值是ON,即如果文件中不配置,相当于pxc-encrypt-cluster-traffic=ON。目前文件中改配置项是注释状态,即表明pxc-encrypt-cluster-traffic=ON。 该配置项的含义是 pxc集群所有节点之间通讯的加密与否,OFF表示不加密,ON表示加密,使用的是TSL验证。官方也是强烈推荐用ON以TLS加密认证通讯。Mysq程序第一次启动时会在datadir即:/opt/pxc/data目录下自动生成相关的TLS认证相关文件,文件均已.pem后缀结尾。
设置了pxc-encrypt-cluster-traffic=ON后,PXC集群节点间会通过这些认证文件进行相互间数据同步的通讯。唯一需要注意的是,所有节点的这些认证文件必须一致。这非常重要。
按照以上同样的方法设置其他2个节点的/etc/my.cf文件。
3.3. 同步TLS认证文件
拷贝cent7a节点上datadir即/opt/pxc/data目录下的所有*.pem文件到所有其他节点的datadir即/opt/pxc/data目录下。
3.4. 引导启动pxc集群第一个节点
此处是cent7a为集群第一个节点。在cent7a上执行:
sudo systemctl start [email protected]
接着mysql登录该服务,执行show status LIKE 'wsrep%';
其中wsrep_cluster_size 为1,表明现在pxc集群中只有1个节点。wsrep_local_state_comment 为Synced表明pxc集群节点已经完成通过。后续每往集群中增加一个节点,都强烈建议在上一个节点这个值为Synced之后再操作,1个接1个节点加入,不要一次性加入所有节点。
3.5. 依次加入其它节点到pxc集群
先在cent7b上执行:sudo systemctl start mysql
(注意:只有第一个节点需要引导启动,命令是:sudo systemctl start [email protected],后续加入其它节点的命令都是:sudo systemctl start mysql)
注意以这种方式依次将其它节点都加入第一个节点所在的pxc集群,后续所有节点的数据都会被清空,然后将节点1引导节点的数据同步过来。
再登录第二个节点的mysql服务,mysql用户名和密码直接被同步成了引导节点的用户名和密码。继续执行:show status LIKE 'wsrep%';
发现此时pxc集群数量2,Synced 表明数据完成了同步。
至此,pxc集群部署启动完毕。
注意:
整个集群关闭后想以某个节点作为第一个启动节点启动,但节点使用systemctl start [email protected]无法启动,一般是由于该节点关闭的时间不是集群中最晚的一个关闭时间,如果强制启动可能会有数据差异不安全,所以一种办法是找集群最后一个关闭的节点作为第一个启动节点重启整个集群,或者在确保不会有数据丢失的情况下修改mysql安装文件夹下的grastate.dat文件,将其中的safe_to_boostrap设置为1后强行启动。
3.6. 验证PXC集群数据复制正确性
在3个节点上都以mysql客户端程序登录mysql服务:执行命令是:
mysql -uroot -h cent7a -P 8888 -p
最终形成如下在mysql客户端程序内部的有明确命令行提示符的状态,如下图。
以上操作步骤是在3个不同的结点mysql服务上交替进行的,最终能查询出预期的数据,证明pxc集群数据复制功能work well。
4. proxysql代理中间件配置使用
proxysql是percona官方强烈推荐的支持pxc集群的mysql中间件,能提供诸如负载均衡和读写分离等众多功能。注意:pxc8.0不再支持proxysql v1版本,支持proxysql v2版本。
Proxysql服务启动后,一个守护进程对外提供mysql流量分发服务,另一个监控进程会实时监控守护进程,一旦发现守护进程挂了会立即重启守护进程,以最小化宕机时间,尽可能保证proxysql服务高可用。
4.1. Proxysql的安装
Proxysql有2种安装方法:通过yum安装和通过rpm程序安装。
Yum安装proxysql需要配置yum源,方法同前节提到的方法:使用percona release,然后执行: percona-release enable tools release完成后,/etc/yum.repos.d目录下新生成percona-tools-release.repo 文件即为proxysql所需要的yum 源。接下来执行:yum install proxysql2 大约需要15分钟完成安装。
本节推荐的是利用官网下载的rpm程序包文件在centos7上直接执行rpm安装,优点是不用下载,安装快速。Rpm程序包文件见 项目清单中的:pxc8.0_on_centos7_tarball.tar.gz解压后的:proxysql2-2.0.12-1.1.el7.x86_64.rpm。链接地址是同前文一样的地址:pxc8.0_on_centos7_tarball.tar.gz,提取码是:dqxu。
然后执行:
sudo rpm -ivh proxysql2-2.0.12-1.1.el7.x86_64.rpm
安装完成以后which proxysql即可看到proxysql程序安装完成,proxysql –version 可以看到是proxysql 2.0 版本。
另外想知道 rpm文件中的内容或rpm安装了什么,可以通过如下命令查看。
rpm -qpl proxysql2-2.0.12-1.1.el7.x86_64.rpm
或
rpm -ql proxysql2
可见proxysql 相关的重要配置文件是/etc/proxysql.cnf和 /etc/proxysql-admin.cnf。proxysql的整体配置可以从proxysql.cnf读,admin配置可以从proxysql-admin.cnf 热load进来。
注意:
在某个机器上安装了proxysql后,要在同机器上登录proxysql服务还需要在同机器上安装任意mysql客户端程序。本文因为将proxysql程序安装在cent7a机器上之前已经安装了pxc。因此已经存在mysql客户端程序,不需要再额外安装。
4.2. Proxysql服务配置和启动
下面讲述proxysql服务的配置和启动。
依次执行:
sudo mkdir /opt/proxysql
sudo chown proxysql:proxysql /opt/proxysql
以上创建了/opt/proxysql目录为proxysql的datadir。
接下来打开/etc/proxysql.cnf
sudo vim /etc/proxysql.cnf, 可见如下红框中一段话非常重要,大意是:/etc/proxysql.cnf作为proxysql服务的配置文件只在服务第一次启动时有效。第二次即以后启动服务时,只读取/etc/proxysql.cnf的datadir设置,默认设置是/var/lib/proxysql, 然后到datadir目录下是去找sql库文件一般是proxysql.db,如果找到该文件,则永远是加载该文件以初始化配置服务。
只有找不到该文件时才读取/etc/proxysql.cnf文件中的配置以加载启动proxysql服务。
如果要强行加载/etc/proxysql.cnf文件内容以启动proxysql服务,则执行systemctl start proxysql-initial 而不是常规的systemctl start proxysql。
datadir和errorlog文件位置都重新配置到了/opt/proxysql目录(之前已经创建好了)。
admin_credentials是设置登录proxysql的管理界面的用户名和密码,这里改为admin:q1w2e3r4。
同时可以看到proxysql 服务启动后会有2个端口:6032是proxysql的管理界面端口,6033是proxysql对外提供连接到后端pxc集群的数据库数据流量查询等的端口,类似mysql的3306。
为验证变化,我们将端口分别改成了60330和60320。
注意不要忘记在cent7a上打开60320和60330的防火墙端口。
启动之前有个小细节:
sudo vim /usr/lib/systemd/system/proxysql.service
需要改PID选项:
保存退出后执行sudo systemctl daemon-reload 重新加载修改。
至此,以上我们配置好了proxysql,接下来执行:sudo systemctl start proysql即可启动proxysql服务。
接下来在cent7a上执行:
mysql -uadmin -P60320 -h 127.0.0.1 –p
密码输入q1w2e3r4即可登录proxysql 的管理界面。
4.3. Proxysql服务管理界面初次动态配置
登录到proxysql管理界面后,要初次动态配置一些基本的配置,以使得proxysql可用。
main 库是proxysql当前配置的内存库。 disk是持久化到文件中的配置的库; monitor是proxysql监控后台pxc集群相关配置的库。
Stats相关的库是状态收集相关的库。
简要说明的是,proxysql 配置有3种生效空间,Memory,Runtime,Disk。内存和disk分别对应内存中的配置和持久化存储在磁盘上的配置。Runtime是运行时的配置,及时生效的。
接下来,show tables; 可以看到有很多表,其中较重要的有
global_variables
mysql_servers
mysql_users
接下来的动态配置会涉及到这些table。
执行select * from mysql_servers; 可见是个空表。
Table mysql_servers存储的是proxysql连接后端pxc集群的mysql服务结点的信息。很重要。
现在来添加所有pxc集群节点到proxysql。
4.3.1. 首次添加pxc集群节点到proxysql
依次执行如下命令:
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(0,'192.168.0.110',8888);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(0,'192.168.0.111',8888);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(0,'192.168.0.112',8888);
即可把pxc集群的cent7a cent7b cent7c3个节点都加入proxysql。
注意:
hostgroup_id一般情况下,写入为一组,读取为一组,这里用默认的0,表示读写。
status 为ONLINE 表示3个节点都可提供服务。简要解释如下:
1) ONLINE:当前后端实例状态正常
2) SHUNNED:临时被剔除,可能因为后端 too many connections error,或者超过了可容忍延迟阀值 max_replication_lag
3) OFFLINE_SOFT:"软离线"状态,不再接受新的连接,但已建立的连接会等待活跃事务完成。
4) OFFLINE_HARD:"硬离线"状态,不再接受新的连接,已建立的连接或被强制中断。当后端实例宕机或网络不可达,会出现。
Weight表示连接某个结点的概率,越大概率月大。默认是1。
此外max_connections,comment等都是可以指定修改的。
注意执行完上述操作后一定要记得执行下面的2个操作:
LOAD MYSQL SERVERS TO RUNTIME; #将当前的修改加载到runtime
SAVE MYSQL SERVERS TO DISK; #将当前的修改保存到DISK
show create table mysql_serversG
hostgroup_id:ProxySQL通过hostgroup的形式组织后端db实例,一个hostgroup代表同属于一个角色。
表的主键是(hostgroup_id, hostname, port),以hostname:port在多个hostgroup中存在。
一个hostgroup可以有多个实例,即是多个从库,可能通过weight分配权重。
hostgroup_id 0是一个特殊的hostgroup,路由查询的时候,没有匹配到规则则默认选择hostgroup 0。
show create table mysql_usersG
username,password:连接到后端MySQL或ProxySQL实例的凭证,参考密码管理。
密码可插入明文,也可通过PASSWORD()插入密文,proxysql以*开头判断插入是否是密文。
但是runtime_mysql_users里统一是密文,所以明文插入,再SAVE MYSQL USERS TO MEM,此时看到的也是HASH密文。
active:是否生效该用户,active=0的用户将在数据库中被跟踪,但不会加载到内存中的数据结构中。
default_hostgroup:这个用户的请求没有匹配到规则时,默认发到hostgroup,默认0。
default_schema:这个用户连接时没有指定schema时,默认使用的schema。
默认为NULL,实际上受变量mysql-default_schema的影响,默认为information_schema。
transaction_persistent: 如果设置为1,连接上ProxySQL的会话后,如果在一个hostgroup上开启了事务,那么后续的sql都继续维持在这个hostgroup上,不论是否会匹配上其它路由规则,直到事务结束。
frontend:如果设置为1,则用户名、密码对ProxySQL进行身份验证。
backend:如果设置为1,则用户名、密码根据任何主机组向mysqld服务器进行身份验证。
注意: 目前所有用户都需要将“前端”和“后端“都设置为1,未来版本的ProxySQL将分离前端和后端之间的crendentials。以这种方式,前端将永远不会知道直接连接到后端的凭据,强制所有通过ProxySQL的连接并增加系统的安全性。
4.3.2. 创建proxysql监控用户
假定创建的proxysql 监控用户名和密码分别是:proxysql_monitor和q1w2e3r4。
先去任意pxc集群节点上创建该用户,并且要授予USAGE权限。
执行细节如下:
然后到proxysql管理界面去执行添加pxc的监控用户名和密码信息如下:
最后查看监控日志:
SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
可以看到proxysql已经能正确监控pxc集群的3个节点了。之前默认设置monitor用户是不能监控的。
4.3.3. 创建proxysql 客户端用户
Proxysql 要想作为mysql中间件 提供对后端pxc集群的代理流量服务,必须要拥有客户端用户。注意这个用户目前是跟后端pxc集群对外提供服务的用户是一样的。
因为前文中已经创建好了pxc集群的对外提供服务用户是root@%,密码是q1w2e3r4。
因此,本节只需要在proxysql管理界面中创建这个root@%用户即可。
接下来可以通过任意mysql 客户端登录proxysql的60330端口和root@%,q1w2e3r4访问pxc集群。
比如通过navicat如下:
之前在3.6节中在pxc集群上创建的percona.example 表的数据此处可以通过proxysql在navicat上查询出来,证明proxysql能有效对外提供服务。
4.3.4. 验证proxysql读负载均衡
在navicat新建一个查询执行 select @@hostname,结果如下:
再从navicat新建一条查询,同样执行 select @@hostname 结果如下:
再开一个新查询,同样执行select @@hostname,结果如下:
可见不同的查询,来自不同pxc集群的不同结点,体现了负载均衡。
在Proxysql管理界面执行语句:
select * from stats.stats_mysql_connection_pool
可以看到目前Proxysql与后台pxc集群的connection pool情况,如下:
可以看到hostgroup 为0的3台pxc机器服务 都connection Used 且connection Ok。
5. 延伸阅读:Percona和MariaDB对比
5.1. 缘起
自从甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险。而且Oracle对培养MySQL这个免费的儿子并不太用心,漏洞修补和版本升级的速度一段时间非常缓慢,所以业界对MySQL的未来普遍不抱有乐观态度。因此社区采用分支的方式来避开这个风险,例如谷歌、Facebook、RedHat都将MySQL替换成了衍生版,国内也有企业纷纷放弃了MySQL官方版,像阿里和腾讯还做起了自己的MySQL衍生版。
目前MySQL领域存在着众多的衍生版数据库,主流的有官方MySQL、MariaDB以及Percona Server,小众一些的还有阿里的OceanBase和腾讯的CDB等等。那么Percona和MariaDB这两个主要的MySQL分支是怎么产生的呢?
5.2. MariaDB
起初MySQL之父Monty在1979年写下MySQL的第一行代码,后来逐渐创建起MySQL公司,后将其以10亿美金卖给Sun,结果Sun又把MySQL转手卖给Oracle,Monty愤而出走,以MySQL5.5为基础创造了MariaDB数据库,这样就诞生出了MySQL分支里知名度最高的一个衍生版。
5.3. Percona Server
Percona Server是MySQL咨询公司Percona发布的性能最接近MySQL企业版的MySQL产品。Percona公司在MySQL数据库优化方面做了非常多的工作,以至于Percona Server数据库是MySQL众多分支中,在高负载、高并发情况下表现非常突出,乃至阿里巴巴的OceanBase数据库都要借鉴Percona Server。
1) 性能接近
其实在正常情况下,MariaDB和Percona Server的性能是差不多的,为什么是这样呢?
MySQL 4和5使用MyISAM作为默认存储引擎。从MySQL 5.5开始,就将默认存储引擎从MyISAM更改为InnoDB。这是因为长期以来MyISAM没有提供事务支持,使得MySQL游离在数据强一致性的门槛之外,正是InnoDB的加入,在使得MySQL从Oracle市场份额中分一杯羹。
我们先看看MariaDB使用的存储引擎。因为版权的原因,MariaDB一开始就放弃了InnoDB这个让MySQL大放异彩的存储引擎,最终选择了XtraDB引擎作为InnoDB的替代。
一方面,XtraDB引擎能做到的向下兼容,创建数据表的时候,InnoDB引擎会自动被替换成XtraDB引擎,用户和客户端根本感觉不到MariaDB和MySQL的区别。另外一方面,XtraDB的对事务的良好支持,让用户也感受不到XtraDB和InnoDB的区别。另外,在多核CPU和大内存上,XtraDB性能比InnoDB更好。
说到这里还要补充一句,XtraDB引擎是Percona公司开发设计的,与MySQL5.1内置的InnoDB相比,单位时间执行事务数量是后者的2.7倍。而且在Percona Server上面默认使用的也是XtraDB引擎。所以说MariaDB和Percona Server在正常情况下的性能基本持平。但是在高并发和高负载的条件下,Percona Server的表现更好一些。
2) 部署平台
MariaDB的跨平台性更好一些,支持Windows平台和Linux平台,但是不支持MacOS平台。如果在MacOS平台上安装MacOS需要先安装Brew。
Percona Server不支持跨平台,只能在Linux平台安装
3) 兼容性
MariaDB与Percona Server各自选择了对MySQL兼容的方式。MariaDB的起点是MySQL5.5,然后对MySQL改造,并且与MySQL5.6以上版本存在很大的差别。比如在单表保存一对多关系数据上面,MariaDB选择了DynamicColume(动态列)实现方式,而MySQL选择的是JSON方式。虽然都是一对多关系,但是MariaDB动态列的方式使用非常繁琐,也不支持数组格式,相反MySQL的实现就好很多。另外MariaDB的动态不支持索引,因此说按照动态列中的字段查找数据速度会很慢,而MySQL支持JSON索引,查询速度会快很多。
Percona Server与MariaDB不同,它是先兼容MySQL然后再进行优化,所以用户可以很容易的从MySQL迁移到Percona Server上面,而不用去考虑兼容性的问题。
4) 选择
选择是痛苦的事情,对于MariaDB和Percona Server两个数据库,各大公司也存在分歧,淘宝使用的是Percona Server,而Google和Facebook则站在了MariaDB这边。从中我们可以看出,注重数据库稳定性和可靠性的企业都会选择Percona Server,包括利用Percona Server组建的Percona XtraDB Cluster集群,都体现的严格的数据读写一致性,这对于商业系统来说极为重要,读写速度来说仅仅是第二位的。那些数据价值低,注重数据读写速度的企业,更喜欢使用MariaDB,因为用MariaDB组建Replication集群,在保存SEO搜索、论坛帖子、新闻资讯、社交信息上速度更快。
说到这里,选择MariaDB还是Percona Server,唯一衡量的标志为是否存储商业数据。