Clay 的技术空间

用进废退 | 艺不压身

Spring Cloud Alibaba 是什么

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合,Github 项目地址在这里,官方文档在这里

Spring Cloud 概述

提起微服务,不得不提 Spring Cloud 全家桶系列,Spring Cloud 是若干个框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 多个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。一般来说,Spring Cloud 包含以下组件,主要以 Netflix 开源项目为主:

spring-cloud

阅读全文 »

大纲

前言

本文将介绍 Java 的内存模型(JMM),部分内容摘自《深入理解 Java 虚拟机》。

物理硬件和内存

首先,在单核电脑中处理的问题要简单得多,对内存和硬件的要求,各种方面的考虑没有在多核的情况下复杂。电脑中,CPU 的运行计算速度是非常快的,而其他硬件比如磁盘 IO,网络、内存读取等等,跟 CPU 的速度比起来是差几个数量级的。而不管任何操作,几乎是不可能都在 CPU 中完成而不借助于任何其他硬件操作。所以协调 CPU 和各个硬件之间的速度差异是非常重要的,要不然 CPU 就一直在等待,浪费资源。而在多核中,不仅面临如上问题,还有如果多个核用到了同一个数据,如何保证数据的一致性、正确性等问题,也是必须要解决的。目前基于高速缓存的存储交互很好的解决了 CPU 和内存等其他硬件之间的速度矛盾,多核情况下各个处理器(核)都要遵循一定的诸如 MSI、MESI 等协议来保证内存的各个处理器高速缓存和主内存的数据的一致性。

阅读全文 »

前言

Meson 介绍

Meson 的简介

Meson(The Meson Build System)是个项目构建系统,类似的构建系统有 MakefileCMakeautomake …。 Meson 是一个由 Python 实现的开源项目,其思想是,开发人员花费在构建调试上的每一秒都是浪费,同样等待构建过程直到真正开始编译都是不值得的。因此,Meson 的设计目的是在用户友好的同时不损害性能,Meson 提供客户语言(custom language)作为主要工具,用户可以使用它完成项目构建的描述。客户语言的设计目标是简单(simplicity)、清晰(clarity)、简洁(conciseness),其中很多灵感来源于 Python 语言。Meson 的另个一主要设计目的是为现代编程工具提供优秀的支持和最好的实现。这包括一些特性如:单元测试(unit testing)、代码覆盖率报告(code coverage reporting)、头文件预编译(precompiled headers)。用户不需要寻找第三方宏指令(third party macros)或编写 Shell 脚本来实现这些特性,Meson 可以开箱即用。Meson 相比 CMake 来说,不仅仅支持 C/C++,还支持多种编程语言。如今,很多项目都由 CMake 转向到了 Meson,例如 DPDKMapnik

阅读全文 »

前言

分布式解决方案介绍

  • Redis Sentinel

    • 用户体量较小时,可以选择 Redis Sentinel,单主 Redis 实例足以支撑业务。
  • Redis Cluster

    • Redis 官方提供的集群方案,用户体量较大时,可以选择 Redis Cluster,通过分片技术可以使用更多的内存。
  • Twemprox

    • Twitter 开源的一个 Redis 和 Memcached 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少客户端与 Cache 服务器直接连接的数量。
  • Codis

    • 一个 Redis 代理中间件,当客户端向 Codis 发送指令时,Codis 会将指令转发到后面的 Redis 实例来执行,并将结果返回给客户端。
    • 一个 Codis 实例可以连接多个 Redis 实例,也可以启动多个 Codis 实例来支撑,每个 Codis 节点都是对等的,这样可以增加整体的 QPS 需求,还能起到容灾功能。
  • 客户端分片

    • 该方案在 Redis Cluster 还没出现之前使用得比较多,现在基本很少使用了。
    • 分片逻辑在业务代码层实现,创建几个毫无关联的 Redis 实例,在代码层对 Key 进行 Hash 计算,然后去对应的 Redis 实例操作数据。
    • 该方案对 Hash 算法的要求比较高,需要考虑节点失效后的替代算法方案、数据震荡后的自动脚本恢复、实例的监控等等。
