Redis集群新选择:Codis 3.2保姆级Docker部署教程(附避坑指南)

利用Docker安装运行Codis 最近打算对缓存中间进行专题性学习,之前使用过Redis Sentinal,后来认识到Codis,对Codis产生感兴趣,于是便有了下面的安装运行总结。 什么是Codis目前基于Redis集群的方案有三种,第一种是Redis Sentinal,第二种是Redis Cluster,第三种是豌豆荚的Codis。 Redis Sentinal搭建简单,不过受Redis容量限制,普通应用个人觉得已经足够了; 阅读详情

Redis集群新选择:Codis 3.2保姆级Docker部署教程(附避坑指南)

如果你正在为单点Redis的性能瓶颈或高可用架构的复杂性而头疼,那么将目光投向Codis,或许能打开一扇新的大门。Codis,这个由豌豆荚团队开源的分布式Redis解决方案,通过引入一个智能的代理层,巧妙地解决了数据分片、故障转移和集群管理等一系列难题。对于需要处理海量数据、支撑高并发访问,但又希望保持与原生Redis客户端高度兼容的团队来说,Codis提供了一个优雅的折中方案。尤其在容器化技术普及的今天,通过Docker部署Codis集群,能将环境依赖、版本管理和服务编排的复杂度降到最低,让开发者更专注于业务逻辑本身。本文将带你从零开始,手把手完成一个生产可用的Codis 3.2集群的Docker化部署,并分享那些官方文档里可能没细说,但实践中一定会遇到的“坑”与解决方案。

1. 部署前的核心概念与架构解析

在动手敲命令之前,花几分钟理解Codis的核心组件和工作原理至关重要。这能帮助你在后续配置和排错时,清晰地知道每个参数的意义和每个组件的作用。

Codis的架构可以看作是一个“代理-存储-协调”的三层模型。最上层是Codis-Proxy,它对外提供与单机Redis完全兼容的协议接口。你的应用程序连接的是Proxy,而不是后端的Redis实例。Proxy内部维护着一个数据分片(Slot)的路由表,根据Key的哈希值决定将请求转发到哪个后端Group。

中间层是Codis-Server,它本质上是经过定制开发的Redis实例(基于Redis 3.2),负责实际的数据存储。多个Codis-Server实例被组织成一个Group,每个Group内部采用一主多从的经典主从复制结构,实现数据冗余和读写分离。

最底层是协调与元数据存储层。在Codis 3.2中,官方推荐使用ZooKeeper或Etcd。这个组件不存储业务数据,只保存集群的元信息,例如:所有Proxy的地址列表、Slot到Group的映射关系、各个Group的主从节点状态等。正是通过这个中心化的元数据存储,Proxy才能动态感知集群拓扑的变化。

此外,还有两个管理组件:

  • Codis-Dashboard:集群的大脑,负责执行诸如数据迁移、主从切换、节点上下线等管理指令。它通过读取/写入元数据存储来驱动集群状态变更。
  • Codis-FE (Frontend):一个基于Web的图形化管理界面,底层通过调用Dashboard的API来操作集群,为管理员提供了直观的可视化控制台。

注意:很多初次接触Codis的开发者会混淆Proxy和Server的角色。记住一个简单的类比:Proxy是“前台接待”,负责接活和派活;Server是“后台工人”,负责干活。你的应用只需要和“前台”打交道。

理解了架构,我们来看一个请求的生命周期:

  1. 客户端向任意一个Codis-Proxy发起SET user:1001 “Alice”命令。
  2. Proxy计算Key user:1001的哈希值,并映射到1024个Slot中的一个(比如Slot 500)。
  3. Proxy查询内存中的路由表(该表定期从ZooKeeper同步),发现Slot 500当前由Group-2负责。
  4. Proxy将写命令转发给Group-2的Master Codis-Server。
  5. Master处理命令并返回结果给Proxy,Proxy再返回给客户端。
  6. 同时,Master会异步地将数据变更复制给同Group内的Slave节点。

整个过程对客户端透明,就像在操作一个超大内存的单一Redis实例。

