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高性能高可用集群方案

MySQL单表数据量不能超过2000万条。性能极速下降。

Mycat:国内主流数据切分中间件,阿里巴巴开源、Java编写、跨平台。

分片:利用Mycat切分后,一组集群就叫一个分片。

切分算法

  • 按照日期の(年份/月份/天)进行切分切分

  • 按照某一列的固定值(主键ID,对分片数2求余)切分

PXC–>HA–>Mycat

PXC数据读写是强一致性,但是牺牲了性能

2-3 Replication集群方案

协同过滤算法:

  • 浏览记录会产生日志数据,将日志数据保存到数据库中。大数据算法根据日志数据分析当前用户行为,找出与之相同兴趣的用户,然后向当前用户推荐其他用户的喜好的商品、新闻。

单条日志数据没有太大意义,而大量日志数据才有使用价值。此时便可以使用Replication集群。

MySQL高性能高可用集群方案

应用软件数据架构:

应用软件数据架构

2-4 系统架构方案介绍

互联网大型应用架构分析:

系统架构方案

互联网大型应用技术分析:

系统架构方案

2-5 APP项目介绍

APP项目截图:

APP项目截图

【登录界面】-【欢迎界面】-【人才招聘界面】

APP项目架构设计:

APP项目架构设计

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

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

消息队列实现业务的解耦。

生产者不知道谁来接收这个消息,消费者也不知道是哪个生产者发来的消息。

消息队列的两个功能:

  1. 异步消息发送。
  2. 利用异步消息发送,进行业务功能的解耦。即把不是强依赖,不是实时返回的功能做成消息队列,这样不管是调用方还是被调用方的改动,对另一方的依赖就会减小甚至消除。

2-6 Docker虚拟机部署MySQL集群

查看正在运行的容器:

docker ps -a

2-7 APP项目演示

如果PXC集群中的主机挂掉的数目超过一半,则其它也不能提供服务

大学所储备知识做出的项目:

  1. 性能不足

  2. 故障抵御能力不足

2-8 PXC简介

Percona XtraDB Cluster

  • PXC通过Galera将不同的MySQL实例连接起来,实现多主机群
  • PXC基于Percona Server(性能较MySQL有显著提升)
  • PXC是众多MySQL集群方案的一种

PXC方案与Replication方案对比:

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集群工作原理

数据的同步是由PXC完成的。

数据库事务,指的是逻辑上的一组操作,组成这组事务的操作,要么全部不成功,要么全部成功。

一个事务若有多个操作,则需要手动开启事务。且要手动提交事务,才能将操作持久化到数据库。

第3章 PXC数据强一致性

本章介绍PXC和Replication两种集群方案在数据同步上的区别。

3-1 PXC与Replication方案优劣介绍

PXC的数据强一致性:

  • 同步复制,事务在所有集群节点要么同时提交,要么不提交
  • Replication采用异步复制,无法保证数据的一致性

PXC和Replication方案优劣:

  • Replication写入速度快,但是不能保证数据的一致性

    异步复制,分为master节点和slave节点。

    master节点写入数据提交事务后,即返回结果给客户端,不管slave节点的数据是否一致。

  • PXC可以保证数据的一致性,但是写入速康慢

    PXC的数据强一致性牺牲了速度为代价。

    节点间同步复制数据,将事务执行结果返回给客户端。

  • PXC和Replication只实现了数据的同步,没有数据切分功能

PXC与Replication两种方案结合:

  1. 重要数据保存在PXC集群。
  2. 非重要数据(操作的记录)保存在Replication集群

当MySQL单表数据量超过2000万条时,性能会急剧下降,所以需要进行数据切分,即利用两个甚至多个集群来存储不同的数据

阿里巴巴开源中间件MyCat可以将两个集群做数据切分

3-2 PXC与Replication方案性能对比

PXC和Replication方案性能对比:

  • 2016年春节,微信红包支付峰值15.8万次/秒,创下世界纪录
  • 2017天猫双11,数据库峰值4200万次/秒,支付峰值25.6万次/秒

PXC集群注意:

  1. PXC集群规模不能太大

  2. PXC集群性能瓶颈不在于性能最好的节点,而在于性能最差的节点

    尽量保证节点的配置一致

PXC和Replication组合方案:

  • PXC方案存储高价值数据,如:账户、订单、交易等等

  • Replication方案存储低价值数据,如:权限、通知、日志等等

  • 用MyCat或JDBC-Sharding切分数据管理集群

    按照主键ID值、年月日、某一字段等等进行切分

PXC集群工作原理

MyCat本身也需要高可用、需冗余设计。

搭建两个MyCat,再用Linux的虚拟IP技术虚拟一个IP供客户端程序访问,再由两个MyCat去争抢这个虚拟IP,如果哪个MyCat挂了,另一个MyCat就会接收到这个IP继续提供服务。

3-3 案例验证Replication方案的数据不一致性

案例介绍:

  • 搭建一组两节点的Replication集群

  • 使用MyCat实现Master和Slave节点的读写分离

  • 设置防火墙网络规则,Master和Slave之间禁止访问,断开同步

    注:

    • MyCat默认端口8066
    Replication方案案例介绍

步骤:

  1. 在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>
  2. 在MyCat查询数据表可以查看到两条数据:

    # MyCat
    SELECT * FROM student;
  3. 关闭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
  4. 在MyCat插入一条数据:

    # MyCat
    INSERT INTO student(id, name)
    VALUES(3, "admin");
  5. 在MyCat查询数据表可以查看到只有两条数据,无步骤4中插入的数据

    # MyCat
    SELECT * FROM student;

3-4 案例验证PXC方案数据一致性

案例介绍:

  • 搭建一组三节点的PXC集群

  • 使用MyCat实现PXC节点的读写分离

  • 设置防火墙网络规则,PXC之间禁止访问,断开同步

    Replication方案案例介绍
# 查看正在运行的容器
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做数据库集群的负载均衡。
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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