因为一次Kafka宕机,我明白了Kafka高可用原理
Kafka宕机引发的高可用问题问题要从一次Kafka的宕机开始说起。笔者所在的是一家金融科技公司,但公司内部并没有采用在金融支付领域更为流行的RabbitMQ,而是采用了设计之初就为日志处理而生的Kafka,所以我一直很好奇Kafka的高可用实现和保障。从Kafka部署后,系统内部使用的Kafka一直运行稳定,没有出现不可用的情况。但最近系统测试人员常反馈偶有Kafka消费者收不到消息的情况,登陆管理界面发现三个节点中有一个节点宕机挂掉了。但是按照高可用的理念,三个节点还有两个节点可用怎么就引起了整个集群的消费者都接收不到消息呢?要解决这个问题,就要从Kafka的高可用实现开始讲起。Kafka的多副本冗余设计不管是传统的基于关系型数据库设计的系统,还是分布式的如zookeeper、redis、Kafka、HDFS等等,实现高可用的办法通常是采用冗余设计,通过冗余来解决节点宕机不可用问题。首先简单了解Kafka的几个概念:
物理模型
逻辑模型
Broker(节点):Kafka服务节点,简单来说一个Broker就是一台Kafka服务器,一个物理节点。
Topic(主题):在Kafka中消 ...
解决brew switch报错
解决brew switch报错mac电脑 brew 升级以后使用brew switch报错,错误信息为:
Error: Calling `brew switch` is disabled! Use `brew link` @-versioned formulae instead.
解决办法是:
新建一个文件,命名为brew-switch
添加内容 #! /usr/bin/env bashset -euo pipefailpkg=$1version=$2brew unlink "$pkg"(pushd "$(brew --prefix)/opt"rm -f "$pkg"ln -s "../Cellar/$pkg/$version" "$pkg")brew link "$pkg"
保存后 chmod +x brew-switch 增加执行权限。
将文 ...
laravel的生命周期
世间万物皆有生命周期,当我们使用任何工具时都需要理解它的工作原理,那么用起来就会得心应手,应用开发也是如此。理解了它的原理,那么使用起来就会游刃有余。在了解 Laravel 的生命周期前,我们先回顾一下PHP 的生命周期。
PHP 的生命周期PHP 的运行模式PHP两种运行模式是WEB模式、CLI模式。
当我们在终端敲入php这个命令的时候,使用的是CLI模式。
当使用Nginx或者别web服务器作为宿主处理一个到来的请求时,使用的是WEB模式。
生命周期当我们请求一个.php文件时,PHP为了完成这次请求,会发生5个阶段的生命周期切换:
模块初始化(MINIT),即调用php.ini中指明的扩展的初始化函数进行初始化工作,如mysql扩展。
请求初始化(RINIT),即初始化为执行本次脚本所需要的变量名称和变量值内容的符号表,如$_SESSION变量。
执行该PHP脚本。
请求处理完成(Request Shutdown),按顺序调用各个模块的 RSHUTDOWN 方法,对每个变量调用 unset函数,如 unset $_SESSION 变量。
关闭模块(Module Shu ...
单点登录(SSO)
背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说,很不方便。
背景在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说,很不方便。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题。
单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块, ...
时间复杂度分析的递归树法
分析每一步核心操作的时间复杂度
分析树高:最大树高和最小树高
计算每层复杂度,全加起来
实战1:快速排序
分割算法是O(n)
树高最大最小都是 logn,所以O(logn)
实战2:斐波那契数列:
加和算法1
节点数为倍增。 通项为2^h
高度最高n,最低n/2.相当于求等比数列前n项和。所以结果2^n,指数级
实战3:全排列
核心为将每一项交换到最后一个位置,O(n)
每层树枝-1,所以每层通项是n*n-1*n-2...n-h。
最后一层为一个,所以是n!。求和不好求但是知道该算法大于n!
思考题:1 个细胞的生命周期是 3 小时,1 小时分裂一次。求 n 小时后,容器内有多少细胞?请你用已经学过的递归时间复杂度的分析方法,分析一下这个递归问题的时间复杂度。思路:f(n) = 2 * f(n-1) - 【n时刻点死掉的细胞数量】而在【n时刻点死掉的细胞数量】就是【n-3时刻点新分裂的细胞数量】;【n-3时刻点新分裂的细胞数量】就是【n-4时刻点的细胞数总数】,即f(n-4)
故递推公式:f(n) = 2 * f(n-1) - f(n-4),类似斐波那契数列,为指数级
算法思想
贪心贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生成树算法、还有 Dijkstra 单源最短路径算法。
解决问题步骤第一步,当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。第二步,我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。第三步,我们举几个例子看下贪心算法产生的结果是否是最优的。
例子1我们有 m 个糖果和 n 个孩子。我们现在要把糖果分给这些孩子吃,但是糖果少,孩子多(m<n),所以糖果只能分配给一部分孩子。每个糖果的大小不等,这 m 个糖果的大小分别是 s1,s2,s3,……,sm。除此之外,每个孩子对糖果大小的需求也是不一样的,只有糖果的大小大于等于孩子的对糖果大小的需求的时候,孩子才得到满足。假设这 n 个孩子对糖果大小的需求分别是 g1,g2,g3,……,gn。问题是,如何分配糖果,能尽可能满足最多数量的孩子?
我们可以把这个问题抽象成, ...
php 实现单链表以及链表反转等操作
缓存淘汰的三种策略
先进先出策略 FIFO(First In,First Out)
最少使用策略 LFU(Least Frequently Used)
最近最少使用策略 LRU(Least Recently Used)
可以考虑用链表进行实现。
链表它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用。链表要想随机访问第 k 个元素,就没有数组那么高效了。因为链表中的数据并非连续存储的,所以无法像数组那样,根据首地址和下标,通过寻址公式就能直接计算出对应的内存地址,而是需要根据指针一个结点一个结点地依次遍历,直到找到相应的结点。
链表分类
单链表
双向链表
循环链表:循环链表也很简单。它跟单链表唯一的区别就在尾结点
数组与链表的对比
时间复杂度
数组
链表
插入、删除
O(n)
O(1)
随机访问
O(1)
O(n)
数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。
数组的缺点是大小固定,一经声明就要占用整 ...
平衡二叉树
二叉查找树是常用的一种二叉树,他支持快速插入,删除,查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)
在很多书籍中,但凡讲到平衡二叉查找树,就会那红黑树做为例子。在工程中,很多用到平衡二叉查找树的地方都会用红黑树。
一,什么是“平衡二叉查找树”
定义:二叉树中任意一个节点的左右子树的高度相差不能大于1。所以:完全二叉树,满二叉树都是平衡二叉树,非完全二叉树也有可能是平衡二叉树。
平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。
发明平衡二叉查找树这类数据结构的初衷是解决普通二叉查找树在频繁的插入,删除等动态更新的情况下,出现时间复杂度退化的问题。所以,平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”,比较“平衡”,不要出现左子树很高,右子树很矮的情况。这样就能让整颗树的高度相对低一些,相应的插入,删除,查找等操作的效率高一些。
若设计一个新的平衡二叉查找树,只要树的高度不比log2n大很多(如树的高度仍然是对数量级的),尽管它不符合严格的平衡二叉查找树的定义,但它仍然可以被认为是一个合格的平衡二叉查找 ...
部署升级策略
停机部署介绍停机部署其实是最简单粗暴的方式,就是简单地把现有版本的服务停机,然后部署新的版本。在一些时候,我们必需使用这样的方式来部署或升级多个服务。比如,新版本中的服务使用到了和老版本完全不兼容的数据表的设计。这个时候,我们对生产有两个变更,一个是数据库,另一个是服务,而且新老版本互不兼容,所以只能使用停机部署的方式。这种方式的优势是,在部署过程中不会出现新老版本同时在线的情况,所有状态完全一致。停机部署主要是为了新版本的一致性问题。
缺点这种方式最不好的问题就是会停机,对用户的影响会很大。所以,一般来说,这种部署方式需要事前挂公告,选择一个用户访问少的时间段来做。
蓝绿部署介绍蓝绿部署与停机部署最大的不同是,其在生产线上部署相同数量的新的服务,然后当新的服务测试确认 OK 后,把流量切到新的服务这边来。蓝绿部署比停机部署好的地方是,它无需停机。我们可以看到这种部署方式,就是我们说的预发环境。在我以前的金融公司里,也经常用这种方式,生产线上有两套相同的集群,一套是 Prod 是真实服务的,另一套是 Stage 是预发环境,发布发 Stage,然后把流量切到 Stage 这边,于是 S ...
MySQL Server层
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
连接器如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。即:这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置
连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在 show processlist 命令中看到它。文本中这个图是 show processlist 的结果,其中的 Command 列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个
建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立 ...