2. 环境准备与Docker网络规划

我们选择Docker进行部署,这能保证环境的一致性,并简化依赖管理。首先,确保你的宿主机上已经安装了Docker和Docker Compose。我们将使用Docker Compose来编排所有服务。

关键决策:Docker网络模式的选择 这是第一个容易踩坑的地方。Codis集群内部组件之间需要频繁通信(Proxy连接Server,Dashboard连接ZooKeeper等)。为了简化网络配置并提高性能,我们创建一个自定义的Docker桥接网络。

# 创建一个名为codis-net的自定义网络
docker network create --subnet=172.19.0.0/16 codis-net

使用自定义网络有两大好处:

  1. 服务发现:容器之间可以通过容器名称直接互相访问,无需关心IP地址变化。
  2. 隔离性:将Codis集群与其他服务隔离开,更安全。

接下来,我们需要规划各个服务的容器名称、端口映射以及资源限制。以下是一个建议的配置表格,适用于开发测试环境:

服务组件容器名称自定义网络内端口宿主机映射端口数据卷映射备注
ZooKeeperzk1218132181./zk_data:/data元数据存储,单节点仅用于演示,生产环境需集群。
Codis-Dashboardcodis-dashboard18080无./config/dashboard.toml:/codis/config/dashboard.toml管理后台,通常无需对外暴露。
Codis-FEcodis-fe909039090无Web管理界面。
Codis-Proxy (x2)codis-proxy-1, -219000(admin), 11080(proxy)29000/21080, 29001/21081./config/proxy.toml:/codis/config/proxy.tomlProxy需要两个端口,admin用于管理,proxy用于业务。
Codis-Server Group1 (Master)codis-server-g1-m1637936379./data/g1-m1:/data业务数据存储。
Codis-Server Group1 (Slave)codis-server-g1-s1637936380./data/g1-s1:/data
Codis-Server Group2 (Master)codis-server-g2-m1637936381./data/g2-m1:/data
Codis-Server Group2 (Slave)codis-server-g2-s1637936382./data/g2-s1:/data

提示:端口映射规则中,我们将管理端口(如Dashboard的18080)尽量不暴露到宿主机,以增强安全性。Proxy的业务端口(11080)和FE的端口(9090)需要对外暴露,供应用和管理员访问。

3. 编写核心配置文件与Docker Compose编排

Codis的各个组件都通过TOML格式的配置文件来定义行为。这是部署的核心环节,配置错误是导致集群无法启动的最常见原因。

首先,创建项目目录结构:

codis-docker-deploy/
├── docker-compose.yml
├── config/
│   ├── dashboard.toml
│   └── proxy.toml
├── zk_data/
└── data/ (子目录在启动时自动创建)

第一步:配置Codis-Dashboard (config/dashboard.toml) Dashboard的配置相对简单,主要指定协调器(ZooKeeper)的地址和自身的管理网络。

# 协调器地址,使用容器名zk1
coordinator = “zk”
zk = “zk1:2181”

# Dashboard监听的网络地址。这里使用0.0.0.0监听所有网卡。
# 注意:在Docker中,这个地址是容器内的地址。
product = “codis-demo”
dashboard_addr = “0.0.0.0:18080”

# 密码验证,生产环境务必设置
password = “”

# 会话超时时间
session_max_timeout = “30m”
session_max_bufsize = 131072
session_max_pipeline = 1024

第二步:配置Codis-Proxy (config/proxy.toml) Proxy的配置是关键,特别是网络地址部分,直接决定了集群内外能否正常通信。

product = “codis-demo”
dashboard_addr = “codis-dashboard:18080” # 使用容器名访问Dashboard

# Proxy对外提供服务的地址。这是第一个大坑!
# 这里必须填写客户端(你的应用程序)能够访问到的地址。
# 因为Proxy会把这个地址注册到ZooKeeper,供客户端查询。
# 假设宿主机IP是192.168.1.100,我们映射了21080端口。
proxy_addr = “0.0.0.0:11080” # 容器内监听地址
host_proxy = “192.168.1.100:21080” # 对外注册的地址

