利用Codis搭建redis集群服务

一. 行使场景

redis 作为数据结构存储引擎,有着许多优点

  • 高性能
    单机引擎可以高达5-10W qps
  • 数据结构周密,支持高速支付工作
    string,list,set,sorted set, hashes

问题:

  • 积存体量受限单机最大容积即为单机内存最大体积
  • 单机数据的持久化重视aof和rdb机制,如若机器整个down掉,服务不可用

二. redis集群选型

正是出于单机redis引擎有着那样的题材,所以,基本每种网络商家都有谈得来的redis集群化方案。

  • 在redis客户端lib中贯彻多少的分片并着力安顿redis实例
    可取:不难,质量损耗小
    缺点:扩容方案复杂
  • 集群化候选方案

① 、NetFlix对Dynamo的开源通用达成Dynomite
Dynomite是NetFlix对亚马逊(Amazon)分布式存储引擎Dynamo的贰个开源通用完成,使用C/C++语言编写、以代办的点子贯彻的Redis缓存集群方案。Dynomite不仅可以将依照内存的Redis和Memcached营造成分布式数据库,还帮助持久化的MySQL、贝克雷DB、LevelDB等数据库,并持有简易、高效、资助跨数据大旨的数额复制等优点。Dynomite的最后目标是提供数据库存储引擎无法提供的简易、高效、跨数据大旨的多寡复制效用。Dynomite坚守Apache
License
2.0开源协议发表,更加多关于Dynomite的音讯请查看NetFlix技术博客对Dynomite的牵线。
② 、推文(Tweet)的Redis/Memcached代理服务Twemproxy
Twemproxy是一个运用C语言编写、以代办的法门贯彻的、轻量级的Redis代理服务器,它通过引入二个代理层,将应用程序后端的多台Redis实例举行联合保管,使应用程序只须求在Twemproxy上举行操作,而不用关爱前边具体有稍许个忠实的Redis或Memcached实例,从而完毕了按照Redis和Memcached的集群服务。当某些节点宕掉时,Twemproxy可以自行将它从集群中删去,而当它过来服务时,Twemproxy也会活动一连。由于是代理,所以Twemproxy会有微小的天性损失。依据Redis作者的测试结果,在大部景况下,Twemproxy的质量杰出不错,同直接操作Redis比较,最几唯有2/10的习性损失。Twemproxy遵从Apache
License
2.0开源协议发布,越多关于Twemproxy的新闻请登录其在GitHub的主页查看。
叁 、豌豆荚的 Redis 集群消除方案Codis
Codis是豌豆荚使用Go和C语言开发、以代办的点子完结的二个Redis分布式集群化解方案,且完全合作Twemproxy。Twemproxy对于上一层的施用来说,
连接Codis
Proxy(Redis代理服务)和再而三原生的Redis服务器并未明显的分别,上一层应用可以像使用单机的
Redis一样对待。Codis底层会处理请求的转折、不停机的多少迁移等工作,
全体底层的百分百处理,
对于客户端的话是晶莹的。同理可得,可以回顾的觉得后台连接的是贰个内存无限大的Redis服务。Codis遵从MIT开源协议公布,更加多关于Codis的音信请登录其在GitHub的主页查看。
别的,还有一部分未开源的消除方案,比如新浪、百度、天猫、腾讯等的Redis集群方案。在Redis官方正式生产可用于生产条件的集群方案前,以上两种方案是老大值得考虑在生养条件使用的方案。

三. 豌豆荚Codis

优点:

  • codis-proxy基于GO和C语言,并发处理能力强大
  • 后端基于slot概念资助灵活,对用户透明的扩容和缩容操作,甚至一键式auto
    rebalance
  • 依照zookeeper提供了高可用的codis-proxy代理服务
  • 集群管理工具丰富:页面和指令行工具集,如:redis-port可以将老集群(redis单机或twemproxy集群)中数量便宜的动迁导入至Codis

完整架构

Codis全部架构

