大规模Redis集群解决方案

1.为什么要使用Redis集群

一般的,为了提升网站及其他网络应用的响应能力,会将经常访问的数据进行缓存起来,而不是直接从后端数据库里面进行读取。而目前市场上,Redis则是Cache的一个很好的解决方案,使用和部署很简单,性能也非常不错。但由于它是单线程单实例的服务,在数据量达到很大时处理上就会显得力不从心。基本上一个大型网站应用,经常访问的一些数据是很大的,几十G甚至百G都是很正常的,在这种场景下,单个Redis实例已经无法处理这种数据量了。所以Redis集群的解决方案的由此而生,目前市场上主要使用的有两种,一个是Redis官方的 Redis Cluster; 另外一个是 twtter 的twemproxy。第一个据笔者所知,用的貌似不是很多,大部分还是用的 twemproxy。twemproxy 项目代码已经开源了,代码可以在github上找到。它是一个单线程服务,能管理多个Redis或者Memcache实例,笔者研究过也测试过它的功能和性能,发现单线程始终存在性能瓶颈。于是我们开发组以高并发多线程为目标,实现了一款基于Redis协议的中间件,能够实现集群的搭建和管理,并且具备大部分常用功能外也具备可观的性能,它的名字叫 OneCache。目前已经在github上进行了开源。目前已经有不少用户上线使用,我们认定它是一个比较好Redis集群的解决方案。


2. OneCache 功能点

1.高并发性

测试时使用了多个redis-benchmark对onecache进行测试,每秒并发量可达40w+/每秒(因机器性能而异)

支持前后端pipeline处理,每秒并发量可达百万以上(前端采用Pipeline测试)

2.完整的Redis命令支持

支持大部分redis命令

自带内置命令。例如查看当前状态、所支持的命令等等

3.兼容twemproxy

原先使用twemproxy的应用现在可以迁移到onecache上

4.通过代理的方式减少缓存服务器的连接数

保持与Redis的长连接

连接可复用性

可设置代理与每个Redis的连接数目

5.RedisServerGroup模型

Group内可配置若干Master 和 Slave,支持不同的策略模式

每个Group可以动态配置散列范围、可以配置特定的KEY路由到该Group

自动分片到后端多个Redis实例上

使用散列方式将数据以Key的值进行散列化

可以控制后端实例的权重

6.详细的状态监控

实时代理运行状态

实时后端节点运行状态

实时客户端连接状态

TopKey统计

连接池状态查看

7.高可用性

可部署多个OneCache以防止单台主机故障,使用VIP方式实现

Group不可用时可以自动移除,采用一致性HASH算法调整HASH槽


3.软件安装与配置

1.下载软件。软件只有一个可执行文件 onecache。可以在http://www.onexsoft.com/下载,或者在github上下载源码自行编译。

2.启动软件。软件启动只依赖一个配置文件(XML格式)。命令格式: onecache [cfg-file] 。如果未指定配置文件路径名,默认会以当前目录下的onecache.xml做为配置,如果配置参数中有不正确的地方,软件将会报错,具体出错原因可以查看输出的日志信息。
这是一个典型的配置文件格式
<onecache port="8221" thread_num="15" hash_value_max="80" daemonize="0" guard="0" log_file="" password="" pid_file="" hash=" fnv1a_64" twemproxy_mode="0" debug="0">
    <!--port 运行端口-->
    <!--thread_num 线程数-->
    <!--hash_value_max 哈希槽个数(最大不得超过1024)-->
    <!--daemonize 表示是否后台运行 1=YES 0=NO-->
    <!--guard 表示是否启用守护进程 1=YES 0=NO-->
    <!--log_file 表示输出的日志文件路径-->
    <!--password onecache密码,客户端需要auth命令进行验证-->
<!--pid_file pid文件路径 -->
<!--hash hash方法名称,可以为空 -->
<!—twemproxy_mode 是否按twemproxy模式运行 注:只支持ketama方式,groupname对应servername-->
<!—debug 是否debug模式运行1=YES 0=NO debug模式将会得到更详细的运行日志,注:打印日志可能会很多,建议生产线上不要开启-->

    <vip if_alias_name="eth0:0" vip_address="172.30.12.8" enable="0"></vip>
    <!--VIP配置 if_alias_name表示适配器别名 vip_address 表示虚拟地址 enable 表示是否启用VIP功能 1:启用 0:禁用-->

    <top_key enable=" 0"></top_key>
    <!--是否启用TopKey统计功能1:启用 0:禁用-->

    <group_option backend_retry_interval="3" backend_retry_limit="10" auto_eject_group="1" group_retry_time="30" eject_after_restore="1"></group_option>
    <!--backend_retry_interval 表示后端断开后的重试连接的间隔时间-->
    <!--backend_retry_limit 表示后端重试连接的最大次数-->
    <!--auto_eject_group 表示是否启用Group不可用时自动移除 1=YES 0=NO-->
    <!--group_retry_time 表示Group的重试时间,超过后将会自动移除-->
    <!--eject_after_restore 表示摘除Group后,如果又变为可用状态,将会进行恢复 1=YES 0=NO-->

    <group name="group1" hash_min="0" hash_max="19" policy="master_only">
    <!--组名为 group1 哈希映射的范围为0~19 (包含0,19) 使用的策略为 master_only-->
        <host host_name="host1" ip="172.30.12.12" port="6379" master="1" password="" connect_num="50"></host>
        <host host_name="host1" ip="172.30.12.12" port="6380" master="0" password="" connect_num="50"></host>
        <!--host_name 表示主机别名-->
        <!--ip Redis服务器IP-->
        <!--port Redis服务器端口-->
        <!--master 是否主备 1:主 0:备-->
        <!--password 表示redis服务器的验证密码-->
<!—connect_num 表示连接到redis服务器的连接池大小-->
    </group>
    <group name="group2" hash_min="20" hash_max="39">
        <host host_name="host1" ip="172.30.12.12" port="6381" master="1"></host>
    </group>
    <group name="group3" hash_min="40" hash_max="59">
        <host host_name="host1" ip="172.30.12.12" port="6382" master="1"></host>
    </group>
    <group name="group4" hash_min="60" hash_max="79">
        <host host_name="host1" ip="172.30.12.12" port="6383" master="1"></host>
    </group>


    <!--配置HASH值到Group的映射关系-->
    <hash_mapping>
        <hash value="0" group_name="group1"></hash>
        <hash value="1" group_name="group1"></hash>
    </hash_mapping>
    <!--配置指定KEY到Group的映射关系-->
    <key_mapping>
        <key key_name="key1" group_name="group1"></key>
        <key key_name="key2" group_name="group2"></key>
    </key_mapping>
</onecache>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值