# Proxy管理API的地址。同样需要内外映射。
admin_addr = “0.0.0.0:19000” # 容器内监听地址
host_admin = “192.168.1.100:29000” # 对外注册的地址

# 后端Codis-Server的默认连接池配置
backend_ping_period = “5s”
backend_recv_bufsize = 131072
backend_send_bufsize = 65536
backend_recv_timeout = “30s”
backend_send_timeout = “30s”
backend_conn_timeout = “5s”

避坑指南1:host_proxy和host_admin配置 这是Docker部署Codis最核心的配置项。proxy_addr和admin_addr是容器内部监听的地址,而host_proxy和host_admin是容器外部可访问的地址(通常是宿主机IP+映射端口)。Codis启动时,会将host_*地址注册到ZooKeeper。如果你的客户端(比如Java应用)在另一台机器上,它从ZooKeeper拿到的是这个host_proxy地址。如果这里配错了(比如配成了容器内IP),客户端将无法连接到Proxy。

第三步:编写Docker Compose文件 (docker-compose.yml) 我们将所有服务定义在一个文件中,便于统一管理。

version: ‘3.8’
services:
  zk1:
    image: zookeeper:3.8
    container_name: zk1
    restart: unless-stopped
    networks:
      codis-net:
        ipv4_address: 172.19.0.10
    ports:
      - “32181:2181”
    volumes:
      - “./zk_data:/data”
    environment:
      ZOO_MY_ID: 1

  codis-dashboard:
    image: codis/codis:3.2
    container_name: codis-dashboard
    restart: unless-stopped
    command: codis-dashboard --config /codis/config/dashboard.toml --log /codis/logs/dashboard.log --log-level WARN
    networks:
      codis-net:
        ipv4_address: 172.19.0.20
    volumes:
      - “./config/dashboard.toml:/codis/config/dashboard.toml”
    depends_on:
      - zk1

  codis-fe:
    image: codis/codis:3.2
    container_name: codis-fe
    restart: unless-stopped
    command: codis-fe --dashboard-list 172.19.0.20:18080 --listen 0.0.0.0:9090 --log /codis/logs/fe.log --log-level WARN
    networks:
      codis-net:
        ipv4_address: 172.19.0.30
    ports:
      - “39090:9090”
    depends_on:
      - codis-dashboard

  codis-proxy-1:
    image: codis/codis:3.2
    container_name: codis-proxy-1
    restart: unless-stopped
    command: codis-proxy --config /codis/config/proxy.toml --log /codis/logs/proxy1.log --log-level WARN --cpu 2 --ncpu 1
    networks:
      codis-net:
        ipv4_address: 172.19.0.41
    ports:
      - “29000:19000”
      - “21080:11080”
    volumes:
      - “./config/proxy.toml:/codis/config/proxy.toml”
    depends_on:
      - codis-dashboard
    deploy:
      resources:
        limits:
          cpus: ‘2’
          memory: 1G

  codis-proxy-2:
    image: codis/codis:3.2
    container_name: codis-proxy-2
    restart: unless-stopped
    command: codis-proxy --config /codis/config/proxy.toml --log /codis/logs/proxy2.log --log-level WARN --cpu 2 --ncpu 1
    networks:
      codis-net:
        ipv4_address: 172.19.0.42
    ports:
      - “29001:19000”
      - “21081:11080”
    volumes:
      - “./config/proxy.toml:/codis/config/proxy.toml”
    depends_on:
      - codis-dashboard
    deploy:
      resources:
        limits:
          cpus: ‘2’
          memory: 1G

  codis-server-g1-m1:
    image: codis/codis:3.2
    container_name: codis-server-g1-m1
    restart: unless-stopped
    command: codis-server /codis/redis.conf --maxmemory 2gb --daemonize no
    networks:
      codis-net:
        ipv4_address: 172.19.0.51
    ports:
      - “36379:6379”
    volumes:
      - “./data/g1-m1:/data”
    deploy:
      resources:
        limits:
          memory: 2.5G

  codis-server-g1-s1:
    image: codis/codis:3.2
    container_name: codis-server-g1-s1
    restart: unless-stopped
    command: codis-server /codis/redis.conf --maxmemory 2gb --daemonize no --slaveof codis-server-g1-m1 6379
    networks:
      codis-net:
        ipv4_address: 172.19.0.52
    ports:
      - “36380:6379”
    volumes:
      - “./data/g1-s1:/data”
    depends_on:
      - codis-server-g1-m1
    deploy:
      resources:
        limits:
          memory: 2.5G

  codis-server-g2-m1:
    image: codis/codis:3.2
    container_name: codis-server-g2-m1
    restart: unless-stopped
    command: codis-server /codis/redis.conf --maxmemory 2gb --daemonize no
    networks:
      codis-net:
        ipv4_address: 172.19.0.61
    ports:
      - “36381:6379”
    volumes:
      - “./data/g2-m1:/data”
    deploy:
      resources:
        limits:
          memory: 2.5G

  codis-server-g2-s1:
    image: codis/codis:3.2
    container_name: codis-server-g2-s1
    restart: unless-stopped
    command: codis-server /codis/redis.conf --maxmemory 2gb --daemonize no --slaveof codis-server-g2-m1 6379
    networks:
      codis-net:
        ipv4_address: 172.19.0.62
    ports:
      - “36382:6379”
    volumes:
      - “./data/g2-s1:/data”
    depends_on:
      - codis-server-g2-m1
    deploy:
      resources:
        limits:
          memory: 2.5G

