Zookeeper介绍
1. Zookeeper 概念Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与通知机制。 2. Zookeeper 角色Zookeeper 集群是一个基于主从复制的高可用集群,每个服务器承担如下三种角色中的一种 a. Leader 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader,它会发起并维护与各 Follwer及 Observer 间的心跳 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器。只要有超过半数节点(不包括 observeer 节点)写入成功,该写请求就会被提交. b. Follower 一个 Zookeeper 集群可能同时存在多个 Follower,它会响应 Leader 的心跳 Follower 可直接处理并返回客户端的读请求,同时会将写请求转发给...
Redis集群——主从同步
写在前面 很多企业都没有使用到 Redis 的集群,但是至少都做了主从。有了主从,当 master 挂 掉的时候,运维让从库过来接管,服务就可以继续,否则 master 需要经过数据恢复和重启 的过程,这就可能会拖很长的时间,影响线上业务的持续服务。 在了解 Redis 的主从复制之前,让我们先来理解一下现代分布式系统的理论基石—— CAP 原理 1 CPA 原理 CAP 原理就好比分布式领域的牛顿定律,它是分布式存储的理论基石。自打 CAP 的论 文发表之后,分布式存储中间件犹如雨后春笋般一个一个涌现出来。理解这个原理其实很简 单,本节我们首先对这个原理进行一些简单的讲解。 C Consistent 一致性 A Availability 可用性 P Partition toleranc 分区容忍性 分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有 网络断开的风险,这个网络断开的场景的专业词汇叫着「 网络分区」。 在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行的修改操 ...
线程池的参数
1. JAVA线程池源码 先看看源码内容,这里是 线程池的 全参构造方法 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253/** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * * @param corePoolSize the number of threads to keep in the pool, even * if they are idle, unless {@code allowCoreThreadTimeOut} is set * @param maximumPoolSize the maximum number of threads to allow in the * pool * @param keepAliveTime when...
CAP介绍
1. 什么是CAPCAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。 1.1 一致性(C)在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本) 1.2 可用性(A)在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性) 1.3 分区容忍性(P)以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。
分布式中的柔性事务
1. 柔性事务在电商领域等互联网场景下,传统的事务在数据库性能和处理能力上都暴露出了瓶颈。在分布式领域基于 CAP 理论以及 BASE 理论,有人就提出了 柔性事务 的概念。CAP(一致性、可用性、分区容忍性)理论大家都理解很多次了,这里不再叙述。说一下 BASE 理论,它是在 CAP 理论的基础之上的延伸。包括 基本可用(Basically Available)、柔性状态(Soft State)、最终一致性(Eventual Consistency)。 通常所说的柔性事务分为:两阶段型、补偿型、异步确保型、最大努力通知型几种。 1.1 两阶段型就是分布式事务两阶段提交,对应技术上的 XA、JTA/JTS。这是分布式环境下事务处理的典型模式。 1.2 补偿型TCC 型事务(Try/Confirm/Cancel)可以归为补偿型。 WS-BusinessActivity 提供了一种基于补偿的 long-running 的事务处理模型。服务器 A 发起事务,服务器 B 参与事务,服务器 A 的事务如果执行顺利,那么事务 A 就先行提交,如果事务 B...
分布式事务的三段提交协议
1. 三阶段提交协议三阶段提交(Three-phase protocol),是二阶段提交(2PC)的改进版本.与两阶段提交不同的是,三阶段提交有两个改动点: ① 引入超时机制。同时在协调者和参与者中都引入超时机制 ② 在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。也就是说,除了引入超时机制之外, 3PC 把 2PC 的准备阶段再次一分为二,这样三阶段提交就有 CanCommit、PreCommit、DoCommit 三个阶段。 2. 三个阶段2.1 CanCommit阶段协调者向参与者发送 commit 请求,参与者如果可以提交就返回 Yes 响应,否则返回 No 响应。 2.2 PreCommit 阶段协调者根据参与者的反应情况来决定是否可以继续进行,有以下两种可能。假如协调者从所有的参与者获得的反馈都是 Yes 响应,那么就会执行事务的预执行假如有任何一个参与者向协调者发送了 No 响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断。 2.3 DoCommit 阶段该阶段进行真正的事务提交,主要包含...
分布式事务的两段提交协议
1. 分布式事务简介分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。 二阶段提交(Two-phaseCommit)是指,在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的 ACID 特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。 2. 两段提交2.1 准备阶段事务协调者(事务管理器)给每个参与者(资源管理器)发送 Prepare...
递归实现二分查找
1、查找第K大元素? 思想: 分而治之 算法: 归并排序 步骤: 1、1个退出条件 2个递归调用(左和右) 2、1个合并,合并中 4个循环(1 去最后元素, 取左边剩余元素, 取右边剩余元素 复制) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657public void findKthLargest(int[] arr, int k){ //归并排序 mergeSort(arr, 0, arr.length - 1); //返回第K大元素 return arr[arr.length - k];}public void mergeSort(int[] arr, int left, int right){ //退出条件 if(left >= right){ return; } //分解 int mid =...
基于Redis的分布式锁
获取锁的时候,使用 setnx(SETNX key val:当且仅当 key 不存在时,set 一个 key为 val 的字符串,返回 1;若 key 存在,则什么都不做,返回 0)加锁,锁的 value值为一个随机生成的 UUID,在释放锁的时候进行判断。并使用 expire 命令为锁添加一个超时时间,超过该时间则自动释放锁。 获取锁的时候调用 setnx,如果返回 0,则该锁正在被别人使用,返回 1 则成功获取锁。 还设置一个获取的超时时间,若超过这个时间则放弃获取锁。 释放锁的时候,通过 UUID 判断是不是该锁,若是该锁,则执行 delete 进行锁释放。
数据库的锁
1. 行级锁行级锁是一种排他锁,防止其他事务修改此行。 2. 表级锁表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。最常使用的 MYISAM 与 INNODB 都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。 3. 页级锁页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB 支持页级锁