分布式锁

  categories:资料  author:

背景

最近在业务中出现用户重复提交退款,因为重复提交时间差极端,在加上中间网络延迟,导致请求到达服务端时,出现两个请求的时间差在毫秒级,从而导致重复数据;后来在商户端也出现类似的情况,因此开始在关键业务中使用分布式锁来解决这类问题。

分布式锁是控制分布式系统之前访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

实现分布式锁,主要有以下三个方面为重点:

  • 获取锁

    在并发情况下,保证只有一个client能够获取到锁。

  • 释放锁

    client在正常处理业务结束之后主动释放锁;client处理过程中出现异常未能主动释放锁,需要系统能够主动释放锁,保证不会出现死锁。

  • 其他client获知锁被释放

    当锁被释放之后,其他client可以获知到锁已经被释放,并可以重新竞争锁。

数据库锁

思想:使用订单号(唯一)作为数据库表的主键或索引,每笔订单在访问共享资源时,通过下面的方法来保证互斥。

// 获取锁
int lock() {
    return sql.exec("insert into t_dlm(f_oid, f_remark) values('1', 'task1')");
}
// 释放锁
int unlock() {
    return sql.exec("delete from t_dlm where f_oid='1'"
阅读全文

应用容器化和与Kubernetes适配的7条军规

  categories:资料  tags:,   author:

本文来自于Red Hat咨询顾问Bilgin Ibryam所编写的一篇白皮书,名为《PRINCIPLES OF CONTAINER-BASED APPLICATION DESIGN》。已被被Kubernetes官网转载。白皮书在Red Hat官网的下载地址:https://www.redhat.com/en/resources/cloud-native-container-design-whitepaper 本微信文章是我是对这篇文章的学习和整理。

先回顾经典的软件设计原则:

  • 保持简单,愚蠢(KISS)
  • 不要重复自己(DRY)
  • 适可而止 (YAGNI)
  • 关注点分离(SoC)
  • 单一责任, 开放封闭, 里氏替换, 迪米特法则,接口分离, 依赖倒置(SOLID)

然后是Red Hat的云原生容器设计原则:

  1. 单一关注性原则(SCP)
  2. 高度可观测性原则(HOP)
  3. 生命周期一致性原则(LCP)
  4. 镜像不可变性原则(IIP)
  5. 进程可处置性原则(PDP)
  6. 自包含性原则(S-CP)
  7. 运行时约束性原则(RCP)

很多组织都理解云原生的重要性和必要性,但是并不知道从哪里开始。那么请确保:云原生平台和容器化应用能无缝的运行在一起,并且具备抵御故障的能力,甚至在底层的基础架构出现宕机的时候,也能通过过弹性扩展的方式表现出可靠性。本文描述了容器化应用时需要遵循的基本准则,实施这些原则有助于使之与云原生平台Kubernetes更加适配。

1、单一关注性原则

SINGLE CONCERN PRINCIPLE(SCP)

在许多方面,单一关注性原则与来自SOLID的SRP是类似的,它建议一个类应该只有一个责任。SRP背后的动机是每个责任是变更的一个轴心,一个类应该有,且也只有一个需要改变的理由。SCP原则中的“关注”一词强调关注是一种更高层次的抽象的责任,而且它更好地将范围描述为一个容器而不是一个类。虽然SRP的主要动机是变化原因的唯一性,而SCP的主要动机是容器镜像重用和可替换性。如果你创建一个解决单个问题的容器,并且以功能完整的方式来实现,不同应用程序中的容器镜像重用的可能性就会更高。

因此,SCP原则规定每个集容器都应该解决一个问题,并做得很好。 实现这一点,通常比在面向对象的世界中实现SRP更容易,容器通常管理的一个单一的进程,大多数情况下一个进程解决一个问题。

如果你的容器化微服务需要解决多个问题,它可以使用这样的模式,将多个容器用sidecar和init-containers的模式合并成一个部署单元(pod),这样每个容器仍然是处理单个问题。同样,您可以替换处理同样问题的容器。 例如,将Web服务器容器或队列实现容器,更新为更具可扩展性的容器。

2、高度可观测性原则

阅读全文

Kubernetes管理Docker集群之部署篇

  categories:资料  tags:,   author:

摘要: 什么是Kubernetes? Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。 主要功能如下: 1)将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。

什么是Kubernetes?

Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。

主要功能如下:

1)将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。

2)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题

3)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。

Kubernetes角色组成:

1)Pod

Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;

同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;

2)ReplicationController(RC)

RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。

RC通过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。

3)Service

Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。

4)Label

Label是用于区分Pod、Service、RC的key/value键值对;

Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;

主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

Kubernetes组件组成:

1)kubectl

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。

2)kube-apiserver

作为整个系统的控制入口,以REST API服务提供接口。

3)kube-controller-manager

用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

4)kube-scheduler

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。

5)etcd

负责节点间的服务发现和配置共享。

6)kube-proxy

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。

阅读全文

Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用

  categories:资料  tags:,   author:

K8s基础原理

k8s中文社区:https://www.kubernetes.org.cn/

简介

Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

K8s特性

Kubernetes是为生产环境而设计的容器调度管理系统,对于负载均衡、 服务发现、高可用、滚动升级、自动伸缩等容器云平台的功能要求有原生支持

一个K8s集群是由分布式存储(etcd)、服务节点(Minion, etcd现在称为Node)和控制节点(Master)构成的。所有的集群状态都保存在etcd中,Master节点上则运行集群的管理控制模块。Node节点是真正运行应用容器的主机节点,在每个Minion节点上都会运行一个Kubelet代理,控制该节点上的容器、镜像和存储卷等。

K8s架构图,介绍

Master(管理节点)

  • API Server:供Kubernetes API接口,主要处理 Rest操作以及更新Etcd中的对象。 所有资源增删改查的唯一入口。
  • Scheduler:绑定Pod到Node上,资源调度。
  • Controller Manager: 所有其他群集级别的功能,目前由控制器Manager执行。资源对象的 自动化控制中心。
  • Etcd:所有持久化的状态信息存储在Etcd中。

Node(计算节点)

  • Kubelet:管理Pods以及容器、镜像、Volume等,实现对集群 对节点的管理
  • Kube-proxy:提供网络代理以及负载均衡,实现与Service通讯。
  • Docker Engine:负责节点的容器的管理工作。

API SERVER(授权)

  • 只有API Server与存储通信,其他模块通过 API Server访问集群状态。
  • 一个工作节点的问题不影响集群体。
  • 在K8s集群中,所有的配置管理操作都声明 式而非命令式的。
阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1