networks:
  codis-net:
    external: true
    name: codis-net

这个Compose文件定义了完整的集群。注意几个细节:

  • 我们为每个服务在codis-net网络中指定了静态IP,便于管理和查看。
  • codis-server的Slave节点通过--slaveof参数指定了Master,建立了主从复制。
  • 通过deploy.resources.limits限制了容器的CPU和内存使用,这是生产环境的好习惯。
  • Proxy和Server都使用了codis/codis:3.2这个官方镜像,它包含了所有必要的二进制文件。

4. 启动集群与初始化配置

一切就绪,现在可以启动集群了。

# 进入项目目录
cd codis-docker-deploy

# 启动所有服务(-d 后台运行)
docker-compose up -d

# 查看启动日志,确保所有容器状态为“Up”
docker-compose ps

如果一切正常,你会看到所有容器的状态都是“Up”。接下来,我们需要通过Codis-FE的Web界面来完成集群的最终初始化。这是将分散的组件“粘合”成一个可用集群的关键步骤。

  1. 访问管理界面:打开浏览器,访问 http://你的宿主机IP:39090。你应该能看到Codis-FE的登录页面(默认无密码,直接登录)。
  2. 选择/创建产品:登录后,点击左上角的“+”号,新建一个产品(Product),名称与我们配置文件中product = “codis-demo”保持一致。然后选中这个产品进入集群管理页。
  3. 添加Proxy:进入后,在“Proxy”标签页,你应该能看到两个Proxy实例(codis-proxy-1和codis-proxy-2),状态可能是“离线”。这是因为它们刚启动,还未被Dashboard完全接管。等待十几秒或点击“刷新”按钮,状态应变为“在线”。

    避坑指南2:Proxy状态一直离线 如果Proxy长时间处于离线状态,请检查:

    • Dashboard容器日志:docker logs codis-dashboard
    • Proxy容器日志:docker logs codis-proxy-1
    • 最常见的原因是dashboard_addr配置错误(无法连接Dashboard),或者host_proxy地址不可达(网络问题)。
  4. 创建Group并添加Server:
    • 切换到“Group”标签页。此时列表为空。
    • 点击“New Group”按钮,输入Group ID为“1”,再次点击确认,创建Group-1。
    • 在Group-1的行中,找到“Add Server”输入框。输入Master节点的地址。注意:这里要填容器网络内的地址,即codis-server-g1-m1:6379。点击“Add Server”。
    • 同样地,在下一行输入Slave节点的地址:codis-server-g1-s1:6379,添加到同一个Group。
    • 重复以上步骤,创建Group-2,并添加codis-server-g2-m1:6379(Master)和codis-server-g2-s1:6379(Slave)。
  5. 初始化Slot:切换到“Slot”标签页。你会看到1024个Slot的状态都是“offline”。我们需要将它们分配给两个Group。
    • 最快捷的方式是点击页面顶部的“Rebalance All Slots”按钮。系统会自动、均匀地将1024个Slot分配给Group-1和Group-2。
    • 分配完成后,所有Slot的状态会变为“online”。

