Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。
Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接,这些 TCP 连接会永久保持。
Redis Cluster 同其他分布式存储系统一样,主要具备以下两个功能:
数据分区
Redis 集群会将用户数据分散保存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生 16384 个哈希槽slot,同时会根据节点的数量大致均等的将 16384 个哈希槽映射到不同的节点上。当用户存储key-value时,集群会先对key进行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现自动分割数据到不同的节点上。
数据冗余
Redis 集群支持主从复制和故障恢复。集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给集群里的其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。
为了节省服务器资源,本次实验 采用单台机器启动6个不同的端口来模拟实践redis 集群。
服务器IP 192.168.10.132 端口 8001-8006
1.1 Ruby编译安装
Redis3.0需要安装ruby和rubygems环境,而且ruby版本要高于1.8.7;
tar -zxvf ruby-2.5.5.tar.gz
cd ruby-2.5.5
./configure
make &&make install
[root@hdp-03 cluster]# ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux]
1.2 Rubygems编译安装
下载最新的rubygems-3.0.4.tgz安装包上传服务器对应安装目录/opt
#tar -zxvf rubygems-3.0.4.tgz
#cd rubygems-3.0.4
#ruby setup.rb
[root@hdp-03 cluster]# gem -v
3.0.4
1.3 Redis3.0编译安装
tar -zxvf redis-3.0.0.tar.gz
cd redis-3.0.0/
make
make install
1.4 Redis3.0集群配置
1.4.1 创建集群需要的目录
[root@hdp-03 redis]# mkdir -pv cluster
[root@hdp-03 redis]# mkdir -pv /opt/redis/cluster/{8001,8002,8003,8004,8005,8006}
mkdir: created directory `/opt/redis/cluster/8001'
mkdir: created directory `/opt/redis/cluster/8002'
mkdir: created directory `/opt/redis/cluster/8003'
mkdir: created directory `/opt/redis/cluster/8004'
mkdir: created directory `/opt/redis/cluster/8005'
mkdir: created directory `/opt/redis/cluster/8006'
1.4.2 修改redis.conf配置文件并分发到集群节点目录
vim redis.conf
###修改配置文件中的下面选项
port 8001 #分别更改
daemonize yes #允许后台启动
cluster-enabled yes # 启用集群模式
cluster-config-file nodescode.conf # 设置当前节点集群配置文件路径
appendonly yes
pidfile /var/run/redis8001.pid #设置 Redis 实例 pid 文件
logfile "/var/8001.log" #设置 Redis 实例log文件
dir /opt/redis/cluster/8001
bind 192.168.10.132
分发各个节点配置文件:
[root@hdp-03 redis-3.0.0]# cp redis.conf /opt/redis/cluster/8001
[root@hdp-03 redis-3.0.0]# cp redis.conf /opt/redis/cluster/8002
[root@hdp-03 redis-3.0.0]# cp redis.conf /opt/redis/cluster/8003
[root@hdp-03 redis-3.0.0]# cp redis.conf /opt/redis/cluster/8004
[root@hdp-03 redis-3.0.0]# cp redis.conf /opt/redis/cluster/8005
[root@hdp-03 redis-3.0.0]# cp redis.conf /opt/redis/cluster/8006
将分发的配置文件进行批量修改:
sed -i 's/8001/8006/g' /opt/redis/cluster/8006/redis.conf
sed -i 's/8001/8005/g' /opt/redis/cluster/8005/redis.conf
sed -i 's/8001/8004/g' /opt/redis/cluster/8004/redis.conf
sed -i 's/8001/8003/g' /opt/redis/cluster/8003/redis.conf
sed -i 's/8001/8002/g' /opt/redis/cluster/8002/redis.conf
1.4.3 分别启动这6个redis实例
cd /opt/redis/redis-3.0.0/src
./redis-server /opt/redis/cluster/8001/redis.conf
./redis-server /opt/redis/cluster/8002/redis.conf
./redis-server /opt/redis/cluster/8003/redis.conf
./redis-server /opt/redis/cluster/8004/redis.conf
./redis-server /opt/redis/cluster/8005/redis.conf
./redis-server /opt/redis/cluster/8006/redis.conf
1.4.4 Redis集群创建
执行redis的创建集群命令创建集群:
[root@hdp-03 src]# ./redis-trib.rb create --replicas 1 192.168.10.132:8001 192.168.10.132:8002 192.168.10.132:8003 192.168.10.132:8004 192.168.10.132:8005 192.168.10.132:8006
1.5 验证集群状态:
1.6 测试验证集群数据写入
发现有error 报错了,根据网络上建议:
启动时使用-c参数来启动集群模式,命令如下:
[root@muze1 src]$ killall redis-server
登录redis-cli 时候指定 -c 选项,指定客户端连接到redis cluster的集群。