转(http://www.jianshu.com/p/f8e968e57863)

一. 应用场景

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

  • 高性能
    单机引擎可以达到5-10W qps
  • 数据结构全面,支持快速开发业务
    string,list,set,sorted set, hashes

问题:

  • 存储容量受限单机最大容量即为单机内存最大容量
  • 单机数据的持久化依赖aof和rdb机制,如果机器整个down掉,服务不可用

二. redis集群选型

正是由于单机redis引擎有着这样的问题,所以,基本每个互联网公司都有自己的redis集群化方案。

  • 在redis客户端lib中实现数据的分片并主从部署redis实例
    优点:简单,性能损耗小
    缺点:扩容方案复杂
  • 集群化候选方案

    1、NetFlix对Dynamo的开源通用实现Dynomite
    Dynomite是NetFlix对亚马逊分布式存储引擎Dynamo的一个开源通用实现,使用C/C++语言编写、以代理的方式实现的Redis缓存集群方案。Dynomite不仅能够将基于内存的Redis和Memcached打造成分布式数据库,还支持持久化的MySQL、BerkeleyDB、LevelDB等数据库,并具有简单、高效、支持跨数据中心的数据复制等优点。Dynomite的最终目标是提供数据库存储引擎不能提供的简单、高效、跨数据中心的数据复制功能。Dynomite遵循Apache License 2.0开源协议发布,更多关于Dynomite的信息请查看NetFlix技术博客对Dynomite的介绍。
    2、Twitter的Redis/Memcached代理服务Twemproxy
    Twemproxy是一个使用C语言编写、以代理的方式实现的、轻量级的Redis代理服务器,它通过引入一个代理层,将应用程序后端的多台Redis实例进行统一管理,使应用程序只需要在Twemproxy上进行操作,而不用关心后面具体有多少个真实的Redis或Memcached实例,从而实现了基于Redis和Memcached的集群服务。当某个节点宕掉时,Twemproxy可以自动将它从集群中剔除,而当它恢复服务时,Twemproxy也会自动连接。由于是代理,所以Twemproxy会有微小的性能损失。根据 Redis作者的测试结果,在大多数情况下,Twemproxy的性能相当不错,同直接操作Redis相比,最多只有20%的性能损失。Twemproxy遵循Apache License 2.0开源协议发布,更多关于Twemproxy的信息请登录其在GitHub的主页查看。
    3、豌豆荚的 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 协议, 表现得和一个原生的 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 作为一个 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 都会有一个特定的 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 是可以动态水平扩展的, 理论上的性能瓶颈应该是百万级别的

使用Codis搭建redis集群服务的更多相关文章

  1. 基于 twemproxy 搭建 redis 集群

    概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...

  2. Windows下搭建Redis集群

    Redis集群: 如果部署到多台电脑,就跟普通的集群一样:因为Redis是单线程处理的,多核CPU也只能使用一个核, 所以部署在同一台电脑上,通过运行多个Redis实例组成集群,然后能提高CPU的利用 ...

  3. Redis集群搭建(转自一菲聪天的“Windows下搭建Redis集群”)

    配置Redis参考:http://blog.csdn.net/zsg88/article/details/73715947 使用Ruby配置集群参考:https://www.cnblogs.com/t ...

  4. Windows 环境搭建Redis集群(win 64位)

    转: http://blog.csdn.net/zsg88/article/details/73715947 参考:https://www.cnblogs.com/tommy-huang/p/6240 ...

  5. centos6搭建redis集群搭建(单机多节点)

    一.安装redis 1.安装gcc环境 yum install gcc-c++ 2.下载源码包并解压 wget http://download.redis.io/releases/redis-3.2. ...

  6. 手动搭建 redis 集群

    转自http://meia.fun/article/1544161420745 手动搭建 redis 集群 redis 基本命令: 启动 redis 服务:redis-server xxx.conf ...

  7. Windows下 搭建redis集群

    Windows下搭建redis集群教程 一,redis集群介绍 Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用的情况,也防止了主 ...

  8. Windows 环境搭建Redis集群

    环境以及引用资料 1.windows server 2008 r2 enterprise  (木有办法,公司的服务器全是如此,就这种环境搭建吧) 2.redis官方资料下载: https://redi ...

  9. windows环境下搭建Redis集群

    转载请注明出处,原文章地址: https://www.cnblogs.com/tommy-huang/p/6240083.html Redis集群: 如果部署到多台电脑,就跟普通的集群一样:因为Red ...

随机推荐

  1. js keycode大全

    JS KeyCode数字对应键盘以及应用大全   时间:2014-07-11 10:37    点击:851次 keycode    8 = BackSpace BackSpacekeycode    ...

  2. Data Abstraction

    What is an object? (Page 238) In C++, an object is just a variable, and the purest definition is &qu ...

  3. Java学习----finally块

    public class Test { String x; public static void main(String[] args) { Test test = new Test(); try { ...

  4. Bad owner or permissions on .ssh/config

    Bad owner or permissions on $HOME/.ssh/config The ssh with RHEL 4 is a lot more anal about security ...

  5. easy ui tree 取父节点的值和取蓝色框的值

    var nodes = $('#basetree').tree('getChecked'); var cnode = ''; var fnode = ''; for ( var i = 0; i &l ...

  6. chkconfig-增加一个服务设置服务自启动

    参考 http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796873.html 如何增加一个服务: 1.服务脚本必须存放在/etc/ini ...

  7. 使用SourceTree将bitbucket的远程仓库回滚到某一次提交-b

    目的: 使用SourceTree将bitbucket的远程仓库回滚到某一次提交. 原理: 在本地需要回滚的commit上创建一个分支,将该分支合并到远程仓库. 准备: 远程仓库有一个master主分支 ...

  8. ruby定时脚本

    ruby定时脚本的实现涉及到三个方面: 要定时执行的代码 定时控制(设置定时的时间) 将脚本后台化 实例: # in func.rb def func # the function body goes ...

  9. 【产品体验】ONE一个

    第二篇博客,加油加油~~本人产品新人,学习中,希望大家多多指教!  先来两张ONE的界面图镇楼——        ONE简介: “复杂世界里,一个就够了.”这是一款轻量级的文艺阅读应用,每日更新一张图 ...

  10. PHP 之 Laravel 框架安装及相关开源软件

    Laravel 被称为简洁.优雅的PHP开发框架,但第一次接触此框架的人有不少都卡在了安装上,其实在 Linux 下只需要很简单的几步就可以搞定,这里我们以 CentOS 下 PHP + Nginx ...