至此,一个拥有两个数据分片(Group)、每个分片一主一从、前端由两个Proxy负载均衡的Codis集群就完全搭建好了。

5. 客户端连接测试与生产环境调优建议

现在,让我们用最简单的redis-cli测试一下集群是否工作正常。

# 连接任意一个Proxy的业务端口(使用宿主机的映射端口)
redis-cli -h 你的宿主机IP -p 21080

# 在redis-cli中执行命令
127.0.0.1:21080> set test_key “hello_codis”
OK
127.0.0.1:21080> get test_key
“hello_codis”
127.0.0.1:21080> info
# 你会看到返回的信息显示这是一个“Codis-Proxy”,而不是普通的Redis。

测试成功!你的应用程序现在可以使用任何支持Redis协议的客户端(如Jedis、Lettuce、go-redis等),像连接单点Redis一样连接Proxy的地址(宿主机IP:21080或:21081)进行操作。

生产环境调优与进阶考量:

  1. 高可用部署:

    • ZooKeeper集群:上述示例使用了单点ZooKeeper,这是单点故障源。生产环境必须部署至少3节点的ZooKeeper集群。
    • 多Dashboard:虽然Dashboard本身是无状态的,但它是管理入口。可以考虑部署多个Dashboard实例,配合负载均衡器,或者至少保证能快速重建。
    • Proxy数量:根据客户端连接数和吞吐量需求,动态调整Proxy数量。通常建议至少2个以实现负载均衡和故障转移。
  2. 监控与告警:

    • Codis-FE界面提供了基本的监控,但不适合自动化告警。需要将关键指标(如Proxy QPS、延迟、后端Server内存使用率、连接数等)接入Prometheus + Grafana体系。
    • 关键的监控项包括:
      • Proxy的codis_proxy_online状态
      • Slot的迁移状态
      • 各Group主从同步延迟(master_repl_offset 和 slave_repl_offset)
      • 内存使用率,避免触发maxmemory策略导致写失败。
  3. 数据迁移与扩容:

    • 当数据增长需要新增Group时,可以在FE上轻松操作。新增Group -> 添加Server -> 通过“Slots Migrate”功能,从现有Group中迁移一部分Slot到新Group。整个过程在线进行,对应用影响很小。
    • 避坑指南3:迁移期间性能抖动

    数据迁移本质上是将某个Slot的键从一个Server批量迁移到另一个Server。迁移期间,对该Slot的读写会有短暂阻塞或延迟。建议在业务低峰期进行,并控制单次迁移的Key数量(通过FE界面设置)。

  4. 配置参数优化:

    • backend_*_timeout:根据网络状况和后端Server负载调整超时时间。内网环境下可以适当调低。
    • session_max_pipeline:对于大量使用pipeline的客户端,可以适当调高此值以提升吞吐。
    • Codis-Server的maxmemory:务必设置,并预留一部分内存(比如20%)给系统和其他开销,防止内存溢出导致进程被系统杀死。
  5. 客户端最佳实践:

    • 使用连接池,并合理设置池大小。
    • 实现Proxy列表的自动发现与故障转移。可以使用官方推荐的Jodis(基于ZooKeeper的Java客户端),或者定期从ZooKeeper中拉取可用的Proxy列表。
    • 避免使用Codis不支持的命令,如KEYS *(在分布式环境下行为不确定)、事务MULTI/EXEC(Codis不支持跨Key事务)。

