993-MySQL集群(PXC)入门
https://www.imooc.com/learn/993
简介:本课程以项目演示为例,讲解PXC集群原理、PXC数据同步与Replication同步的区别、PXC的多节点并发写入、Docker虚拟机部署MySQL集群,并以案例验证Replication方案的数据不一致性、PXC方案数据一致性
第1章 课程介绍
本章总体介绍本课程学习的目标和学到的知识。
1-1 引言
引言:
伴随互联网经济的兴起,越来越多的领域需要相应的技术方案
行业:打车软件、电商平台、直播平台、电子支付、媒体社交
案例:滴滴出行、淘宝/京东、斗鱼直播、支付宝/微信、QQ
单机单节点数据库没有冗余设计,如果数据库节点挂掉(断电、断网),则全部不能使用(网站不能访问)
使用冗余设计,即数据库节点集群在一起,性能翻倍。数据库集群。
向BAT高标准看齐。
1-2 天猫双十一案例
天猫双十一:
- 2017年天猫双11交易额1682亿元,3分钟破百亿,9小时破干亿
- 交易峰值32.5万/秒,支付峰值25.6万/秒,数据库峰值4200万/秒
- 云服务器、负载均衡、RDS云数据库等技术
淘宝/天猫使用3000+台数据库
1-3 微信红包案例
微信红包:
- 2017年除夕当天,全国人民总共收发142亿个红包,峰值42万/秒
- 央视春晚微信摇一摇互动总量达110亿次,峰值8.1亿/秒
- 请求排队串行化、双维度分库表等设计
1-4 技术学习的目标和方式
技术学习的目标和方式
- 向大型互联网应用看齐,学习架构设计和业务处理
- 由浅入深,循序渐进;案例由小到大,逐步扩展
- “视频学习”优于“看书学习”
1-5 课程学习目标
本门课程学习目标
掌握PXC集群MySQL方案的原理
掌握PXC集群的强一致性
掌握PXC集群的高可用方案
1-6 硬件环境介绍
硬件环境需求
- Win10×64专业版或企业版/Linux/MacOS
- Docker虚拟机
- 内存8GB以上
docker ps -a
pxc * 3 + haproxy * 1
第2章 PXC原理
本章介绍数据库集群的必要性,以项目演示在数据库集群、Tomcat集群、Redis集群、Nginx负载均衡的部署环境下,后台程序遇到各种宕机,但是后台程序仍然高可用,最后介绍PXC数据同步的原理。
2-1 单节点数据库的介绍
数据库集群的必要性
单节点数据库的弊病:
情况说明
- 大型互联网程序用户群体庞大,所以架构必须要特殊设计
- 单节点的数据库无法满足性能上的要求
- 单节点的数据库没有冗余设计,无法满足高可用
单节点数据库压力测试:
测试案例
mysqlslap -hlocalhost -uroot -p123456 -P3306 # 并发量5000连接 --concurrency=5000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb # 共测试5000条SQL语句 --number-of-queries=5000 --debug-info
测试结果
Benchmark Running for engine innodb Average number of seconds to run all queries: 0.234 seconds Minimum number of seconds to run all queries:0.234 seconds Maximum number of seconds to run all queries:0.234 seconds Number of clients running queries:100 Average number of queries per client50 Benchmark Running for engine innodb Average number of seconds to run all queries: 1.656 seconds Minimum number of seconds to run all queries:1.656 seconds Maximum number of seconds to run all queries:1.656 seconds Number of clients running queries:500 Average number of queries per clien:10 Benchmark Running for engine innodb Average number of seconds to run all queries: 2.187 seconds Minimum number of seconds to run all queries:2.187 seconds Maximum number of seconds to run all queries:2.187 seconds Number of clients running queries:1000 Average number of queries per client:5
并发100、500和1000个连接,执行5000次查询,单节点数据还可以正常应对,没有太大的问题。
当并发10000个连接执行10000次查询,数据库则会拒绝一部分请求,仅完成另一部分接收的请求。
2-2 PXC集群方案
单节点数据库的高可用测试:
测试案例
MySQL高性能高可用集群方案:

