Redis Cluster

image-20221004222258747

hash(key) % 16384 = slot 哈希槽 = hash(key) & 2^n^

slot - hash槽分布范围[0-5460] 、 [5461-10922]、[10923-16383]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 创建RedisCluster配置的节点目录
[root@redis]$ mkdir -p rediscluster/node800{1,2,3,4,5,6}
# 复制Redis配置到每个节点目录
[root@redis]$ cp redis-5.0.2/redis.conf rediscluster/node8001/
# 修改节点配置
[root@redis]$ vim rediscluster/node8001/redis.conf
# 批量修改
:%s/8001/8002/g

# 启动集群配置
[root@redis]$ redis-server rediscluster/800*/redis.conf
# 校验启动情况
[root@reids]$ ps -ef | grep redis
# 集群命令帮助
[root@redis]$ redis-cli --cluster help
# 创建集群关系
[root@redis]$ redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.109.200:8001 192.168.109.200:8002 192.168.109.200:8003 192.168.109.200:8004 192.168.109.200:8005 192.168.109.200:8006


# 连接任意一个节点客户端[带-c说明是集群方式 智能客户端]
[root@redis]$ redis-cli -a 111111 -c -h 192.168.109.200 -p 8001
# 验证集群信息
> cluster info
> cluster nodes
> cluster slots
序号配置项选项释义
1cluster-enabledyes启动集群模式
2port8001端口
3dir/usr/local/redis-cluster/8001/指定数据目录,绝对目录
4cluster-config-filenodes-8001.conf集群节点信息,hash crc16
5cluster-node-timeout5000集群节点超时时间,心跳时间
6bind#127.0.0.1测试需要注释掉,生产需指定配置
7protected-modeno关闭保护模式
8requirepass111111redis访问密码
9masterauth111111集群节点间的访问密码,与上述保持一致
10damonizeyes后台启动
11appendonlyyes

Laravel 框架 使用redis cluster需要修改的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# .composer.lock
# ...
"require": {
# ...
"php": "^7.1.3",
"predis/predis": "^1.1",
# 如果安装horizon,请注意Redis密码必设且相同
# config/horizon.php中'use'=>'horizon'
# ...
},
# ...


# .env
# ...
CACHE_DRIVER=redis
# ...

# cache.php
# ...
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
#...


# database.php
# ...
'redis' => [
'client' => env('REDIS_CLIENT', 'predis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
],
'clusters' => [
'default' => [
[
'host' => env('REDIS_HOST_A'),
'password' => env('REDIS_PASSWORD_A'),
'port' => env('REDIS_PORT_A', 6379),
'database' => env('REDIS_DB_A', 0),
],
[
'host' => env('REDIS_HOST_B'),
'password' => env('REDIS_PASSWORD_B'),
'port' => env('REDIS_PORT_B', 6379),
'database' => env('REDIS_DB_B', 0),
],
[
'host' => env('REDIS_HOST_C'),
'password' => env('REDIS_PASSWORD_C'),
'port' => env('REDIS_PORT_C', 6379),
'database' => env('REDIS_DB_C', 0),
],
[
'host' => env('REDIS_HOST_D'),
'password' => env('REDIS_PASSWORD_D'),
'port' => env('REDIS_PORT_D', 6379),
'database' => env('REDIS_DB_D', 0),
],
[
'host' => env('REDIS_HOST_E'),
'password' => env('REDIS_PASSWORD_E'),
'port' => env('REDIS_PORT_E', 6379),
'database' => env('REDIS_DB_E', 0),
],
[
'host' => env('REDIS_HOST_F'),
'password' => env('REDIS_PASSWORD_F'),
'port' => env('REDIS_PORT_F', 6379),
'database' => env('REDIS_DB_F', 0),
],
],
],
],
# ...

Redis Cluster 注意事项

  • 不完全支持批量操作:mset、mget
  • 事务不能跨节点支持
  • 不支持多实例
  • key 是最小粒度
  • 最少 6 个才能保证组成完整高可用的集群
  • 连接的时候只需要连接 1 台服务器即可。
  • 如果 1 个主从连接宕机的话,那么集群就宕机了。

应用场景

计数器 string incr

分布式ID生成 incr

海量数据统计 - bitmap

会话缓存 key value

分布式队列/阻塞队列 list 双向链表 lpush/rpush rpop/lpop brpop/blpop阻塞队列

分布式锁[setnx]

热键 HotKey 存储 [list] ltrim 用户路由 二级缓存

社交类 - 好友推荐、文章 set

排行榜 sorted_set

延迟队列 - sorted_set & zadd + zrangbyscore + rem key

地址服务 [geo]

布隆过滤器 [0-1]