最后,记得定期备份你的数据。虽然Codis-Server支持RDB和AOF持久化,但在分布式环境下,备份策略需要考虑多个节点。一种可行的方案是定期在从节点上执行SAVE或BGSAVE,然后将RDB文件归档到对象存储中。

Codis 3.2 高可用实战:基于 Docker 部署与故障切换的3个关键步骤 本文详细介绍了基于Docker部署Codis 3.2高可用集群的实战步骤,包括容器化集群部署、故障模拟与自动切换、生产级优化配置等关键环节。通过三节点拓扑结构和Redis主从复制机制,实现分布式Redis解决方案的高可用性和水平扩展能力,适用于电商秒杀、实时风控等高并发场景。 阅读详情

相关推荐

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2632

【实战指南】1.7 Redis 之 Codis 集群部署与性能优化

本文详细介绍了Redis Codis集群的部署与性能优化实战指南。从部署前的硬件配置、软件环境准备,到源码编译安装和Docker部署方案,再到核心组件协作与数据分片机制解析,最后提供关键参数调优、监控告警设置等性能优化技巧,帮助开发者高效搭建和管理Codis集群。

weixin_29065791的博客 433

支付宝周期扣款实战:从签约到主动扣款的完整Java代码与避坑指南

本文详细介绍了支付宝周期扣款功能的完整Java实现流程,从协议签约到主动扣款的各个环节,包括业务模型设计、签约接口实现、异步通知处理、主动扣款技术等关键步骤。针对开发中常见的陷阱和问题,提供了实用的避坑指南和代码示例,帮助开发者高效实现连续支付功能,提升用户留存率。

weixin_27199085的博客 375

docker-compose部署redis

将本地的 ./config/redis.conf 文件挂载到 Redis 容器中的 /config目录下。最后,使用 command 指令指定 Redis 启动时使用挂载的配置文件。它允许您定义一组容器,这些容器组成一个完整的应用程序,且这些容器之间可以互相通信。通过Docker Compose,您可以使用一个单独的文件来定义应用程序的。将"service-name"替换为您想要启动的服务的名称。进入容器,配置文件已经生效,并且生成了aof的配置文件。5、前台启动redis,可以看到启动的一下日志。

Azj12345的博客 9662

BUCK降压斩波电路设计实战:从IGBT选型到续流二极管优化

本文详细解析了BUCK降压斩波电路的设计实战,从IGBT选型到续流二极管优化,涵盖了关键参数设计、调试技巧及电磁兼容问题解决方案。通过实际案例和数据对比,帮助工程师高效完成DC-DC转换电路设计,提升系统性能和可靠性。

weixin_29253711的博客 95

小米CyberGear微电机驱动代码(CAN总线驱动,含开源地址)

小米CyberGear微电机驱动代码(ROS下的CAN总线驱动,含开源地址)

2302_80751833的博客 4444

Codis容器化终极指南:Docker Compose一键部署与集群管理

Codis是一个分布式Redis解决方案,通过Docker容器化部署可以显著简化集群搭建与管理流程。本文将带你快速掌握Codis容器化部署的完整流程,从环境准备到集群监控,让你轻松上手这个强大的分布式缓存系统。 ## 为什么选择Codis容器化部署? Codis作为Redis集群的企业级解决方案,提供了数据分片、自动扩容和故障转移等核心功能。通过Docker容器化部署,你可以获得: - **环

gitblog_00639的博客 875

安检机图像处理避坑指南:从条纹校正到物质分类,那些论文里没写的工程细节

本文深入探讨了双能X射线安检机图像处理中的关键工程实践,从条纹校正到物质分类,揭示了论文中未提及的实用技巧。针对探测器校正、物质分类模糊、伪彩色系统设计等核心问题,提供了动态参数更新、空间上下文分析和自适应色彩映射等解决方案,助力提升安检系统的准确性和鲁棒性。

weixin_30325487的博客 889

基于docker的codis集群

codis:定义: Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一...

lethez的博客 1298

把静态前端托管进 SAP BTP:HTML5 Application Deployer 与企业级内容部署全攻略

