文章介绍在三台主机上安装三主三从的Redis集群,安装步骤如下:
安装前准备:源码包安装redis需要部署gcc
yum install -y gcc
redis下载,7.0+版本redis支持通过主机名访问集群
wget https://download.redis.io/releases/redis-7.0.7.tar.gz
配置主机名:
hostnamectl set-hostname redis-node1
vim /etc/hosts
10.0.0.10 redis-node1 10.0.0.11 redis-node2 10.0.0.12 redis-node3
redis集群各节点安装,以redis01为例
mkdir -p /data/redis/redis01/{conf,log,data,run}
将redis.tar.gz在/data/目录下解压、编译安装
cd /data/; tar -xf redis*.tar.gz
cd redis-7.0.7/src
make
cd redis-7.0.7
make install PREFIX=/data/redis/redis01
将源码包中的redis.conf复制到安装路径下的conf目录下
cp redis-7.0.7/redis.conf /data/redis/redis01/conf/redis-node01.conf
其中的地址、端口、路径等信息根据实际进行修改
vim /data/redis/redis01/conf/redis-node01.conf
# 本机地址 bind 10.0.0.10 # 端口 port 17001 # pid存储目录 pidfile /data/redis/redis01/run/redis_01.pid # 日志存储目录 logfile /data/redis/redis01/log/redis_01.log # 数据存储目录(目录要提前创建好) dir /data/redis/redis01/data/ # 开启集群 cluster-enabled yes # 集群节点配置文件,这个文件是不能手动编辑的。确保每一个集群节点的配置文件不同 cluster-config-file nodes-01.conf # 集群节点的超时时间,单位:ms,超时后集群会认为该节点失败 cluster-node-timeout 15000 # 开启持久化 appendonly yes # 守护进程 daemonize yes # 是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。 protected-mode no # 以下为redis7新的配置项 cluster-preferred-endpoint-type hostname cluster-announce-hostname redis-node1 # 设置最大内存限制 maxmemory 24gb # 数据清理机制 maxmemory-policy volatile-lru # 鉴权密码配置,$password配置为真实密码 masterauth "$password" requirepass "$password" # 数据备份 save 3600 1 300 100 60 10000
将编译好的安装包拷贝到其他节点
cp -ar /data/redis/redis01 /data/redis/redis04
scp -r /data/redis 10.0.0.11:/data
scp -r /data/redis 10.0.0.12:/data
登录redis-node2节点
cd /data/redis
mv redis01 redis02
mv redis04 redis05
登录redis-node3节点
cd /data/redis
mv redis01 redis03
mv redis04 redis06
各个节点根据实际进行修改配置文件
…
启动各个节点
/data/redis/redis01/bin/redis-server /data/redis/redis01/conf/redis.conf;
/data/redis/redis04/bin/redis-server /data/redis/redis04/conf/redis.conf;
/data/redis/redis02/bin/redis-server /data/redis/redis02/conf/redis.conf;
/data/redis/redis05/bin/redis-server /data/redis/redis05/conf/redis.conf;
/data/redis/redis03/bin/redis-server /data/redis/redis03/conf/redis.conf;
/data/redis/redis06/bin/redis-server /data/redis/redis06/conf/redis.conf;
设置集群模式
/data/redis/redis01/bin/redis-cli --cluster create 10.0.0.10:17001 10.0.0.11:17001 10.0.0.12:17001 10.0.0.10:17002 10.0.0.11:17002 10.0.0.12:17002 --cluster-replicas 1 -a ‘pwd’
查看集群状态
/data/redis/redis01/bin/redis-cli -c -h 10.0.0.10 -p 17001 -a ‘pwd’ cluster info
/data/redis/redis01/bin/redis-cli -c -h 10.0.0.10 -p 17001 -a ‘pwd’ cluster nodes
id:45da901c0ad3f5c882765b-------f2dc81f083b,节点ID,这个值在节点启动时创建,作为唯一标识
ip:port:-.-.-.43:17001@27001,节点的通信地址
flags:myself,master:逗号分割的标记位,可能的值及含义如下:
– myself:当前连接的节点
– master:节点是主节点
– slave: 节点是从节点
– fail?:当前节点无法联系,但逻辑上是可达的(非 FAIL 状态)
– fail:节点处于 FAIL 状态,大部分节点都无法与其取得联系,则会将该节点由 PFAIL 状态升级为 FAIL 状态
– handshake:还未取得信任的节点,当前正在与其进行握手
– noaddr:没有地址的节点(No address known for this node)
– noflags:连个标记都没有(No flags at all)
master-id:45da901c0ad3f5c882765b-------f2dc81f083b,因为当前节点是从节点,所以会列出所属主节点的ID,即-.-.-.43:17001
ping-sent:-0,最近一次发送 ping 的时间,这个时间是一个 unix 毫秒时间戳,0 代表没有发送过
pong-recv:1661445823000,最近一次收到pong的时间,使用 unix 时间戳表示
config-epoch:1,节点的 epoch 值(如果该节点是从节点,则为其主节点的 epoch 值),每当节点发生失败切换时,都会创建一个新的且递增的 epoch 值,如果多个节点竞争同一个哈希槽,epoch 值更高的节点更容易抢夺到
link-state:connected,集群总线使用的链接的状态,我们使用这个链接与集群中其他节点进行通信,值可以是 connected 或 disconnected
slot:0-5460,一个哈希槽范围;Redis集群把把所有master节点映射到[0-16383]的slot上,即所有master节点均分16384大小的slot空间,每个master节点占有一定的slot空间,当存储数据时,首先会对 key 使用 CRC16 算法进行加密,将得到的值 mod 16384,Redis则根据该计算值将该key放入对应的节点,均衡集群压力。同样的,取数据时也会对 Key 进行同样的计算,根据得到的值去对应的节点获取数据(从当前节点获取或重定向到其他节点);
当发现集群状态异常,如连接时发现JedisClusterOperationException: Cluster retry deadline exceeded,可重新设置集群:
停止redis进程(节点)
ps -ef|grep redis|grep -v grep|awk ‘{print $2}’|xargs kill -9
清理各节点数据
rm -rf /data/redis/redis01/data/* /data/redis/redis01/log/* /data/redis/redis01/run/;
rm -rf /data/redis/redis04/data/ /data/redis/redis04/log/* /data/redis/redis04/run/*;
rm -rf /data/redis/redis02/data/* /data/redis/redis02/log/* /data/redis/redis02/run/;
rm -rf /data/redis/redis05/data/ /data/redis/redis05/log/* /data/redis/redis05/run/*;
rm -rf /data/redis/redis03/data/* /data/redis/redis03/log/* /data/redis/redis03/run/;
rm -rf /data/redis/redis06/data/ /data/redis/redis06/log/* /data/redis/redis06/run/*;
启动各个节点
如上
设置集群模式
如上
查看集群状态
如上