目录
二、7001-7006 端口 Redis 集群(伪分布式redis集群)
一、概述
1.1、集群模式
Redis 的哨兵和主从模式基本已经可以实现高可用和读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,浪费内存空间,所以在redis上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说Redis 节点上存储不同的内容
1.2、集群特点
多个redis节点网络互联,数据共享
所有的节点都是一主一从(也可以是一主多从),其中从节点不提供服务,仅作为备用
不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
支持在线增加、删除节点
客户端可以连接任何一个主节点进行读写
1.3、集群工作方式
1.3.1、数据存取工作方式
在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),一个是cluster。
插槽的取值范围是:0-16383。cluster,可以理解为是一个集群管理的插件。
当我们的存取 Key的时候,Redis 会根据算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
1.3.2、集群工作方式
为了保证高可用,redis集群模式引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。
那么如何发现主节点宕机?当其它主节点ping一个主节点C时,如果半数以上的主节点与C通信超时,那么认为主节点C宕机了。如果主节点C和它的从节点C1都宕机了,那么该集群就无法再提供服务了。
二、7001-7006 端口 Redis 集群(伪分布式redis集群)
2.1、节点规划
伪分布式:6 个节点全部署在 192.168.56.101/103 单台机器,用不同端口(7000 - 7005)区分,生产建议至少 3 台机器(每台 1 主 1 从,避免单机故障全挂)。
角色分工:3 主(7000、7001、7002)+ 3 从(7003、7004、7005),从节点是主节点的 “备胎”,主挂了从顶上。
2.2、核心配置(redis.conf)
cluster-enabled yes:开启集群模式,节点间会自动发现、通信。
cluster-config-file nodes-7000.conf:记录集群拓扑(主从关系、槽位分配),自动生成,别手动改。
cluster-node-timeout 5000:节点超时检测时间,主节点故障后,超过此时间从节点会尝试切换为主。
2.3、集群初始化
Redis 4.x 及以前:依赖 Ruby 环境 + redis-trib.rb 脚本,手动装 Ruby、解决依赖(如 openssl-devel)后,执行创建命令分配槽位、主从关系。
Redis 5.x 及以后:内置 redis-cli --cluster 命令,无需 Ruby,直接初始化,更简单。
2.4、数据存储逻辑(哈希槽)
Redis Cluster 用 16384 个哈希槽(slot) 分散数据:
存数据时,Redis 对 key 做哈希运算 → 算出对应槽位。
槽位关联到具体主节点,数据就存到该节点。
示例:
7000 主节点:存 0 - 5460 号槽
7001 主节点:存 5461 - 10922 号槽
7002 主节点:存 10923 - 16383 号槽
2.5、集群部署
2.5.1、创建redis集群节点
进入opt目录,创建redis集群
cd /opt
创建集群目录
mkdir redis_cluster
cd redis_cluster
下载redis
wget http://download.redis.io/releases/redis-5.0.9.tar.gz
解压
tar -zxvf redis-5.0.9.tar.gz
cd redis-5.0.9
编译
make && make install
cd ..
cp -r redis-5.0.9 7001
cp -r redis-5.0.9 7002
cp -r redis-5.0.9 7003
cp -r redis-5.0.9 7004
cp -r redis-5.0.9 7005
cp -r redis-5.0.9 7006
修改redis配置文件
修改成对应的7001,7002,7003,7004,7005,7006
cd 7001
//清空redis.conf配置文件
cat /dev/null > redis.conf
vim redis.conf
添加以下内容:
# 如果是本地创建redis集群,可以使用127.0.0.1。如果是公网访问,需要注释掉bind选项
#bind 127.0.0.1
#端口,修改成对应的7001,7002,7003,7004,7005,7006
port 7001
# redis后台运行
daemonize yes
# 关闭保护模式
protected-mode no
# pidfile文件,修改成对应的7001,7002,7003,7004,7005,7006
pidfile /var/run/redis_7001.pid
# 开启集群
cluster-enabled yes
# 集群的配置,修改成对应的7001,7002,7003,7004,7005,7006
cluster-config-file nodes_7001.conf
# redis集群节点通信超时时间,默认15秒,可自行设置
cluster-node-timeout 15000
# aof日志开启 有需要就开启,它会每次写操作都记录一条日志
appendonly yes
#数据目录,修改成对应的7001,7002,7003,7004,7005,7006
dir /opt/redis_cluster/7001/dataStore/
# 错误日志文件
logfile redis_log.log
创建所有节点目录
for i in {7001..7006}; do
mkdir -p /opt/redis_cluster/$i/dataStore/
done
2.5.2、 启动集群节点
[root@host1 redis_cluster]# /opt/redis_cluster/7001/src/redis-server /opt/redis_cluster/7001/redis.conf
[root@host1 redis_cluster]# /opt/redis_cluster/7002/src/redis-server /opt/redis_cluster/7002/redis.conf
[root@host1 redis_cluster]# /opt/redis_cluster/7003/src/redis-server /opt/redis_cluster/7003/redis.conf
[root@host1 redis_cluster]# /opt/redis_cluster/7004/src/redis-server /opt/redis_cluster/7004/redis.conf
[root@host1 redis_cluster]# /opt/redis_cluster/7005/src/redis-server /opt/redis_cluster/7005/redis.conf
[root@host1 redis_cluster]# /opt/redis_cluster/7006/src/redis-server /opt/redis_cluster/7006/redis.conf
2.5.3、 查看是否启动成功
看见以下输出,说明6个节点全部启动成功
[root@host1 redis_cluster]# ps -ef|grep redis
root 22939 1 0 17:56 ? 00:00:00 /opt/redis_cluster/7001/src/redis-server *:7001 [cluster]
root 22945 1 0 17:56 ? 00:00:00 /opt/redis_cluster/7002/src/redis-server *:7002 [cluster]
root 22958 1 0 17:56 ? 00:00:00 /opt/redis_cluster/7003/src/redis-server *:7003 [cluster]
root 22963 1 0 17:56 ? 00:00:00 /opt/redis_cluster/7004/src/redis-server *:7004 [cluster]
root 22968 1 0 17:56 ? 00:00:00 /opt/redis_cluster/7005/src/redis-server *:7005 [cluster]
root 22974 1 0 17:56 ? 00:00:00 /opt/redis_cluster/7006/src/redis-server *:7006 [cluster]
root 22979 18421 0 17:57 pts/0 00:00:00 grep --color=auto redis
2.5.4、 创建集群
1.仅本地访问(如服务器内部使用)
用 127.0.0.1:
此时集群节点间通信和客户端访问都限制在本机,外部无法通过网络访问,适合测试或单机内部使用。
命令示例:
bash
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
2. 公网访问(如跨服务器、外部客户端访问)
必须用公网 IP:
若集群需要被外部机器(非本机)访问,初始化时必须指定 节点的公网 IP(而非 127.0.0.1 或内网 IP)。
原因是:Redis 集群会将初始化时使用的 IP 写入节点配置(nodes-xxxx.conf),客户端连接时会从集群获取节点 IP,如果是内网 IP,外部客户端无法识别,导致访问失败
redis-cli --cluster create 公网ip:7001 公网ip:7002 公网ip:7003 公网ip:7004 公网ip:7005 公网ip:7006 --cluster-replicas 1
2.5.5、 查看集群
# 连接任意节点(如 7001)
redis-cli -c -h 127.0.0.1 -p 7001
# 查看集群节点信息
cluster nodes
三、分布式redis集群
3.1、redis主从复制
#主和备:
下载redis源码包
# 安装依赖,编译所需要的环境和编译器
yum install -y gcc gcc-c++ make
#拉取相应的包
wget https://download.redis.io/releases/redis-6.2.1.tar.gz
tar xzf redis-6.2.1.tar.gz -C /opt
cd /opt/redis-6.2.1
#创建安装目录
mkdir /usr/local/redis
#编译并安装到指定目录
make && make PREFIX=/usr/local/redis install
#执行服务安装脚本
cd /opt/redis-6.2.1/utils
vim install_server.sh
#找到并注释下面的代码即可
#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
#启动
./install_server.sh
3.2、redis集群
#回车四次,下一步需要手动输入
Please select the redis executable path [] /usr/local/redis/bin/redis-server
#创建软连接
ln -s /usr/local/redis/bin/* /usr/local/bin/
#修改配置文件,搭建redis主从同步
#修改Master节点Redis配置文件
# vim /etc/redis/6379.conf
bind 0.0.0.0 # 修改bind 项,0.0.0.0监听所有网段
port:6379 # 工作端口
protected-mode:no # 关闭保护模式
daemonize yes # 开启守护进程
logfile /var/log/redis_6379.log # 指定日志文件目录
dir /var/lib/redis/6379 # 指定本地数据存放位置
appendonly yes # 开启AOF持久化功能
requirepass:root # 设置 redis 连接密码
masterauth:root # 设置slave 服务连接 master 的密码
/etc/init.d/redis_6379 restart # 重启redis
#修改Slave节点Redis配置文件
# vim /etc/redis/6379.conf
bind 0.0.0.0 # 修改bind 项,0.0.0.0监听所有网卡
port:6379 # 工作端口
protected-mode:no # 关闭保护模式
daemonize yes # 开启守护进程
logfile /var/log/redis_6379.log # 指定日志文件目录
dir /var/lib/redis/6379 # 指定本地数据存放位置
appendonly yes # 开启AOF持久化功能
requirepass:root # 设置 redis 连接密码
masterauth:root # 设置slave 服务连接 master 的密码
replicaof 192.168.157.19 6379 # 指定要同步的Master节点IP和端口
/etc/init.d/redis_6379 restart # 重启redis
#在Master节点上验证从节点
redis-cli -a root
主节点:
备节点:
3.3、redis哨兵模式
#修改 sentinel.conf 配置文件(所有节点操作)
vim /opt/redis-6.2.1/sentinel.conf
# 最好复制一份到/etc/redis/sentinel.conf与redis主配置文件一起,方便管理
cp /opt/redis-6.2.1/sentinel.conf /etc/redis/sentinel.conf
pidfile /var/run/redis-sentinel.pid #运行时PID文件
protected-mode no # 关闭保护模式
port 26379 # Redis哨兵默认的监听端口
daemonize yes # 指定sentinel为后台启动
logfile "/var/log/sentinel.log" # 指定日志存放路径
dir "/var/lib/redis/6379" # 指定数据库存放路径
#监控的节点名字可以自定义,后边的2代表的:如果有俩个哨兵判断这个主节点挂了那这个主节点就挂了,通常设置为哨兵个数一半加一
# 指定该哨兵节点监控10.0.0.11:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.157.19 6379 2
# 当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster root
#哨兵连接主节点多长时间没有响应就代表主节点挂了,单位毫秒。默认30000毫秒,30秒。
sentinel down-after-milliseconds mymaster 30000
#在故障转移时,最多有多少从节点对新的主节点进行同步。这个值越小完成故障转移的时间就越长,这个值越大就意味着越多的从节点因为同步数据而暂时阻塞不可用
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间,这里设置为三分钟180000(180秒)
sentinel failover-timeout mymaster 180000
#禁止使用SENTINEL SET设置notification-script和client-reconfig-script
sentinel deny-scripts-reconfig yes
#先主后从
redis-sentinel /etc/redis/sentinel.conf &
#主服务查看哨兵日志
tail -f /var/log/sentinel.log
#主服务查看哨兵信息
redis-cli -p 26379 info sentinel