本文介绍了在SAP BTP Cloud Foundry环境中使用HTML5 Application Repository托管前端静态资源的工程化实践。通过HTML5 Application Deployer工具,结合MTA描述、路由配置和服务实例,实现前后端解耦和标准化部署。文章详细阐述了目录结构、关键配置文件、MTA编排以及构建部署流程,并针对大体积前端资源提供了GACD和异步上传两种解决方案。最后说明了如何与AppRouter协同工作,使部署内容可供终端用户访问。这套方法使前端更新无需重启后端,支持团队

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 157

高级数据结构之R树(R-tree)

R树(R-tree)是一种将B树扩展到多维情况下得到的数据结构,它最初由Antonin Guttman于1984年提出。B树的结点中会存储一个键的集合,这些键把线分成片段,沿着那条线的点仅属于一个片段。因此,B树使得我们可以很容易地找到点。如果把沿线各处的点表示成B树结点,我们就能够确定点所属唯一子结点,在那里可以找到该点。 Antonin Guttman在他提出R树的经典论文中给出的R树例子...

白马负金羁 1万+

zookeeper集群的docker-compose.yml

以备后用 version: '2' services: zk1: image: zookeeper restart: always container_name: zk1 ports: - "2181:2181" environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zk1:2...

MARKPAIN的专栏 1377

ExpressLRS(ELRS)接收机技术全景:从历史演进、技术底层到产业生态全解析——上

ExpressLRS(ELRS)是一种由全球开源社区驱动的双向射频遥控链路协议栈,其接收机作为核心终端,承担信号接收解调、遥控指令解析、飞控数据交互与遥测回传等关键功能。自2018年问世以来,ELRS凭借极致性能、低成本、开放生态和强兼容性,从航模DIY方案发展为消费级无人机领域的事实标准,并逐步渗透工业级场景。 ELRS接收机采用模块化分层架构,支持2.4GHz和900MHz双频段,通过LoRa、FLRC、FSK多调制模式实现低延迟与远距离平衡。其核心技术包括自适应跳频抗干扰、TDD双向链路和极简数据包。

bother3000的博客 304

docker部署codis

这个实验是以docker为基础的,所以docker环境必须是ok的 1、启动zookeeper服务 在启动codis相关服务之前必须先开启zookeeper或者etcd服务 docker run -d -p 2181:2181 jplock/zookeeper 我当前测试机容器宿主机ip为172.25.27.2 测试zookeeper服务 ./zkCli.sh -server 1...

SS_CC_Go的博客 593

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

10分钟搭建Codis分布式集群:Docker开发环境标准化实践

Codis是一个基于代理的Redis集群解决方案,支持管道和动态扩展,能够帮助开发者轻松构建高可用的分布式Redis服务。本文将详细介绍如何使用Docker快速搭建Codis分布式集群,实现开发环境的标准化,让你在10分钟内完成从环境准备到集群部署的全过程。 ## 一、Codis核心架构解析 Codis的架构设计旨在提供高性能、高可用的Redis集群服务。其主要组件包括Codis-Proxy、

gitblog_00059的博客 974

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

基于Docker部署codis

基于Docker部署codis本文章简单介绍基于docker来部署codis.关于codis相关资料请查看 github codis项目 codis中文手册目录文章基于github官方部署顺序进行基于Docker部署codis 目录 启动zookeeper服务 部署dashboard 初始化 slots 启动 Redis数据库 添加 Redis Server Group 设置 server gr

沈首二 3170

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于Codis的Redis分布式缓存实现

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 , 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。Codis不

路漫漫,水迢迢 8953

Codis 3.2 生产环境部署:基于Docker Compose编排5个核心组件

本文详细介绍了Codis 3.2在生产环境中的容器化部署方案,基于Docker Compose编排5个核心组件(Dashboard、Proxy、Server Group、FE和ZooKeeper)。通过实战指南展示配置细节、网络拓扑规划、数据持久化策略及生产级编排实现,帮助开发者高效部署Redis集群解决方案。

weixin_30899023的博客 260

【入门篇】1.7 Redis 之 codis 入门介绍

