精华内容
下载资源
问答
  • MySQL数据库应用与实践教程(21世纪高等学校计算机教育实用规划教材)
    千次阅读
    2021-01-19 04:34:02

    第1章数据库技术基础

    1.1数据库系统概述

    1.1.1数据库的概念

    1.1.2数据管理技术的产生和发展

    1.1.3数据库系统的特点

    1.2数据模型

    1.2.1数据处理的三个世界

    1.2.2实体间的联系

    1.2.3数据模型的分类

    1.2.4关系模型的规范化

    1.2.5关系运算

    1.3数据库系统结构

    1.3.1数据库系统的三级模式结构

    1.3.2数据库系统的二级映像

    1.4数据库设计基础

    1.4.1设计原则

    1.4.2设计步骤

    1.5需求分析

    1.5.1需求分析的任务

    1.5.2需求分析的方法

    1.5.3数据字典

    1.6数据库实施

    1.6.1数据的载入和应用程序的调试

    1.6.2数据库的试运行

    课堂实践:教务管理系统的数据库设计

    1.7本章小结

    1.8思考与实践

    第2章MySQL概述

    2.1MySQL的功能及特点

    2.1.1MySQL的版本

    2.1.2MySQL的特性

    2.2MySQL的安装和配置

    2.2.1安装MySQL

    2.2.2配置MySQL服务器

    2.2.3连接服务器

    2.3MySQL管理工具

    2.3.1MySQLWorkbench管理工具

    2.3.2MySQLAdministrator管理器工具

    2.3.3MySQLQueryBrowser数据查询工具

    2.3.4MySQLMigrationToolkit数据库迁移工具

    课堂实践:MySQL的简单应用

    2.4本章小结

    2.5思考与实践

    第3章数据库的创建与管理

    3.1MySQL数据库简介

    3.1.1数据库的构成

    3.1.2数据库文件

    3.1.3数据库对象

    3.1.4数据库对象的标识符

    3.2管理数据库

    3.2.1创建数据库

    3.2.2查看已有的数据库

    3.2.3打开数据库

    3.2.4修改数据库

    3.2.5删除数据库

    3.2.6使用MySQLWorkbench管理数据库

    课堂实践:创建和管理教务管理系统数据库

    3.3本章小结

    3.4思考与实践

    第4章表的创建与管理

    4.1表概述

    4.1.1表的概念

    4.1.2表的类型

    4.1.3表的数据类型

    4.1.4表的设计

    4.2创建和管理表

    4.2.1创建表

    4.2.2查看表的信息

    4.2.3修改表结构

    4.2.4删除表

    4.3表数据操作

    4.3.1添加数据

    4.3.2更新数据

    4.3.3删除数据

    课堂实践1:创建教务管理系统数据表

    4.4创建和管理索引

    4.4.1索引概述

    4.4.2创建索引

    4.4.3查看索引

    4.4.4删除索引

    4.5数据完整性

    4.5.1数据完整性的分类

    4.5.2数据完整性的实现

    4.5.3使用约束

    课堂实践2:教务管理系统中表的约束管理

    4.6本章小结

    4.7思考与实践

    第5章数据查询与视图管理

    5.1简单查询

    5.1.1SELECT语句结构

    5.1.2SELECT子语句

    5.1.3WHERE子语句

    5.1.4ORDERBY子语句

    5.1.5GROUPBY子语句

    5.1.6HAVING子语句

    课堂实践1:简单查询的应用

    5.2连接查询

    5.2.1内连接

    5.2.2外连接

    5.2.3交叉连接

    5.2.4自连接

    5.2.5多表连接

    课堂实践2:连接查询的应用

    5.3子查询

    5.3.1IN子查询

    5.3.2比较运算符子查询

    5.3.3ANY或ALL子查询

    5.3.4EXISTS子查询

    课堂实践3:子查询的应用

    5.4联合查询

    5.4.1UNION操作符

    5.4.2UNION操作符和JOIN操作符的区别与联系

    5.5视图管理

    5.5.1视图概述

    5.5.2创建视图

    5.5.3更新视图

    5.5.4删除视图

    课堂实践4:教务管理系统中视图管理的应用

    5.6本章小结

    5.7思考与实践

    第6章SQL语言基础

    6.1SQL基础

    6.1.1标识符

    6.1.2注释

    6.1.3数据类型

    6.1.4常量与变量

    6.1.5操作符

    6.1.6表达式

    6.2函数

    6.2.1系统函数

    6.2.2存储函数

    6.3流程控制语句

    6.3.1顺序控制语句

    6.3.2分支控制语句

    6.3.3循环控制语句

    6.4游标

    6.4.1游标的概念

    6.4.2游标的使用

    课堂实践:游标在教务管理系统中的应用

    6.5本章小结

    6.6思考与实践

    第7章存储过程和触发器

    7.1存储过程

    7.1.1存储过程概述

    7.1.2创建存储过程

    7.1.3管理存储过程

    7.1.4存储过程中的异常处理

    课堂实践1:创建查询选课记录的存储过程

    7.2触发器

    7.2.1触发器概述

    7.2.2创建触发器

    7.2.3管理触发器

    课堂实践2:创建一个插入事件触发器

    7.3事件

    7.3.1创建事件

    7.3.2管理事件

    7.4本章小结

    7.5思考与实践

    第8章数据库安全管理

    8.1MySQL的安全性

    8.1.1MySQL安全性概述

    8.1.2MySQL安全管理等级

    8.2用户管理

    8.2.1创建用户

    8.2.2修改用户名和密码

    8.2.3删除用户

    8.3权限管理

    8.3.1权限概述

    8.3.2授予权限

    8.3.3收回权限

    8.3.4查看权限

    课堂实践1:创建数据管理员用户

    8.4日志文件

    8.4.1二进制日志

    8.4.2错误日志

    8.4.3通用查询日志

    8.4.4慢查询日志

    8.5数据备份与恢复

    8.5.1数据备份

    8.5.2数据恢复

    课堂实践2:备份教务管理系统数据库

    8.6本章小结

    8.7思考与实践

    第9章事务与锁

    9.1事务

    9.1.1事务概述

    9.1.2事务操作

    9.2锁

    9.2.1并发问题

    9.2.2事务的隔离级别

    9.2.3MySQL中的锁定

    课堂实践:定义一个学生选课的事务

    9.3本章小结

    9.4思考与实践

    第10章数据库应用开发实例

    10.1系统分析

    10.1.1开发背景

    10.1.2需求分析

    10.2系统设计

    10.2.1系统功能设计

    10.2.2数据库设计

    10.2.3开发环境选择

    10.3系统实现

    10.3.1数据库访问设计

    10.3.2登录模块设计

    10.3.3图书借阅管理模块设计

    10.3.4系统主模块设计

    10.4本章小结

    10.5思考与实践

    参考文献

    更多相关内容
  • 另外,本书介绍了 Actor 模型的一个实现框架 Akka 以及它的工具,而后讨论了在充分利用 actor 架构的基础上使用 Akka 框架来设计软件系统的方法,以及使用它来开发并发性和分布式应用程序的方怯。本书还介绍了领域 ...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • Java应用性能调优实践

    2021-01-27 11:24:36
    Java应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在”糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的...
  • JAVA并发编程实践

    2017-11-02 10:21:02
    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 本书强调实际的解决方案,读者可以使用本书的方法解决特定的软件开发问题,获得对构造分布式及并发应用和中间件最佳实践的基本理解。书中含有用多种语言(c、c++和java)编写的大量例子和已知使用,适于专业软件...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论体系,并提供...

    本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论体系,并提供有例可依的实战。

    该系列专题分享由阿里巴巴 PTS 团队出品,欢迎在文末处加入性能压测交流群,参与该系列的线上分享。

    第一期:《压测环境的设计和搭建》,点击这里
    第二期:《性能压测工具选型对比》,点击这里
    第三期:《阿里巴巴在开源压测工具 JMeter 上的实践和优化》,点击这里

    1996年, LR 4.0 版本发布,将性能测试专业理论工具化、产品化,这直接影响之后20多年性能测试领域的理论基础。但是 LR 作为一款商业化产品,因其价格昂贵,推广和传播受限。1998年底,JMeter 开源 ,并发布1.0版本,性能测试领域逐渐蓬勃发展起来。

    Loadrunner、Jmeter 引领了性能测试领域的一个时代,功能强大,脚本化,扩展性强,将性能测试标准化、专业化,后续几乎所有性能测试工具或者商业化产品都马首是瞻。本文就性能测试做了一个纯YY的“实践”(真的只是纯理论分析!),有一些不一样的思路跟大家一起探讨下,望轻踩。

    前言:并发、RPS 和 RT

    接触性能测试的同学要理解的概念有非常多,在正文之前先跟大家就几个核心指标统一下口径:

    • 并发用户、并发、VU:一般用来表示虚拟用户(Virutal User,简称VU),对应到 Jmeter 的线程组线程,对应到 Loadrunner 的并发 Concurrency ,在本文都是一个意思。
    • 每秒发送请求数、RPS:指客户端每秒发出的请求数,有些地方也叫做QPS,本文不单独讨论“事务”所以可以近似对应到Loadrunner的TPS(Transaction Per Second, 每秒事务数),本文统一叫做 RPS。
    • 响应时间、RT:对,没错,这个就是你理解的那个意思,从发起请求到完全接收到应答的时间消耗。

    根据“Little定律”,在平衡状态下,我们可以等价认为并发、RPS 和 RT 之间的关系可以概括为:并发数 = RPS * 响应时间

    偷懒的话,可以把它当成性能测试领域的“乘法口诀”,直接背下来吧,他会帮助你快速理解很多问题;如果想深入了解具体的原理可以去拜读下 Eric Man Wong 在2004年发表了名为《Method for Estimating the Number of Concurrent Users》的文章,这两者是等价的。

    100工人的问题

    如果你还不了解“RT对于并发模式的性能测试的影响”或者还存在一些疑惑,强烈建议读完本节;如果不想理解细节,可以选择直接跳到本节末尾看结论;如果已经充分了解了,可以直接跳过本节。

    先从一个大家相对熟知的例子开始,假设有这么一条生产箱子的流水线,安排了100个工人,条件如下:

    • 100个工人的身体素质一模一样, 因此可以近似的认为工作效率只与工作的复杂度有关;
    • 这个流水线有3份工作(如下图所示的节点A、节点B和节点C),所有工人都可以胜任;
    • 节点A工人包装箱子平均耗时 RT1=0.5s(秒),节点B工人包装箱子平均耗时 RT2=3s(秒),节点C工人包装箱子平均耗时 RT3=1.5s(秒);
    • 同一个箱子必须按照 节点A、节点B、节点C 的顺序被包装。

    问:节点A、节点B、节点C分别安排多少工人 X、Y、Z 可以让这个流水线达到最大的产能,并且求得流水线的最大产能 T/s?(如下图)

    在平衡状态下,我们从宏观的视角来分析下,整条流水线包装完一个箱子的 总耗时=(0.5+3+1.5)s,那么我们可以很轻易地得到流水线的产能:

    流水线的产能 T = 100 / (0.5 + 3 + 1.5) = 20 /s

    可能很多人有疑问,“什么是平衡状态?”,这个可以这么理解,为了保证所有工人都可以达到最大的工作效率,主管会非常睿智的调配各个节点之间的工人分配直到“所有工人都有事可做,也不会存在工人忙不过来”,那么从微观的角度去看,如果节点之间的产能不一致,有些节点就会出现箱子等待被处理,有些节点的工人等待箱子的情况。所以,我们可以得到这样的结论 在平衡状态下,所有节点产能肯定是一致的:

    T(A) = T(B) = T(C) = T = 20 /s

    从而,根据Little定律,我们可以推算出来,各个节点的人员(vu)分配了:

    X = T(A) RT1 = 20 0.5 = 10

    Y = T(B) RT2 = 20 3 = 60

    Z = T(C) RT3 = 20 1.5 = 30

    下面这张 Jmeter 的图,相信大家可以轻易地跟前面的自理找到对照关系,我这里不再赘述了:

    产能 = RPS

    工人 = 并发

    完成平均时间RT = 响应时间、RT(rt)

    综上所述,我们可以得出两个结论:

    • 在平衡状态下,所有节点的 RPS 必然一样。
    • 在平衡状态下,任意节点的 RT 都会影响整体 RPS ,进而会影响并发在节点之间的分配关系。

    为了描述方便,我们将节点A、节点B和节点C组成的“100人的流水线”叫做“串联链路”。

    节点A的RPS = 节点B的RPS = ... = 串联链路RPS

    串联链路RPS = 并发数 / (RT1 + RT2 + ... )

    节点N的并发数 = RTn 节点N的RPS = RTn 串联链路RPS**

    你确定考虑全面了吗?

    控制并发是目前最为普遍被使用到的压测模式,打个比方,有一个网站大概会在 下周一10:00 预估有 10w人同时访问,那么为了保障网站的问题,很自然的想到使用10w个并发来压测下整个网站的接口,对应到 JMeter 即为设置线程组的线程数,对应到 LoadRunner 设置 VU(Visual User)数,很容易理解。

    另外,我从阿里云PTS官方拿到近6个月的数据显示,选择并发模式与RPS模式分别占比 89%与11%,并发模式占据绝对的规模优势。

    但是,如果你已经充分了解了“RT对于固定并发模式的性能测试的影响”,这里我不禁要问一句(邪恶脸)“Emm... 你有想过类似Jmeter、LR等并发模式压测工具拿到的结果是真实的吗?准确吗?”。

    下面我要讲一个“恐怖故事”,先来看一张相对抽象的环境结构图,

    在平衡状态下,已知总并发VU,以及 接口1、接口2、接口3 的响应时间分别为RT1、RT2、RT3,通过前面的理论基础,我们可以轻易地写出下面的算式:

    T = RPS1 = RPS2 = RPS3 = VU / (RT1 + RT2 + RT3)

    接口1的并发 X = T * RT1

    接口2的并发 Y = T * RT2

    接口3的并发 Z = T * RT3

    分析下接口的RT的构成,大致概括为下面5部分:

    • 压测工具耗时:这个很好理解,压测工具在发送请求之前会做参数的拼装/替换、下载应答报文、解析应答报文(断言)等都是需要耗费时间的,一般情况下压测工具的时间消耗会非常低,可以忽略。但是对于报文较大或者断言较复杂的情况下,压测工具耗时过大也会出现瓶颈;
    • 网络时间:一般来说在 VPC/IDC 内部的网络消耗非常低,所以我们可以近似地认为网络时间消耗都来源于运营商网络。同样,对于接口的请求和应答报文比较大的情况下,不论是运营商网络还是内网网络的带宽都更容易出现瓶颈;
    • 安全、鉴权、负载均衡模块耗时:这一块的时间消耗一般来说相对较低,受限于连接数、带宽等,可能会出现由于配置问题,比如连接数上限超过预期,则会造成等待建连超时;
    • 应用业务处理耗时:一般情况下,应用业务处理耗时占据 RT 的百分比最高,也是一般我们可以通过优化提高吞吐量的重点区域。可能包含 应用之间 RPC 服务调用、数据库SQL执行、读写缓存、读写消息等。
    • 第三方依赖耗时:这里就复杂了,各种情况都有,你可以完全信赖或者完全不信赖它的稳定性。一般它的RT评估有相关 SLA 的要求,一般压测实施的时候根据 SLA 约定的 RT 要求,mock 掉第三方接口依赖,正式压测的时候再一起联压。

    更进一步,可以得出这样的结论,在并发模式下,影响压测结果以及应用服务器的吞吐量的因素有:

    • 压测工具的性能
    • 网络状态
    • 接入层配置和性能
    • 应用服务性能
    • 第三方依赖的 SLA
    • ...

    因此,出现了一种混沌状态,可能由于压测工具所在宿主机负载变化、网络环境变化、应用服务性能优化或者劣化等因素的干扰,拿着相同的脚本进行了10次,每次得到的接口 RPS 都不一样,服务器端的压力也不一样,但是从表象来看,一切正常,但这样的性能测试并不能真实反映任何问题,也并不能指导运维做出正确容量规划的决策。因为影响 RT 的因素实在是太多太多了,任何客观因素的影响都直接影响测试结果的准确性。

    并发模式 = 性能瓶颈“定性”分析

    在这里,我更愿意定义并发模式性能测试为一种性能瓶颈分析的定性工具,在尽量相同的条件下经过反复测试,通过分析各个接口的RT构成找到“相对的”性能瓶颈。但是大家有没有想过,将所有接口优化到极限的性能之后,可以拍胸脯说“我们的系统已经可以抗住 XXX 并发用户量的访问了”吗?答案是否定的,原因有三:

    • 不真实,主要体现在 ① 环境不真实;② 压测(脚本)模型不真实;
    • 主体错误,并发只是一个诱因和触发器,影响性能的主体是服务端的RPS;
    • 并发测试的效果真实性依赖于RT,而RT的构成异常复杂。

    对了,前面的分析漏了一个影响并发性能测试结果的非常重要的因素:思考时间(用户在操作的时候,步骤之间用户会停顿一段时间)。思考时间的引入会将并发的建模的复杂度带到几乎不能实现的地步,因为它不像其他相对客观的因素,它是非常主观的。假如用户停留的时间很长,可能是因为感兴趣多看一会儿,或者页面上有100个表单需要填写,或者看不懂文案是啥意思正在 Google,或者...去冲咖啡了。

    有人可能会追问“思考时间究竟要设置多少合适呢?”,我可以非常明确的说“不知道!”,如果你有时间,可以通过大数据 BI 分析统计学意义上的每个接口之间用户停顿的时间,然后将它设置上,假设每个接口的思考时间总和为 S=(S1+S2+S3),那么我们可以更新下公式:

    T = RPS1 = RPS2 = RPS3 = VU / (RT1 + RT2 + RT3 + S)
    接口1的并发 X = T * RT1
    接口2的并发 Y = T * RT2
    接口3的并发 Z = T * RT3

    可以看到,增加了思考时间之后,整体的吞吐量、所有接口的并发都下降了,因为有部分用户在“思考”。增加“思考时间”有助于提高并发模式下性能测试的准确性,除此之外,还有一些提高并发模式的准确性的手段:

    • 压测工具地域定制、运营商定制
    • 增加条件跳转,模拟用户重试行为
    • 增加集合点
    • ...

    这些手段你可以非常轻易的在市面上的开源或者云测平台上找到(有些功能可能需要支付一些费用),在这里不再一一赘述,归根到底,可以总结为“优化接口 RT 使其接近真实值以提高并发模式的准确性”。

    但并发模式始终都受制于“不稳定的”、“难模拟的”、“难预测的”接口 RT ,通过并发模式拿到指导运维进行容量规划的结果,是要付出的代价会非常大的,甚至也不能达到想要的结果。

    在真实情况下,接口1、接口2、接口3的 RPS 是不一样的,抛开接口异常断言失败不继续调用后面的接口的情况,接口 RPS 关系是呈倒金字塔分布,比方说,浏览商品(接口)了之后不一定会去下单购买(接口),因为大家一般会反复浏览不同的商品选择最中意的再下单,所以浏览商品(接口)的 RPS 必然会比下单购买(接口)的 RPS 要高,用户有放弃继续“走下一步”的权利,但是这种情况你如果尝试对并发的分布来建模,是一个非常庞大且复杂工程问题,因为影响的因素实在太多了。

    如下图所示,并发压测模式下,所有接口的 RPS 都是一样的,与“实际情况”(图右部分)大相径庭。

    受传统性能测试思路的影响,目前有接近90%的企业用户(数据来源于 阿里云PTS ) 将并发模式性能测试的结果作为稳定性、容量验收的依据,所以说这是一件非常恐怖的事情。

    容量规划:从定性分析到定量分析

    在这里我非常乐意跟大家分享一份来源于 QA Intelligence《State of Testing™ Report 2019》关于2016~2019年软件开发模式的调查数据:

    数据显示,DevOps 第一次超过 Waterfall(瀑布模式)成为第二位被越来越多的企业接受的开发模式,而瀑布模式等传统开发模式有逐渐退出历史舞台的趋势。敏捷开发和 DevOps 大行其道,开发、测试和运维等部门、角色之间需要有一种高效的沟通和协作手段。

    想到了一句非常“肤浅”但有点道理的话,“性能问题优化之后最终都可以转化为容量问题”,简单地可以理解为测试同学发现了性能瓶颈,然后开发同学经过了优化,运维同学根据优化之后的系统的能力进行扩容或者缩容。瞧!这不就是开发、测试和运维完美协作的一个典型实践嘛?!

    这个过程,我们叫做“容量规划”的实施过程,重点不是容量而是规划,如果成本不是任何问题,我们可以堆砌无限大的资源,用户体验会极其好,但是会造成极大的资源浪费。所以这里说的“容量规划”是在保证用户体验不受影响(稳定性)的前提下,使有限的资源的利用率最大化(成本)的方法论。打个比方,运维准备了100台机器,有5个应用,那么“怎么分配这100台机器给5个应用可以使系统既可以正常对外服务又可以使系统达到最大的吞吐量能力”就是容量规划要解决的问题。

    容量规划的核心有一张已经用的“泛黄”的图,大家应该一看就明白,有两个核心指标:

    • 预估的业务量级:对于单应用而言就是这个应用的RPS吞吐量峰值,这个数据一般可以来源于流量模型和历史数据沉淀;
    • 单台机器的能力值:在某一个流量模型下,单台机器系统水位达到安全水位时的RPS峰值。

    上面提到一个概念叫做“流量模型”,这个流量模型你可以近似的认为就是前面图中“实际情况”的 RPS 倒金字塔,他有两个要素:

    • 接口范围
    • 每个接口的RPS

    容量规划的目的性非常强,也就是在特定“流量模型”下,给出资源分配的最优解。在压测实施的时候,压测的主体是接口的 RPS,按照流量模型进行试压。(如果你还在想为什么主体是 RPS 而不是并发的话,请在仔细阅读前面那章)

    RPS 模式压测在容量规划的典型应用,是并发模式无法实现的。正式因为此,我们才能将性能测试从“定性分析”转化为“定量分析”。

    阿里在2013年构建了一整套基于线上全链路压测的容量规划体系,逐渐替代之前单应用、单接口这种低效的容量评估手段,过程也是非常曲折的。容量规划是一个非常大的课题,本文的重点不是“容量规划”,如果你对“智能化全链路容量规划”感兴趣,请在文末留言或加入我们的性能压测交流钉群。

    结尾:无意引战

    并发模式与 RPS 模式压测各有各自的使用场景,并发模式更加适用于对于系统定性的分析,比如帮助定位性能瓶颈,单接口的性能基线沉淀(对比历史性能优化or劣化);而 RPS 模式在对系统做定量的分析有杰出表现,比如容量规划、全链路性能基线沉淀,当然也可以帮助定位性能瓶颈。并发模式的难点在于 RT 的准确性拟真, RPS 模式的难点在于模型的准确性评估和预测,从实现难度上来说,前者相对于后者来说难度更大一些、掌控度更低一些。

    当然,我无意引战,并发模式、RPS 模式、你想要的和你还没有想到未来想要的都可以在 阿里云PTS 上找到。

    原文链接
    本文为云栖社区原创内容,未经允许不得转载。

    展开全文
  • Channel选择器工厂轮询算法及注册底层实现 72_Netty线程模型深度解读架构设计原则 73_Netty底层架构系统总结与应用实践 74_Netty对于异步读写操作的架构思想观察者模式的重要应用 75_适配器模式与模板方法模式...
  • 《Java并发编程设计原则与模式》 - Doug Lea 看作者就知道含金量,毋庸置疑很难懂 《多处理器编程的艺术-修订版》 - Nir Shavit - 大学教材,不好懂,但是教案,代码非常全面,进阶JUC的读物。 《Java并发编程从入门...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 高可用模式:允许设置多个host地址,每次会从可用的地址中随机选择一个进行连接:jdbc:clickhouse://:,:[,…][/] 内置工具 clickhouse-local 可以独立运行大部分SQL查询,不需要依赖任何ClickHouse的服务端程序,它...

    福利置顶(温馨提示):电子版可在微信读书app阅读。

    第一章 ClickHouse的前世今生

    传统BI的局限性。

    数据仓库
    为了解决数据孤岛的问题,即通过引入一个专门用于分析类场景的数据库,将分散的数据统一汇聚到一处。

    数据仓库的衍生概念
    对数据进行分层,通过层层递进形成数据集市,从而减少最终查询的数据体量;提出数据立方体的概念,通过对数据进行预先处理,以空间换时间,提升查询性能。

    OLAP,联机分析,多维分析,基本操作:下钻、上卷、切片、切块、旋转。架构大致可分成三类:

    1. ROLAP
      Relational OLAP,关系型OLAP
    2. MOLAP
      Multidimensional OLAP,多维型OLAP;维度预处理可能会导致数据的膨胀
    3. HOLAP
      Hybrid OLAP,混合架构的OLAP

    clickhouse-benchmark-test

    按顺序存储的数据会拥有更高的查询性能。因为读取顺序文件会用更少的磁盘寻道和旋转延迟时间(这里主要指机械磁盘),同时顺序读取也能利用操作系统层面文件缓存的预读功能,所以数据库的查询性能与数据在物理磁盘上的存储顺序息息相关。

    ClickHouse适用的场景
    BI商业智能、广告流量、Web、App流量、电信、金融、电子商务、信息安全、网络游戏、物联网等众多其他领域。

    不适用的场景

    1. 不支持事务
    2. 不擅长根据主键按行粒度进行查询(支持),故不应该把CK当作K-V数据库使用
    3. 不擅长按行删除数据(支持)

    第二章 ClickHouse架构概述

    使用多主对等网络结构,
    核心特性:

    1. 完备的DBMS功能
    2. 列式存储与数据压缩
    3. 向量化执行引擎
    4. 关系模型与SQL查询
    5. 多样化的表引擎
    6. 多线程与分布式
    7. 多主架构
    8. 在线查询
    9. 数据分片与分布式查询

    架构设计

    第三章 安装与部署

    需要验证当前服务器的CPU是否支持SSE 4.2指令集,因为向量化执行需要用到这项特性。

    配置文件

    1. /etc/security/limits.d/clickhouse.conf:文件句柄数量配置
    2. /etc/cron.d/clickhouse-server:cron:定时任务配置,用于恢复因异常原因中断的ClickHouse服务进程

    可执行文件
    主要是在/usr/bin路径下:

    1. clickhouse:主程序的可执行文件
    2. clickhouse-client:一个指向ClickHouse可执行文件的软链接,供客户端连接使用
    3. clickhouse-server:一个指向ClickHouse可执行文件的软链接,供服务端启动使用
    4. clickhouse-compressor:内置提供的压缩工具,可用于数据的正压反解

    客户端的访问接口

    1. TCP
      基于TCP协议,拥有更好的性能,默认端口为9000,主要用于集群间的内部通信及CLI客户端;
    2. HTTP
      基于HTTP协议,拥有更好的兼容性,可以通过REST服务的形式被广泛用于JAVA、Python等编程语言的客户端,其默认端口为8123。
    3. 封装接口
      包括CLI和JDBC,简单易用,基于TCP底层接口的封装。

    CLI
    有两种执行模式:

    1. 交互式执行
      广泛用于调试、运维、开发和测试等场景,通过交互式执行的SQL语句,相关查询结果会统一被记录到~/.clickhouse-client-history文件,可以作为审计之用。
    2. 非交互式执行
      用于批处理场景,如对数据的导入和导出等操作,需要追加--query参数指定SQL语句。--multiquery参数执行多次查询,支持一次运行多条分号间隔的SQL查询语句,多条SQL的查询结果集会依次按顺序返回。

    JDBC

    <dependency>
        <groupId>ru.yandex.clickhouse</groupId>
        <artifactId>clickhouse-jdbc</artifactId>
        <version>0.2.4</version>
    </dependency>
    

    JDBC底层基于HTTP接口通信,该驱动有两种形式:

    1. 常规模式:jdbc:clickhouse://<host>:<port>[/<database>]
    2. 高可用模式:允许设置多个host地址,每次会从可用的地址中随机选择一个进行连接:jdbc:clickhouse://<first-host>:<first-port>,<second-host>:<second-port>[,…][/<database>]

    内置工具

    1. clickhouse-local
      可以独立运行大部分SQL查询,不需要依赖任何ClickHouse的服务端程序,它可以理解成是ClickHouse服务的单机版微内核,是一个轻量级的应用程序。clickhouse-local只能够使用File表引擎,它的数据与同机运行的ClickHouse服务也是完全隔离的,相互之间并不能访问。非交互式运行的,每次执行都需要指定数据来源。
      核心参数:
      -S / --structure:表结构
      -N / --table:表名称,默认值是table
      -if / --input-format:输入数据的格式,默认值是TSV
      -f / --file:输入数据的地址,默认值是stdin标准输入
      -q / --query:待执行SQL语句,多条语句分号间隔
    2. clickhouse-benchmark
      基准测试的小工具,会给出QPS、RPS(Request Per Second)、各百分位的查询执行时间,可以指定多条SQL进行测试,此时需要将SQL语句定义在文件中。
      核心参数:
      -i / --iterations:SQL查询执行的次数,默认值是0
      -c / --concurrency:同时执行查询的并发数,默认值是1
      -r / --randomize:在执行多条SQL语句时,按照随机顺序执行
      -h / --host:服务端地址,默认值是localhost。支持对比测试,此时需要声明两个服务端的地址,在对比测试中,会通过抽样的方式比较两组查询指标的差距
      --confidence:设置对比测试中置信区间的范围,默认值是5(99.5%),取值有0(80%)、1(90%)、2(95%)、3(98%)、4(99%)和5(99.5%)。

    第四章 数据定义

    数据类型

    包括基础类型、复合类型和特殊类型

    基础类型

    基础类型只有数值、字符串和时间三种类型,没有Boolean类型,可使用整型的0或1替代。

    数值类型

    数值类型分为整数、浮点数和定点数三类

    字符串

    可以细分为String、FixedString和UUID三类。

    1. String长度不限,不限定字符集,但建议遵循使用统一的编码
    2. FixedString,FixedString(N),使用null字节填充末尾字符
    3. UUID,32位,它的格式为8-4-4-4-12,空值默认用0填充,即0…0-…00

    时间

    时间类型分为DateTime、DateTime64和Date三类。CK目前没有时间戳类型。时间类型最高的精度是秒,即若需要处理毫秒、微秒等大于秒分辨率的时间,则只能借助UInt类型实现。

    1. DateTimeDateTime类型包含时、分、秒信息,精确到秒,支持使用字符串形式写入
    2. DateTime64DateTime64可以记录亚秒,在DateTime之上增加精度的设置
    3. DateDate类型不包含具体的时间信息,只精确到天,同样支持字符串形式写入

    复合类型

    数组、元组、枚举和嵌套

    1. Array
      有两种定义形式
      以最小存储代价为原则,即使用最小可表达的数据类型

    2. Tuple
      元组类型由1~n个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间不要求兼容。元组同样支持类型推断,其推断依据仍然以最小存储代价为原则

    3. Enum
      包括Enum8和Enum16两种枚举类型,
      Key和Value是不允许重复的,要保证唯一性。其次,Key和Value的值都不能为Null,但Key允许是空字符串。

    4. Nested
      一种嵌套表结构。一张数据表,可以定义任意多个嵌套类型字段,但每个字段的嵌套层级只支持一级,即嵌套表内不能继续使用嵌套类型。嵌套类型本质是一种多维数组的结构。嵌套表中的每个字段都是一个数组,并且行与行之间数组的长度无须对齐。在访问嵌套类型的数据时需要使用点符号。

    特殊类型

    1. Nullable
      并不能算是一种独立的数据类型。只能和基础类型搭配使用,也不能作为索引字段。应该慎用Nullable类型,包括Nullable的数据表,不然会使查询和写入性能变慢。因为在正常情况下,每个列字段的数据会被存储在对应的[Column].bin文件中。如果一个列字段被Nullable类型修饰后,会额外生成一个[Column].null.bin文件专门保存它的Null值。即在读取和写入数据时,需要一倍的额外文件操作。

    2. Domain
      域名类型,分为IPv4和IPv6两类,本质上是对整型和字符串的进一步封装。IPv4类型基于UInt32封装的,IPv6类型是基于FixedString(16)封装。如果需要返回IP的字符串形式,则需要显式调用IPv4NumToString或IPv6NumToString函数进行转换。

    数据表定义

    数据表操作

    分区操作

    目前只有MergeTree系列的表引擎支持数据分区。parts系统表专门用于查询数据表的分区信息。

    1. 查询:
    2. 删除:ALTER TABLE table1 DROP PARTITION partition1
    3. 复制:可以用于快速数据写入、多表间数据同步和备份等场景;两个前提条件:两张表需要拥有相同的分区键;表结构完全相同。
    4. 重置:重置为初始值,ALTER TABLE table1 CLEAR COLUMN column1 IN PARTITION partition1,如果已声明默认值表达式,则以表达式为准;否则以相应数据类型的默认值为准
    5. 卸载:ALTER TABLE table1 DETACH PARTITION partition1,分区被卸载后,其物理数据并没有删除,而是被转移到当前数据表目录的detached子目录下,即脱离CK的管理,CK并不会主动清理这些文件,这些分区文件会一直存在。
    6. 装载:ALTER TABLE table1 ATACH PARTITION partition1,卸载的逆过程,恢复数据。
    7. 备份:FREEZE
    8. 还原:FETCH

    分布式DDL执行

    将一条普通的DDL语句转换成分布式DDL执行十分简单,只需加上ON CLUSTER cluster_name声明即可。这意味着在集群中任意一个节点上执行DDL语句,集群中的每个节点都会以相同的顺序执行相同的语句。

    数据写入、删除与修改

    三种形式:
    1.
    2.

    第五章 数据字典

    数据字典是一种非常简单、实用的存储媒介,它以键值和属性映射的形式定义数据。字典中的数据会主动或者被动(数据是在ClickHouse启动时主动加载还是在首次查询时惰性加载由参数设置决定)加载到内存,并支持动态更新。字典数据常驻内存,非常适合保存常量或经常使用的维度表数据,以避免不必要的JOIN查询。

    分为内置与扩展两种形式。内置字典是CK默认自带字典,而外部扩展字典是用户通过自定义配置实现的字典。在正常情况下,字典中的数据只能通过字典函数访问(CK特别设置一类字典函数,专门用于字典数据的取用)。例外:使用特殊的字典表引擎。在字典表引擎的帮助下,可以将数据字典挂载到一张代理的数据表下,从而实现数据表与字典数据的JOIN查询。

    内置字典

    目前只有一种内置字典——Yandex.Metrica字典,默认情况下禁用,需要开启后才能使用。开启它的方式也十分简单,只需将config.xml文件中path_to_regions_hierarchy_filepath_to_regions_names_files两项配置打开。这两项配置是惰性加载的,只有当字典首次被查询的时候才会触发加载动作。填充Yandex.Metrica字典的geo地理数据由两组模型组成,可以分别理解为地区数据的主表及维度表

    外部扩展字典

    目前扩展字典支持7种类型的内存布局和4类数据来源,以插件形式注册。
    在默认的情况下,CK会自动识别并加载/etc/clickhouse-server目录下所有以_dictionary.xml结尾的配置文件。同时CK也能够动态感知到此目录下配置文件的各种变化,并支持不停机在线更新配置文件。在单个字典配置文件内可以定义多个字典,其中每一个字典由一组dictionary元素定义:

    <dictionaries>
    	<dictionary>
    	</dictionary>
    </dictionaries>
    

    第六章 MergeTree原理解析

    只有合并树系列的表引擎才支持主键索引、数据分区、数据副本和数据采样这些特性,同时也只有此系列的表引擎支持ALTER相关操作。Replicated前缀,支持数据副本。

    第七章 MergeTree系列表引擎

    表引擎大致分成6个系列:合并树、外部存储、内存、文件、接口和其他。
    数据TTL与存储策略。

    数据TTL
    在MergeTree中,可以为某个列字段或整张表设置TTL,如果同时设置了列级别和表级别的TTL,则会以先到期的那个为主。INTERVAL完整的操作包括SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER和YEAR。
    执行optimize命令强制触发TTL清理

    多路径存储策略

    第八章

    第九章

    第十章

    第十一章

    展开全文
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 书籍是什么,是希望,是神圣的,你们这些译者简直就是在犯罪 ,不过要是英文功底不好,还是建议买本看吧,谁让你英文水平不如他们呢 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的...
  • Java Concurrency in Practice Java并发编程实践 中英文版

    千次下载 热门讨论 2013-07-16 13:13:11
    Java并发编程实践,压缩包包含其中文版、英文版及书中的代码示例。喜欢本书请购买正版,英文原版及中文译本目录如下: 目录 英文原版: Listings xii Preface xvii Chapter 1: Introduction 1 1.1 A (very) brief ...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
  • 随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。java 5以及6在开发并发程序取得了显著的进步,提高了java虚拟机的性能,提高了并发类的可伸缩性,并加入了丰富的新并发构建块。在本书中,这些便利...
  • 17_Protobuf使用最佳实践与Apache Thrift介绍 18_Apache Thrift应用详解与实例剖析 19_Apache Thrift原理与架构解析 20_通过Apache Thrift实现Java与Python的RPC调用 21_gRPC深入详解 22_gRPC实践 23_Gradle Wrapper...
  • Java并发编程实践 PDF 高清版

    热门讨论 2010-06-25 10:44:59
    随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序取得了显著的进步,提高了Java虚拟机的性能,提高了并发类的可伸缩性,并加入了丰富的新并发构建块。在本书中,这些便利...
  • 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 处理反常的线程终止 7.4 jvm关闭 第8章 应用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,597
精华内容 34,238
热门标签
关键字:

并发模式与应用实践