Codis 由四局地构成:

  • Codis Proxy (codis-proxy)
    codis-proxy 是客户端连接的 Redis 代理服务, codis-proxy 自身达成了
    Redis 协议, 表现得和1个原生的 Redis 没什么差异 (就像 Twemproxy),
    对于二个事务以来, 可以配备四个 codis-proxy, codis-proxy
    自个儿是无状态的.
  • Codis Manager (codis-config)
    codis-config 是 Codis 的管理工具, 帮忙包含, 添加/删除 Redis 节点,
    添加/删除 Proxy 节点, 发起数据迁移等操作. codis-config
    自己还自带了二个 http server, 会运转一个 dashboard,
    用户可以间接在浏览器上观测 Codis 集群的周转状态.
  • Codis Redis (codis-server)
    codis-server 是 Codis 项目维护的一个 Redis 分支, 基于 2.8.13 开发,
    参预了 slot 的支撑和原子的多寡迁移指令. Codis 上层的 codis-proxy 和
    codis-config 只好和这几个版本的 Redis 交互才能健康运营.
  • ZooKeeper
    Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元新闻,
    codis-config 发起的吩咐都会经过 ZooKeeper 同步到各类存活的
    codis-proxy.

若是希望有更简便的访问方式和更高的安澜:可以动用搭建HAProxy,不过会愈来愈充实延迟。

设置&管理集群
小心坚守如下顺序陈设运行集群

  1. 启动 dashboard *, 执行 ../bin/codis-config dashboard,
    该命令会运行 dashboard *
  2. 起先化 slots , 执行 ../bin/codis-config slot
    init,该命令会在zookeeper上创制slot相关音信
  3. 启航 Codis Redis , 和合法的Redis Server参数一样
  4. 累加 Redis Server Group , 每二个 Server Group 作为1个 Redis
    服务器组存在, 只允许有三个 master, 可以有多个 slave, group id
    仅扶助胜出等于1的整数
    $ ../bin/codis-config server -h usage:
    codis-config server list
    codis-config server add <group_id> <redis_addr>
    <role>
    codis-config server remove <group_id> <redis_addr>
    codis-config server promote <group_id>
    <redis_addr>
    codis-config server add-group <group_id>
    codis-config server remove-group <group_id>
    如: 添加八个 server group, 逐个 group 有七个 redis
    实例,group的id分别为1和2, redis实例为一主一从。
    增进三个group,group的id为1, 并添加三个redis master到该group
    $ ../bin/codis-config server add 1 localhost:6379 master
    累加一个redis slave到该group
    $ ../bin/codis-config server add 1 localhost:6380 slave
    类似的,再添加group,group的id为2
    $ ../bin/codis-config server add 2 localhost:6479 master
    $ ../bin/codis-config server add 2 localhost:6479 slave
  5. 安装 server group 服务的 slot 范围 Codis 接纳 Pre-sharding
    的技艺来落实数量的分片, 暗中认同分成 1024 个 slots (0-1023),
    对于每种key来说, 通过以下公式明确所属的 Slot Id : SlotId =
    crc32(key) % 1024 每贰个 slot 都会有1个特定的 server group id
    来表示这一个 slot 的多寡由哪些 server group 来提供.
    $ ../bin/codis-config slot -h
    usage:
    codis-config slot init
    codis-config slot info <slot_id>
    codis-config slot set <slot_id> <group_id>
    <status>
    codis-config slot range-set <slot_from> <slot_to>
    <group_id> <status>
    codis-config slot migrate <slot_from> <slot_to>
    <group_id> [–delay=<delay_time_in_ms>]
    如:
    安装编号为[0, 511]的 slot 由 server group 1 提供劳务, 编号
    [512, 1023] 的 slot 由 server group 2 提供服务
    $ ../bin/codis-config slot range-set 0 511 1 online
    $ ../bin/codis-config slot range-set 512 1023 2 online
  6. 启动 codis-proxy
    ../bin/codis-proxy -c config.ini -L ./log/proxy.log –cpu=8
    –addr=0.0.0.0:19000 –http-addr=0.0.0.0:11000
    刚运转的 codis-proxy 默许是处于 offline状态的, 然后装置 proxy 为
    online 状态, 唯有处于 online 状态的 proxy 才会对外提供劳动
    ../bin/codis-config -c config.ini proxy online <proxy_name>
    <—- proxy的id, 如 proxy_1
  7. 打开浏览器
    http://localhost:18087/admin
    方今可以在浏览器里面完毕种种操作了, 玩得热情洋溢

性能
8 core Xeon 2.10GHz, 三四线程的 benchmark, 单 proxy 的 ops 是 12w. 而且
proxy 是可以动态水平伸张的, 理论上的属性瓶颈应该是百万级其余