一. Redis集群简介
redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵·也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单
Redis Cluster 将所有数据划分为 16384 个 slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。
当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。
跳转重定位
当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射表。下面第21步操作会有演示
槽位定位算法
redis Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
HASH_SLOT = CRC16(key) mod 16384
二.集群搭建
1.环境准备
redis集群需要至少三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用三台机器部署6个redis实例,每台机器一主一从
192.168.154.146 redis主节点(8001)/从节点(8004)
192.168.154.147 redis主节点(8002)/从节点(8005)
192.168.154.148 redis主节点(8003)/从节点(8006)
(注意: 需要关闭防火墙)
2.下载
https://redis.io/download/
3.安装gcc
yum install gcc
4.放到/usr/local 解压
cd /usr/local
tar zxvf redis-5.0.14.tar.gz
mv redis-5.0.14/ redis
5.编译安装
cd redis/
make
6.修改配置文件 , 后台启动
daemonize yes # 后台启动
protected‐mode no # 关闭保护模式 , 开启的话只允许本机访问
# bind 127.0.0.1 # 需要注释掉bind,bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可
7.启动
src/redis-server redis.conf
8.验证
ps -ef | grep redis
9.进入客户端
src/redis-cli
10.退出客户端
quit
11.退出redis服务
pkill redis‐server
kill 进程号
src/redis‐cli shutdown
12.在usr/local创建文件
cd /usr/local
mkdir -p redis-cluster
cd redis-cluster
mkdir 8001 8004 # 其他两台分别为 8002 8005 , 8003 8006
13.复制配置文件
cp /usr/local/redis-5.0.14/redis.conf /usr/local/redis-cluster/8001
14.修改配置
vim redis.conf
daemonize yes
port 8001(分别对每个机器的端口号进行设置)
pidfile /var/run/redis_8001.pid
dir /usr/local/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
cluster-node-timeout 10000
# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
protected-mode no (关闭保护模式)
appendonly yes
如果要设置密码 , 修改如下配置
requirepass liuxs
masterauth liuxs
15.把8001的配置文件复制到8004
cp /usr/local/redis-cluster/8001/redis.conf /usr/local/redis-cluster/8004
16.修改8004的配置文件
vim redis.conf
:%s/8001/8004/g (批量把8001 替换为 8004)
17 其他节点按照以上操作执行一遍
18.启动
/usr/local/redis/src/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis-cluster/8004/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis-cluster/8005/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis-cluster/8003/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis-cluster/8006/redis.conf
19.验证
ps -ef | grep redis
20.用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现)
/usr/local/redis/src/redis-cli -a liuxs --cluster create --cluster-replicas 1 192.168.154.146:8001 192.168.154.147:8002 192.168.154.148:8003 192.168.154.146:8004 192.168.154.147:8005 192.168.154.148:8006
21.验证
1.连接任意一个节点都可以
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.147 -p 8002
2.查看集群信息
cluster info
3.查看集群列表
cluster nodes
4.数据验证
在147:8002 插入一条key为test 的数据
从146:8001客户端访问 , 会跳到147:8002 , 这就是redis集群原理之一 : 跳转重定位
22.关闭集群
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.146 -p 8001 shutdown
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.146 -p 8004 shutdown
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.147 -p 8002 shutdown
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.147 -p 8005 shutdown
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.148 -p 8003 shutdown
/usr/local/redis/src/redis-cli -a liuxs -c -h 192.168.154.148 -p 8006 shutdown