redis集群方式部署
Redis Cluster是一种服务器 Sharding 技术,3.0版本开始正式提供
Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在 redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。
集群数据分片:
Redis 集群没有使用一致性 hash,而是引入了哈希槽【hash slot】的概念
Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么每个节点就包含5461个槽,如下:
- 节点 A 包含 0 到 5460 号哈希槽
- 节点 B 包含 5461 到 10922 号哈希槽
- 节点 C 包含 10923 到 16383 号哈希槽
这种结构很容易添加或者删除节点。比如如果我需要向集群中新添加个节点 D , 就需要从节点 A, B, C 中分出一部分槽到 D 上。如果要移除节点 A ,需要将 A 中的槽移到 B 和 C 节点上,然后将没有任何槽的 A 节点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是 cluster,可以理解为是一个集群管理的插件。当我们的存取的 Key到达的时候,Redis 会根据 CRC16 的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
redis-cluster集群引入了主从复制模型,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点 ping 一个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了。如果主节点 A 和它的从节点 A1 都宕机了,那么该集群就无法再提供服务了,会报槽无法获取
集群优点:
- 实现了分布式存储,节省了内存
集群正常工作至少需要3个主节点,本例子创建6个节点,三个主节点三个从节点,对应IP和端口如下:
| IP | 端口 | redis版本 |
| 10.9.2.29 | 7000 | 7.0.11 |
| 10.9.2.29 | 7001 | |
| 10.9.2.29 | 7002 | |
| 10.9.2.247 | 7003 | |
| 10.9.2.247 | 7004 | |
| 10.9.2.247 | 7005 |
1、首先两台机器通过编译方式安装redis
参考编译安装方式章节:https://blog.ywdevops.cn/index.php/2021/10/20/redis-2/
2、登录10.9.2.29机器,进入redis路径,创建集群目录和端口目录,如下:
cd /usr/local/redis-7.0.11
mkdir -p redis_cluster/{7000,7001,7002}
10.9.2.247机器同样操作,端口文件夹变为7003、7004、7005
cd /usr/local/redis-7.0.11
mkdir -p redis_cluster/{7003,7004,7005}
3、将配置文件复制到对应的端口文件夹中,并修改名字,如下:
cp redis.conf redis_cluster/7000/redis_7000.conf #10.9.2.29机器
cp redis.conf redis_cluster/7001/redis_7001.conf #10.9.2.29机器
cp redis.conf redis_cluster/7002/redis_7002.conf #10.9.2.29机器
cp redis.conf redis_cluster/7003/redis_7003.conf #10.9.2.247机器
cp redis.conf redis_cluster/7004/redis_7004.conf #10.9.2.247机器
cp redis.conf redis_cluster/7005/redis_7005.conf #10.9.2.247机器
4、修改上面文件夹中的配置文件,6个配置文件都要修改,如下:
bind 0.0.0.0
# 改为对应的端口号
port 7000
# 后台启动
daemonize yes
#保护模式
protected-mode no
# 开启集群
cluster-enabled yes
#集群节点配置文件
cluster-config-file nodes-7000.conf
# 集群连接超时时间
cluster-node-timeout 5000
# 进程pid的文件位置
pidfile /var/run/redis-7000.pid
# 开启aof
appendonly yes
# aof文件路径
appendfilename "appendonly-7000.aof"
# rdb文件路径
dbfilename dump-7000.rdb
#日志位置
logfile "redis_cluster/7000/redis_7000.log"
#将数据从单节点切换为集群模式,不配置会有告警提示
database 1
5、启动两台机器的6个redis,如下:
/usr/bin/redis-server redis_cluster/7000/redis_7000.conf
/usr/bin/redis-server redis_cluster/7001/redis_7001.conf
/usr/bin/redis-server redis_cluster/7002/redis_7002.conf
/usr/bin/redis-server redis_cluster/7003/redis_7003.conf
/usr/bin/redis-server redis_cluster/7004/redis_7004.conf
/usr/bin/redis-server redis_cluster/7005/redis_7005.conf
6、上面命令只是启动6个redis,还未将其关联一起,执行命令创建集群,关联redis,如下:
redis-cli --cluster create --cluster-replicas 1 10.9.2.29:7000 10.9.2.29:7001 10.9.2.29:7002 10.9.2.247:7003 10.9.2.247:7004 10.9.2.247:7005
提示Can I set the above configuration? (type ‘yes’ to accept): 的时候选择yew,创建完如图:

查看集群状态信息,如图:

7、测试
首先在10.9.2.29机器通过如下命令连接到集群,然后设置key和获取key,如下:
redis-cli -c -p 7000 #必须加-c参数,否则执行set命令报错(error) MOVED 15495 10.9.2.29:7001
set hello world

登录10.9.2.247的任意一个redis,查询key对应的值,如图:

通过info命令也可以当前redis节点的信息,包括主从信息,如图:

8、给集群设置密码认证
上面集群默认是没有设置密码的,一般使用的时候都是需要设置密码的,方法如下:
(1)、修改每个Redis的配置文件,设置两个密码位置,如下:
masterauth "password"
requirepass "password"
(2)、重启每个redis节点,然后通过密码登录集群,如下:
redis-cli -p 7000 -c -a Abcd1234
(3)、然后执行set和get即可
注意:如果登录的时候不指定-a ,那么登录后使用auth认证后再使用set命令还是提示要认证