MySQL单表数据量不能超过2000万条。性能极速下降。
Mycat:国内主流数据切分中间件,阿里巴巴开源、Java编写、跨平台。
分片:利用Mycat切分后,一组集群就叫一个分片。
切分算法
按照日期の(年份/月份/天)进行切分切分
按照某一列的固定值(主键ID,对分片数2求余)切分
PXC–>HA–>Mycat
PXC数据读写是强一致性,但是牺牲了性能
2-3 Replication集群方案
协同过滤算法:
- 浏览记录会产生日志数据,将日志数据保存到数据库中。大数据算法根据日志数据分析当前用户行为,找出与之相同兴趣的用户,然后向当前用户推荐其他用户的喜好的商品、新闻。
单条日志数据没有太大意义,而大量日志数据才有使用价值。此时便可以使用Replication集群。

应用软件数据架构:

2-4 系统架构方案介绍
互联网大型应用架构分析:
互联网大型应用技术分析:
2-5 APP项目介绍
APP项目截图:

【登录界面】-【欢迎界面】-【人才招聘界面】
APP项目架构设计:

服务器端微服务之间的调用实现:

消息队列实现业务的解耦。
生产者不知道谁来接收这个消息,消费者也不知道是哪个生产者发来的消息。
消息队列的两个功能:
- 异步消息发送。
- 利用异步消息发送,进行业务功能的解耦。即把不是强依赖,不是实时返回的功能做成消息队列,这样不管是调用方还是被调用方的改动,对另一方的依赖就会减小甚至消除。
2-6 Docker虚拟机部署MySQL集群
查看正在运行的容器:
docker ps -a
2-7 APP项目演示
如果PXC集群中的主机挂掉的数目超过一半,则其它也不能提供服务
大学所储备知识做出的项目:
性能不足
故障抵御能力不足
2-8 PXC简介
Percona XtraDB Cluster
- PXC通过Galera将不同的MySQL实例连接起来,实现多主机群
- PXC基于Percona Server(性能较MySQL有显著提升)
- PXC是众多MySQL集群方案的一种
PXC方案与Replication方案对比:


2-9 PXC测试案例
docker pa -a
PXC方案:
# node1
CREATE DATABASE test;
USE test;
# node5
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(200) NOT NULL
);
# node4
INSERT INTO student(id, name)
VALUES (1, "Scott"), (2, "Jack");
Replication方案:
# master
CREATE DATABASE test;
USE test;
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(200) NOT NULL
);
INSERT INTO student
SET id = 1, name = "Scott";
# slave
INSERT INTO student
SET id = 2, name = "Jack";
PXC集群的节点之间是双向同步,没有主从之分。
Replication是单向同步,只能由主节点同步到从节点,从节点也可以写入数据,但不会同步数据到主节点。
PXC双向同步从演示的耗时看比Replication慢6倍,一个insert约80多毫秒,replication只要10多毫秒。
2-10 PXC集群工作原理
PXC集群工作原理:

数据的同步是由PXC完成的。
数据库事务,指的是逻辑上的一组操作,组成这组事务的操作,要么全部不成功,要么全部成功。
一个事务若有多个操作,则需要手动开启事务。且要手动提交事务,才能将操作持久化到数据库。
第3章 PXC数据强一致性
本章介绍PXC和Replication两种集群方案在数据同步上的区别。
3-1 PXC与Replication方案优劣介绍
PXC的数据强一致性:
- 同步复制,事务在所有集群节点要么同时提交,要么不提交
- Replication采用异步复制,无法保证数据的一致性
PXC和Replication方案优劣:
Replication写入速度快,但是不能保证数据的一致性
异步复制,分为master节点和slave节点。
master节点写入数据提交事务后,即返回结果给客户端,不管slave节点的数据是否一致。
PXC可以保证数据的一致性,但是写入速康慢
PXC的数据强一致性牺牲了速度为代价。
节点间同步复制数据,将事务执行结果返回给客户端。
PXC和Replication只实现了数据的同步,没有数据切分功能
PXC与Replication两种方案结合:
- 重要数据保存在PXC集群。
- 非重要数据(操作的记录)保存在Replication集群
当MySQL单表数据量超过2000万条时,性能会急剧下降,所以需要进行数据切分,即利用两个甚至多个集群来存储不同的数据
阿里巴巴开源中间件MyCat可以将两个集群做数据切分
3-2 PXC与Replication方案性能对比
PXC和Replication方案性能对比:
- 2016年春节,微信红包支付峰值15.8万次/秒,创下世界纪录
- 2017天猫双11,数据库峰值4200万次/秒,支付峰值25.6万次/秒
PXC集群注意:
PXC集群规模不能太大
PXC集群性能瓶颈不在于性能最好的节点,而在于性能最差的节点
尽量保证节点的配置一致
PXC和Replication组合方案:
PXC方案存储高价值数据,如:账户、订单、交易等等
Replication方案存储低价值数据,如:权限、通知、日志等等
用MyCat或JDBC-Sharding切分数据管理集群
按照主键ID值、年月日、某一字段等等进行切分

