1.主从复制
解决的问题:对于一些业务系统来说,写请求较少,读请求较多,那么如果使用一台Redis,那么压力较大,可以使用多台Redis形成主从结构,主节点主要负责写操作,而从节点可以分摊读请求。解决的问题:对于一些业务系统来说,写请求较少,读请求较多,那么如果使用一台Redis,那么压力较大,可以使用多台Redis形成主从结构,主节点主要负责写操作,而从节点可以分摊读请求。
注:只有主节点可以进行写命令,从节点只能进行读命令,客户端可以连接slaves从节点,分担master读的压力
操作方法
#启动主服务器
/usr/local/soft/redis-6.2.1
nohup redis-server &
#启动从服务器
nohup redis-server --port 6380 --slaveof 127.0.0.1 6379 &
#此时从服务器只能读取数据
#如果使用kill -9 进程号杀死主进程,从进程仍可以进行读取数据
#可以使用slaveof no one 使从节点变成一个独立的节点
#slaveof 127.0.0.1 6379 将服务器转换为slave
#若该节点再次成为主节点的从节点,则再该节点所发生的修改不会进行同步
一个master可以有多个从节点
从节点下线,只会影响读数据的性能
主节点下线,则无法执行写操作
2.Redis集群
Redis集群节点复制
Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品 当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的
Redis集群故障转移
Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移 集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel
Redis集群分片
集群将整个数据库分为16384个槽位slot,所有key都数据这些slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数
集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求
举例
三个主节点7000、7001、7002平均分片16384个slot槽位 节点7000指派的槽位为0到5460 节点7001指派的槽位为5461到10922 节点7002指派的槽位为10923到16383
Redis集群Redirect转向
由于Redis集群无中心节点,请求会发给任意主节点
主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误
客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求
3.redis集群配置
3.1 关闭redis服务
# 查询redis进程
ps -aux | grep redis
# 杀掉
kill -9 pid
3.2 redis集群搭建
1、创建安装目录 在master ,node1 ,node2中分别创建
mkdir -p /usr/local/soft/redis-cluster
2、将redis 复制到redis-cluster 目录下修改名字为7000 -- master
复制前删除单机版缓存文件
rm -rf appendonly.aof
rm -rf dump.rdb
# 先在master中操作
cp -r /usr/local/soft/redis /usr/local/soft/redis-cluster
mv /usr/local/soft/redis-cluster/redis /usr/local/soft/redis-cluster/7000
# 删除两个数据文件
cd /usr/local/soft/redis-cluster/7000/bin
rm -rf appendonly.aof
rm -rf dump.rdb
3、修改配置文件 -- master
vim /usr/local/soft/redis-cluster/7000/bin/redis.conf
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000
port 7000 //端口7000
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes.conf //集群的配置 配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时 设置5秒够了
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 (全持久化)
4、复制7000 -- master
cd /usr/local/soft/redis-cluster
cp -r 7000 7001
cp -r 7000 7002
cp -r 7000 7003
cp -r 7000 7004
cp -r 7000 7005
5、修改每一个里面的配置
vim 7001/bin/redis.conf
把7000改成对应的端口号
pidfile /var/run/redis_7001.pid
port 7001
vim 7002/bin/redis.conf
把7000改成对应的端口号
pidfile /var/run/redis_7002.pid
port 7002
vim 7003/bin/redis.conf
把7000改成对应的端口号
pidfile /var/run/redis_7003.pid
port 7003
vim 7004/bin/redis.conf
把7000改成对应的端口号
pidfile /var/run/redis_7004.pid
port 7004
vim 7005/bin/redis.conf
把7000改成对应的端口号
pidfile /var/run/redis_7005.pid
port 7005
6、在7002 ,7003 复制到node1
scp -r /usr/local/soft/redis-cluster/7002 node1:/usr/local/soft/redis-cluster/
scp -r /usr/local/soft/redis-cluster/7003 node1:/usr/local/soft/redis-cluster/
7、在7004 ,7005 复制到node2
scp -r /usr/local/soft/redis-cluster/7004 node2:/usr/local/soft/redis-cluster/
scp -r /usr/local/soft/redis-cluster/7005 node2:/usr/local/soft/redis-cluster/
8、启动redis
#1、在master中执行
cd /usr/local/soft/redis-cluster/7000/bin
./redis-server redis.conf
cd /usr/local/soft/redis-cluster/7001/bin
./redis-server redis.conf
#2、在node1中执行
cd /usr/local/soft/redis-cluster/7002/bin
./redis-server redis.conf
cd /usr/local/soft/redis-cluster/7003/bin
./redis-server redis.conf
#3、在node2中执行
cd /usr/local/soft/redis-cluster/7004/bin
./redis-server redis.conf
cd /usr/local/soft/redis-cluster/7005/bin
./redis-server redis.conf
# 查看是否都启动
ps -aux | grep redis
9、启动集群 第一次使用 重启不需要使用 -- master
# -cluster-replicas : 每个主节点从节点的数量
redis-cli --cluster create 192.168.163.100:7000 192.168.163.100:7001 192.168.163.110:7002 192.168.163.110:7003 192.168.163.120:7004 192.168.163.120:7005 --cluster-replicas 1
10、客户端访问reids集群 --master
# -p 端口号 -h 节点ip -c 自动重定向,不加无法重定向
redis-cli -p 7000 -h master -c
# 查看集群的信息
CLUSTER info
# 查看集群的节点
CLUSTER nodes