1
- ###Codis 是什么?
1
+ ### Codis 是什么?
2
2
3
3
Codis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务, 用户可以看成是一个无限内存的 Redis 服务, 有动态扩/缩容的能力. 对偏存储型的业务更实用, 如果你需要 SUBPUB 之类的指令, Codis 是不支持的. 时刻记住 Codis 是一个分布式存储的项目. 对于海量的 key, value不太大( <= 1M ), 随着业务扩展缓存也要随之扩展的业务场景有特效.
4
4
5
- ###使用 Codis 有什么好处?
5
+ ### 使用 Codis 有什么好处?
6
6
7
7
Redis获得动态扩容/缩容的能力,增减redis实例对client完全透明、不需要重启服务,不需要业务方担心 Redis 内存爆掉的问题. 也不用担心申请太大, 造成浪费. 业务方也不需要自己维护 Redis.
8
8
9
9
Codis支持水平扩容/缩容,扩容可以直接界面的 "Auto Rebalance" 按钮,缩容只需要将要下线的实例拥有的slot迁移到其它实例,然后在界面上删除下线的group即可。
10
10
11
- ###我的服务能直接迁移到 Codis 上吗?
11
+ ### 我的服务能直接迁移到 Codis 上吗?
12
12
13
13
分两种情况:
14
14
@@ -18,20 +18,20 @@ Codis支持水平扩容/缩容,扩容可以直接界面的 "Auto Rebalance"
18
18
2 ) 原来使用 Redis 的用户:
19
19
如果你使用了[ doc/unsupported_cmds] ( https://github.com/CodisLabs/codis/blob/master/doc/unsupported_cmds.md ) 中提到的命令,是无法直接迁移到 Codis 上的. 你需要修改你的代码, 用其他的方式实现.
20
20
21
- ###相对于twemproxy的优劣?
21
+ ### 相对于twemproxy的优劣?
22
22
codis和twemproxy最大的区别有两个:一个是codis支持动态水平扩展,对client完全透明不影响服务的情况下可以完成增减redis实例的操作;一个是codis是用go语言写的并支持多线程而twemproxy用C并只用单线程。
23
23
后者又意味着:codis在多核机器上的性能会好于twemproxy;codis的最坏响应时间可能会因为GC的STW而变大,不过go1.5发布后会显著降低STW的时间;如果只用一个CPU的话go语言的性能不如C,因此在一些短连接而非长连接的场景中,整个系统的瓶颈可能变成accept新tcp连接的速度,这时codis的性能可能会差于twemproxy。
24
24
25
- ###相对于redis cluster的优劣?
25
+ ### 相对于redis cluster的优劣?
26
26
redis cluster基于smart client和无中心的设计,client必须按key的哈希将请求直接发送到对应的节点。这意味着:使用官方cluster必须要等对应语言的redis driver对cluster支持的开发和不断成熟;client不能直接像单机一样使用pipeline来提高效率,想同时执行多个请求来提速必须在client端自行实现异步逻辑。
27
27
而codis因其有中心节点、基于proxy的设计,对client来说可以像对单机redis一样去操作proxy(除了一些命令不支持),还可以继续使用pipeline并且如果后台redis有多个的话速度会显著快于单redis的pipeline。同时codis使用zookeeper来作为辅助,这意味着单纯对于redis集群来说需要额外的机器搭zk,不过对于很多已经在其他服务上用了zk的公司来说这不是问题:)
28
28
29
- ###Codis是如何分片的?
29
+ ### Codis是如何分片的?
30
30
Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024。
31
31
32
32
每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供。数据的迁移也是以slot为单位的。
33
33
34
- ###Codis 可以当队列使用吗?
34
+ ### Codis 可以当队列使用吗?
35
35
36
36
可以, Codis 还是支持 LPUSH LPOP这样的指令, 但是注意, 并不是说你用了 Codis 就有了一个分布式队列. 对于单个 key, 它的 value 还是会在一台机器上, 所以, 如果你的队列特别大, 而且整个业务就用了几个 key, 那么就几乎退化成了单个 redis 了, 所以, 如果你是希望有一个队列服务, 那么我建议你:
37
37
@@ -40,51 +40,51 @@ Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024
40
40
3 . 监控好你的消费者, 当队列过长的时候, 及时报警.
41
41
4 . 可以将一个大队列拆分成多个小的队列, 放在不同的key中
42
42
43
- ###Codis 支持 MSET, MGET吗?
43
+ ### Codis 支持 MSET, MGET吗?
44
44
45
45
支持, 在比较早的版本中MSET/MGET的性能较差,甚至可能差过单机redis,但2.0开始会因为后台并发执行而比单机的mset/mget快很多。
46
46
47
- ###Codis 是多线程的吗?
47
+ ### Codis 是多线程的吗?
48
48
49
49
虽然Redis是单线程的,但Codis proxy 是多线程的(严格来说是 goroutine), 启动的线程数是 CPU 的核数, 是可以充分利用起多核的性能的。
50
50
51
- ###Codis 支持 CAS 吗? 支持 Lua 脚本吗?
51
+ ### Codis 支持 CAS 吗? 支持 Lua 脚本吗?
52
52
53
53
CAS 暂时不支持, 目前只支持eval的方式来跑lua脚本,需要配合TAG使用.
54
54
55
- ###有没有 zookeeper 的教程?
55
+ ### 有没有 zookeeper 的教程?
56
56
57
57
[ 请参考这里] ( http://www.juvenxu.com/2015/03/20/experiences-on-zookeeper-ops/ )
58
58
59
- ###Codis的性能如何?
59
+ ### Codis的性能如何?
60
60
61
61
见Readme中的[ Benchmark一节] ( https://github.com/CodisLabs/codis#performance-benchmark ) 。
62
62
63
- ###我的数据在 Codis 上是安全的吗?
63
+ ### 我的数据在 Codis 上是安全的吗?
64
64
65
65
首先, 安全的定义有很多个级别, Codis 并不是一个多副本的系统 (用纯内存来做多副本还是很贵的), 如果 Codis 底下的 redis 机器没有配从, 也没开 bgsave, 如果挂了, 那么最坏情况下会丢失这部分的数据, 但是集群的数据不会全失效 (即使这样的, 也比以前单点故障, 一下全丢的好...-_ -|||). 如果上一种情况下配了从, 这种情况, 主挂了, 到从切上来这段时间, 客户端的部分写入会失败. 主从之前没来得及同步的小部分数据会丢失.
66
66
第二种情况, 业务短时间内爆炸性增长, 内存短时间内不可预见的暴涨(就和你用数据库磁盘满了一样), Codis还没来得及扩容, 同时数据迁移的速度小于暴涨的速度, 此时会触发 Redis 的 LRU 策略, 会淘汰老的 Key. 这种情况也是无解...不过按照现在的运维经验, 我们会尽量预分配一些 buffer, 内存使用量大概 80% 的时候, 我们就会开始扩容.
67
67
68
68
除此之外, 正常的数据迁移, 扩容缩容, 数据都是安全的.
69
69
70
- ###你们如何保证数据迁移的过程中多个 Proxy 不会读到老的数据 (迁移的原子性) ?
70
+ ### 你们如何保证数据迁移的过程中多个 Proxy 不会读到老的数据 (迁移的原子性) ?
71
71
72
72
见 [ Codis 数据迁移流程] ( http://0xffff.me/blog/2014/11/11/codis-de-she-ji-yu-shi-xian-part-2/ )
73
73
74
- ###Codis支持etcd吗 ?
74
+ ### Codis支持etcd吗 ?
75
75
76
76
支持,请参考使用教程,需要将配置文件中的coordinator=zookeeper改为etcd。
77
77
78
78
但是需要注意:请使用codis2.0.10或更新的版本,旧版对etcd的支持有一些问题;由于etcd在2.2引入了一个与旧版不兼容的坑爹改动,导致如果使用etcd的版本>=2.2.0,暂时需要手动改一处代码,详情见[ 相关issue] ( https://github.com/CodisLabs/codis/issues/488 ) 。
79
79
80
- ###现有redis集群上有上T的数据,如何迁移到Codis上来?
80
+ ### 现有redis集群上有上T的数据,如何迁移到Codis上来?
81
81
82
82
为了提高 Codis 推广和部署上的效率,我们为数据迁移提供了一个叫做 [ redis-port] ( https://github.com/CodisLabs/redis-port ) 的命令行工具,它能够:
83
83
84
84
+ 静态分析 RDB 文件,包括解析以及恢复 RDB 数据到 redis
85
85
+ 从 redis 上 dump RDB 文件以及从 redis 和 codis 之间动态同步数据
86
86
87
- ###如果需要迁移现有 redis 数据到 codis,该如何操作?
87
+ ### 如果需要迁移现有 redis 数据到 codis,该如何操作?
88
88
89
89
+ 先搭建好 codis 集群并让 codis-proxy 正确运行起来
90
90
+ 对线上每一个 redis 实例运行一个 redis-port 来向 codis 导入数据,例如:
@@ -105,7 +105,7 @@ CAS 暂时不支持, 目前只支持eval的方式来跑lua脚本,需要配合T
105
105
106
106
- 旧 redis 下线时,会导致 reids-port 链接断开,于是自动退出
107
107
108
- ###redis-port 是如何在线迁移数据的?
108
+ ### redis-port 是如何在线迁移数据的?
109
109
110
110
+ redis-port 本质是以 slave 的形式挂载到现有 redis 服务上去的
111
111
0 commit comments