MyCat本身也需要高可用、需冗余设计。
搭建两个MyCat,再用Linux的虚拟IP技术虚拟一个IP供客户端程序访问,再由两个MyCat去争抢这个虚拟IP,如果哪个MyCat挂了,另一个MyCat就会接收到这个IP继续提供服务。
3-3 案例验证Replication方案的数据不一致性
案例介绍:
搭建一组两节点的Replication集群
使用MyCat实现Master和Slave节点的读写分离
设置防火墙网络规则,Master和Slave之间禁止访问,断开同步
注:
- MyCat默认端口8066
步骤:
在Master创建数据库、数据表,同时插入两条数据:
# master CREATE DATABASE test; USE test; CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(200) NOT NULL ); INSERT INTO student(id, name) VALUES (1, "Scott"), (2, "Jack");
MyCat配置文件介绍:
<!-- schema.xml --> <dataHost describe="配置数据库连接"> <heartbeat describe="心跳检测,实时检测MySQL节点是否有效。如果MySQL节点挂掉,则向冗余节点发送请求"> </heartbeat> <writeHost describe="写节点。Master"> <readHost describe="读节点。Slave"></readHost> </writeHost> </dataHost>
在MyCat查询数据表可以查看到两条数据:
# MyCat SELECT * FROM student;
关闭Master与Slave之间的同步设置:
同步操作是在Slave节点配置的。
# slave SHOW SLAVE STATUS; # Salve_IO_Running Slave_SQL_Running # YES YES STOP SLAVE; # Salve_IO_Running Slave_SQL_Running # NO NO
在MyCat插入一条数据:
# MyCat INSERT INTO student(id, name) VALUES(3, "admin");
在MyCat查询数据表可以查看到只有两条数据,无步骤4中插入的数据
# MyCat SELECT * FROM student;
3-4 案例验证PXC方案数据一致性
案例介绍:
搭建一组三节点的PXC集群
使用MyCat实现PXC节点的读写分离
设置防火墙网络规则,PXC之间禁止访问,断开同步
# 查看正在运行的容器
docker ps -a
# 进入node1数据库节点
docker exec -it node1 bash
iptables -A INPUT -p tcp --dport 4444 -j DROP
iptables -A OUTPUT -p tcp --dport 4444 -j DROP
iptables -A INPUT -p tcp --dport 4567 -j DROP
iptables -A OUTPUT -p tcp --dport 4567 -j DROP
iptables -A INPUT -p tcp --dport 4568 -j DROP
iptables -A OUTPUT -p tcp --dport 4568 -j DROP
# 进入node2数据库节点
...
# 进入node3数据库节点
...
第4章 PXC的多节点并发写入
本章介绍并演示PXC多节点并发写入和HaProxy高可用方案
4-1 PXC多节点并发写入
多节点并发写入:
- PXC集群没有主从节点之分,任何节点都是可读可写的
- Replication集群的主节点(写节点)宕机,从节点不能自动升级为主节点
- Replication集群必须为主节点设置冗余节点,而PXC不必这样
案例测试:
- 利用Java程序向三节点的PXC集群每个节点同时写入数据
- 程序执行结束之后,查看每个节点的数据是否同步正确
- 得出PXC多节点并发写入的结论
Java线程:
// MyThread.java
@Data
class MyThread extends Thread {
String url;
String username;
String pas sword;
String threadName;
override run() {
var con = DriverManager.getConnection(url, username, password);
var pst = con.prepareStatement("INSERT INTO student(name) VALUES (?)");
for(i : 1 ... 50) {
pst.setobject(1, threadName);
pst.execute;
Thread.sleep(5000);
}
con.close();
println("线程执行结束");
}
}
// Test.java
class Test {
def static void main(String[] args) {
var t1=new MyThread("jdbc: mysq1://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "123456", "C线程");
var t2=new MyThread("jdbc: mysql://127.0.0.1:3307/test?useUnicode=true&characterEncoding=UTF-8", "root", "123456", "C线程");
var t3=new MyThread("jdbc: mysql://127.0.0.1:3308/test?useUnicode=true&characterEncoding=UTF-8", "root", "123456", "C线程");
t1. start();
t2. start();
t3. start();
}
}
Java语法严谨、但啰嗦。
IBM开发了Xtend、SUN发开了Groovy、Kotlin等都扩展简化Java语法
4-2 PXC多节点并发写入案例
在已设置ID主键自增的情况下,为何PXC多节点并发写入的主键值不连续?
- 多个节点并发写入时同时生成了相同的ID主键值,此时去同步其他数据库节点会因为ID值被占用而驳回同步,需要重新生成一个ID主键值后再发起同步请求。如:A节点用了主键2,B节点也 用了主键2,这个时候同步就不能进行,然后B节点就用了主键3,A节点就用了主键4。
如何避免主键值不连续?
- 将主键生成任务从数据库本地移交给数据库集群中间件,如MyCat。从而避免冲突,不连续
验证PXC多节点并发写入数据库节点的数据是否同步成功:
# node1/node2/node3
use test;
SELECT COUNT(*) FROM student;
同时多节点并发(三线程)写入50条记录,最终有150条记录。
PXC集群多节点并发写入验证数据的强一致性。
4-3 Haproxy高可用方案介绍
Haproxy高可用方案:
PXC节点可读可写,应该采用负载均衡技术管理这些节点
程序设计中,数据源接口应该单一,对接负载均衡中间件
Haproxy是著名的负载均衡中间件,很适合负载均衡PXC集群
注:
- NGINX可实现Tomcat的负载均衡,是基于HTTP协议的。最近新版NGINX才支持TCP/IP协议,产品还不够成熟。
- 故使用Haproxy做数据库集群的负载均衡。

PXC集群最好是奇数数量(最少要三个节点),PXC集群可能出现脑裂的情况
4-4 Haproxy高可用案例1
# 查看正在运行的容器实例
docker ps -a
# haproxy.cfg
# 配置管理画面
listen admin_stats # 管理信息的名字。可随意
bind 0.0.0.0:8888 # 管理画面的IP与端口,任何IP地址均可访问。
mode http # 网络协议使用HTTP
stats uri /dbs # 访问URI
stats realm Global\ statistics
stats auth admin:admin # 管理画面的登录账号密码
# 负载均衡
listen proxy-mysql # 负载均衡的名字。可随意
bind 0.0.0.0:3306 # 负载均衡的入口IP与端口,任何IP地址均可访问。
mode tcp # 网络协议使用TCP。MySQL默认为TCP协议,不能为HTTP协议
balance roundrobin # 使用轮询的方式去分发请求(分发权重)
option tcplog # 记录日志
option mysql-check user haproxy # 定期发送心跳检测,‘haproxy’为Haproxy容器的用户名
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
option tcpka
4-5 Haproxy高可用案例2
# haproxy
CREATE DATABASE test;
USE test;
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(200) NOT NULL
);
INSERT INTO student(id, name)
VALUES (1, "Scott");
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:993-MySQL集群(PXC)入门
文章字数:4.4k
本文作者:神秘的小岛岛
发布时间:2019-07-05, 22:21:12
最后更新:2019-11-05, 17:23:09
原始链接:https://www.tuyrk.cn/imooc/993-MySQL-PXC/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。