跳至主要內容
Docker - 1

Docker

简介

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker


code中间件Docker大约 3 分钟
Docker - 2

Docker

优势

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高

无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。


code中间件Docker大约 3 分钟
Docker - 2

Docker

Docker 本质:

Docker = 创建隔离进程 + 资源管理 + 网络/文件映射

容器就是进程

  • 容器内的应用进程直接运行在宿主机内核上
  • 容器 ID 本质上就是一组经过特殊配置的进程
  • 这些进程通过 Linux 的 namespaces 和 cgroups 实现隔离
宿主机视角:
  PID 1001: nginx 主进程  ← 这就是一个"容器"
  PID 1002: nginx worker
  ...

容器视角:
  PID 1: nginx 主进程
  PID 2: nginx worker
  ...

code中间件Docker大约 7 分钟
Docker - 2

Docker

分析

Docker 镜像会包含应用运行所需的所有系统依赖

一个应用的 Docker 镜像会包含:

  • 应用代码
  • 运行环境(如 Node.js、JRE、Python)
  • 所有系统依赖库
  • 必要的工具(shell、包管理器等)

比如:

FROM node:18-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install --production  # 安装 npm 依赖(包括原生模块)
COPY . .

CMD ["node", "server.js"]

code中间件Docker小于 1 分钟
Redis - 11 高可用5 (集群)

Redis 高可用 - 集群

主要内容:

  • 为什么需要Redis Cluster?
  • 客户端是怎样知道该访问哪个分片的? (哈希槽)
  • redis实例上并没有相应的数据,会怎么样?(MOVED重定向和ASK重定向)
  • 各个节点之间是怎么通信的呢(Gossip协议)
  • 集群内节点出现故障怎么办(故障转移)
  • Redis Cluster的Hash Slot 为什么是16384?

Redis Cluster

哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容


code中间件Redis大约 7 分钟
Redis - 12 缓存

Redis 缓存

用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了

当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就崩溃的了,所以为了避免用户直接访问数据库,会用 Redis 作为缓存层

因为 Redis 是内存数据库,我们可以将数据库的数据缓存在 Redis 里,相当于数据缓存在内存,内存的读写速度比硬盘快好几个数量级,这样大大提高了系统性能

引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透

缓存雪崩 (好多key同一时间都失效)


code中间件Redis大约 13 分钟
Redis - 13 缓存2

Redis 缓存2

给服务器加上 Redis,让其作为数据库的缓存

这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能

由于引入了缓存,那么在数据更新时,不仅要更新数据库,而且要更新缓存,这两个更新操作存在前后的问题:

  • 先更新数据库,再更新缓存;
  • 先更新缓存,再更新数据库;

数据库与缓存一致性问题

不好的方案

先写 MySQL,再写 Redis

请求 A、B 都是先写 MySQL,然后再写 Redis,在高并发情况下,如果请求 A 在写 Redis 时卡了一会,请求 B 已经依次完成数据的更新


code中间件Redis大约 4 分钟
Redis - 14 过期淘汰与内存删除策略

过期删除策略和内存淘汰策略区别

alt text

过期删除策略

Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略

如何设置过期时间

设置 key 过期时间的命令一共有 4 个:

  • expire <key> <n>:设置 key 在 n 秒后过期,比如 expire key 100 表示设置 key 在 100 秒后过期;
  • pexpire <key> <n>:设置 key 在 n 毫秒后过期,比如 pexpire key2 100000 表示设置 key2 在 100000 毫秒(100 秒)后过期。
  • expireat <key> <n>:设置 key 在某个时间戳(精确到秒)之后过期,比如 expireat key3 1655654400 表示 key3 在时间戳 1655654400 后过期(精确到秒);
  • pexpireat <key> <n>:设置 key 在某个时间戳(精确到毫秒)之后过期,比如 pexpireat key4 1655654400000 表示 key4 在时间戳 1655654400000 后过期(精确到毫秒)

code中间件Redis大约 14 分钟
Redis - 15 场景分析

Redis 简介

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景

Redis 和 Memcached 区别

Redis 与 Memcached 共同点:

  • 都是基于内存的数据库,一般都用来当做缓存使用。
  • 都有过期策略。
  • 两者的性能都非常高。

Redis 与 Memcached 区别:(数据类型、持久化、集群管理、其他功能)


code中间件Redis大约 23 分钟
Redis - 10 高可用4 (哨兵)

Redis 高可用 - 哨兵机制

在 Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slave)进行数据同步了

这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换为「主节点」,然后让其他从节点指向新的主节点,同时还需要通知上游那些连接 Redis 主节点的客户端,将其配置中的主节点 IP 地址更新为「新主节点」的 IP 地址

但这样太麻烦了,并且不智能,如果有一个节点能监控「主节点」的状态,当发现主节点挂了,它自动将一个「从节点」切换为「主节点」的,就可以了


code中间件Redis大约 15 分钟