一、Redis集群概述
1、什么是Redis集群
2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,使集群的构建方式复杂度大大降低。关于集群的更新可以在 Redis5 的版本说明中看到,如下:
The cluster manager was ported from Ruby (redis-trib.rb) to C code inside redis-cli. check
redis-cli --cluster helpfor more info.
可以查看Redis官网查看集群搭建方式,连接如下
以下步骤是在一台 Linux 服务器上搭建有6个节点的 Redis集群。
注:实际运维工作中,大概需要3台机器,每台机器2个节点。但是详细规划主从关系,尽量不要把一组主从放在同一台服务器中。
Redis01 Redis02 Redis03
1主 1从
2主 2从
3从 3主
2、创建目录
IP地址:10.1.1.27
主机名称:redis.itcast.cn
新建目录:/redis
3、下载源码并解压编译
yum install wget -y
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
make
二、Redis集群配置
1、创建配置文件
注:6个配置文件不能在同一个目录,此处我们定义如下:
# mkdir /redis/conf/700{1..6}
/redis/conf/7001/redis.conf
/redis/conf/7002/redis.conf
/redis/conf/7003/redis.conf
/redis/conf/7004/redis.conf
/redis/conf/7005/redis.conf
/redis/conf/7006/redis.conf
2、配置文件内容
port 7001 #端口
cluster-enabled yes #启用集群模式
cluster-config-file nodes_7001.conf
cluster-node-timeout 5000 #超时时间
appendonly yes
daemonize yes #后台运行
protected-mode no #非保护模式
pidfile /var/run/redis_7001.pid
注:其中 port 和 pidfile 需要随着文件夹的不同递增,一键配合脚本
#!/bin/bash
for i in $(seq 7001 7006)
do
cat > /redis/conf/$i/redis.conf <<EOF
port $i
cluster-enabled yes
cluster-config-file nodes_$i.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_$i.pid
EOF
done
3、启动节点
#!/bin/bash
for i in $(seq 7001 7006)
do
/root/redis-5.0.5/src/redis-server /redis/conf/$i/redis.conf
done
4、启动集群
/root/redis-5.0.5/src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
至此,Reids5 集群搭建完成。
测试:
# /root/redis-5.0.5/src/redis-cli -c -p 7001
注:一定要添加-c选项,否则redis-cli默认启动是不以集群方式启动
5、关闭集群
配置文件
# vim /root/redis-5.0.5/utils/create-cluster/create-cluster
端口PORT设置为7000,NODES为6,工具会自动累加1 生成 7001-7006 六个节点 用于操作
关闭集群
cd /root/redis-5.0.5/utils/create-cluster
./create-cluster stop
启动集群
./create-cluster start
6、集群原理
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
3主 3从 = 正常
1主 3从 = 1 < (1+3)/2 = 2 = 集群失效