阅读全文 »

大纲

存储过程的介绍

  • 存储过程是在数据库中存储的一组预编译的 SQL 语句,可以在需要时多次调用。
  • 存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般的 SQl 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库的执行速度。
  • 通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户端发送到服务器,当客户端和服务器之间的操作有很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户端和服务器之间的网络传输就会大大减少,从而降低了网络负载。
阅读全文 »

前言

消息队列中间件选择时要根据项目的实际需求,考虑系统的吞吐量、延迟、可靠性、可扩展性等因素。

消息中间件产品对比一

消息队列适用场景优点缺点
Kafka 日志收集、大数据处理、实时流处理高吞吐量、高扩展性不支持复杂消息模型,有一定学习成本
RabbitMQ 企业消息传递、即时通讯、延时任务灵活的路由、支持多协议吞吐量较低,扩展性一般
RocketMQ 交易系统、订单系统、金融系统高性能、支持分布式事务、顺序消息社区支持一般,维护门槛高
ActiveMQ 小规模企业集成、跨平台消息传递灵活、协议支持多性能低,扩展性有限
阅读全文 »

系统级命令

获取符合规则的键名列表

KEYS 命令需要遍历 Redis 中的所有键,当键的数量较多时会严重影响性能,在生产环境中应该禁用该命令。

1
KEYS pattern

示例:

1
2
redis> KEYS *
1) "book"
阅读全文 »

前言

负载均衡的实现

  • TCP 层实现的负载均衡,例如:LVS(调度性能强悍)
  • 应用层实现的负载均衡,例如:Nginx、Haproxy、Apache、Varnish、Squid、Ribbon

Keepalived 概述

Keepalived 简介

  Keepalived 是 Linux 下一个轻量级别的高可用开源解决方案,高可用 (High Avalilability),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,它与 HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用;但是又有差别,HeartBeat 是一个专业的、功能完善的高可用软件,它提供了 HA 软件所需的基本功能,比如:心跳检测、资源接管、检测集群中的服务、在集群节点转移共享 IP 地址的所有者等等。HeartBeat 功能强大,但是部署和使用相对比较麻烦,与 HeartBeat 相比,Keepalived 主要是通过虚拟路由冗余来实现高可用功能,虽然它没有 HeartBeat 功能强大,但是 Keepalived 部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。Keepalived 实现了轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而 Heartbeat 用于服务的高可用,且需要共享存储,一般用于多节点的高可用。

  Keepalived 起初是专为 LVS 设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived 除了能够管理 LVS 软件外,还可以实现任意两台主机之间,例如 Master 和 Backup 主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是 LVS 负载均衡、Nginx 反向代理这样的服务器。Keepalived 软件主要是通过 VRRP 协议实现高可用功能的,VRRP 是 Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断、稳定地运行。所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

阅读全文 »

大纲

索引的介绍

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),包含了对数据表里所有记录的引用指针。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,需要确保该索引是应用在 SQL 查询语句的条件 (一般是 WHERE、JOIN 子句的条件)。

索引的类型

  • FULLTEXT:即为全文索引,目前只有 MyISAM 引擎支持,其可以在 CREATE TABLE,ALTER TABLE,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR、TEXT 列上可以创建全文索引
  • HASH:由于 HASH 的唯一性及类似键值对的形式,很适合作为索引,HASH 索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在 = 和 in 条件下才高效,对于范围查询、排序及组合索引仍然效率不高
  • BTREE:一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口 Root 开始,依次遍历 Node,获取 Leaf,这是 MySQL 里默认和最常用的索引类型
  • RTREE:在 MySQL 很少使用,仅支持 geometry 数据类型,支持该类型的存储引擎有 MyISAM、BDb、InnoDb、NDb、Archive
阅读全文 »