Codis是由Wandou Labs(豌豆荚团队)开发的开源工具,用于解决在大数据环境下使用Redis所面临的挑战。Codis将多个Redis实例组织起来,形成一个统一的数据访问层,从而提供了高可用和分布式的特性,使得Redis能够更好地处理大数据和高并发的场景。Codis的功能是基于Redis构建的。Redis是一种内存数据库,用于存储键值对数据。然而,当数据量或并发请求数量增长时,单个Redis实例可能会遇到性能瓶颈。Codis通过在多个Redis实例之间进行数据分片,解决了这个问题。

日拱一卒无有尽,功不唐捐终入海 2993

Redis Cluster 高可用集群(Docker 实现)

本文使用Docker部署实现于同一台服务器,Redis 版本 5.0.3 单机存在的问题 机器故障:导致Redis失效 容量瓶颈:容量不能水平扩展 OPS( operation per second 每秒处理指令数):一台及其的网络带宽是有限的,如果有多台机器,可以有效解决QOS Redis Cluster Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施install...

矢落叶の博客 1万+

Pika容器化部署终极指南:Docker与Kubernetes实战教程

Pika是由奇虎360基础架构团队开发的兼容Redis协议的NoSQL数据库,以其高性能和可靠性在众多企业级应用中脱颖而出。本指南将带你深入了解如何通过Docker和Kubernetes实现Pika的现代化容器化部署,从单机环境到生产级集群的完整解决方案。 ## 🚀 快速开始:单机Docker部署 Pika项目提供了完整的Docker支持,让你能够快速启动一个单机实例。首先确保你已安装Doc

gitblog_07436的博客 452

Codis深度解析:从架构原理到生产环境部署的完整指南

Codis作为基于代理的高性能Redis集群解决方案,在分布式缓存领域占据重要地位。本文将深入剖析Codis的核心架构、版本升级策略以及生产环境的最佳实践,帮助有经验的技术用户掌握这一强大的分布式Redis解决方案。 ## 技术演进背景与核心价值 ### 为什么选择Codis而非原生Redis Cluster? Codis的设计初衷是解决原生Redis Cluster在客户端兼容性、运维复杂

gitblog_01064的博客 470

docker 部署 Redis Cluster 集群

docker 部署 Redis Cluster 集群

会飞的小蜗 912

【微服务部署】十、使用Docker Compose搭建高可用Redis集群

现如今,业务系统对于缓存Redis的依赖似乎是必不可少的,我们可以在各种各样的系统中看到Redis的身影。考虑到系统运行的稳定性,Redis的应用和MySQL数据库一样需要做到高可用部署。

全栈程序猿的专栏 2343

阿里云ECS生产级Redis部署避坑指南:内核调优+源码编译+ACL安全加固

Redis作为主流内存数据库,其高性能依赖于操作系统内核、内存管理、网络栈与持久化机制的深度协同。在阿里云Linux服务器(如Alibaba Cloud Linux 3、CentOS 7/8)上,常见故障如缓存雪崩、OOM Killer杀进程、连接超时等,并非Redis本身缺陷,而是系统层配置失配所致——典型如transparent huge pages未禁用、vm.swappiness未置0、cgroup v2下memory.max缺失、bind与protected-mode双重限制等。本文聚焦生产环境落

weixin_30621959的博客 361

redis 哨兵 异步_Docker部署Redis集群----第十一节(docker-redis哨兵集群总结)

本来是计划开始新篇章redis-cluster集群的,但是总觉得缺点什么,所以本篇章对前两个篇章做一个总结来引流我们接下来的集群。哨兵节点常见的问题:哨兵集群在发现master node挂掉后会进行故障转移,也就是启动其中一个slave node为master node。在这过程中,可能会导致数据丢失的情况。1、异步复制导致数据丢失:因为master->slave的复制是异步,所以可能有部分...

weixin_28911533的博客 99
上一篇: DoRA vs LoRA:模型微调新选择?手把手教你如何选择适合的微调方法
下一篇: Android开机慢?F2FS文件系统这个flag可能是罪魁祸首(附修复方案)
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值