Redis集群
主从复制的场景无法吗满足主机单点故障时需要引入集群配置
一般数据库要处理的读请求远大于写请求 ,针对这种情况,我们优化数据库可以采用读写分离的策略。我们可以部 署一台主服务器主要用来处理写请求,部署多台从服务器 ,处理读请求。
基本原理
哨兵选举机制,如果过半数节点发现某个异常节点,共同决定更改异常节点的状态,如果该节点是主节点,对应的备节点自动顶替为主节点。
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器。并能在被监视的主服务器下线时自动将下线主服务器下的某个从服务器升级为新的主服务器。
配置集群所需的环境
Redis集群至少需要三个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。
学习可以采用伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号。
分布式集群搭建:
1.在安装目录下新建目录redis_cluster,文件夹下新建文件redis7001.conf
2. vim redis7001.conf
在不同的服务器 这个可以不要
cluster-config-file nodes-7006.conf 伪集群每个节点这个文件一样所以需要加这个
include /usr/local/bin/redis_cluster/redis.conf #引入配置文件
port 7001 #端口设置
pidfile "/var/run/redis_7001.pid" #存放进程ID防止启动多个进程副本
dbfilename "dump_7001.rdb" #持久化文件名称
dir "/usr/local/bin/redis_cluster" #持久化保存位置
logfile "/usr/local/bin/redis_cluster/redis_err_7001.log"
cluster-enabled yes #开启集群
cluster-config-file nodes-7001.conf #节点名称
cluster-node-timeout 15000 #节点过期时间
集群一般不设置密码
3.后台启动,查看启动是否正常
4.关闭 建议使用 shutdown 不要使用 kill杀死进程
一台虚拟机多个节点需要 -h 指定 IP
5.完整克隆第一台虚拟机五次(关机后在进行克隆)
6.启动六台虚拟机并修改 IP 与 .conf
/etc/sysconfig/network-scripts/ifcfg-ens32(这个数值看个人网卡)
/etc/sysconfig/network-scripts/ifcfg-ens+tab(自动补全)
vim /usr/local/bin/redis_cluster/redis7001.conf(文件名不用更改即可)
service network restart 修改网络配置后重启网络服务
(1)
vim /etc/sysconfig/network-scripts/ifcfg-ens32
克隆的五台虚拟机需要删掉此行 UUID
(2)
按esc通过vim 底行指令快速修改
vim /usr/local/bin/redis_cluster/redis7001.conf
cluster-node-timeout 15000 1会被修改
:%s/7001/7002/g 不会修改 15000
五台克隆的虚拟机均进行以上操作
保证:(1)不在同一个ip
(2)不在同一个端口启动
如图:
ip redis运行端口
192.168.253.16 7001
192.168.253.21 7002
192.168.253.22 7003
192.168.253.23 7004
192.168.253.24 7005
192.168.253.25 7006
7.在6个虚拟机分别启动redis
因为没有更改文件名称,可以直接去每个虚拟机粘贴执行即可
/usr/local/bin/redis-server /usr/local/bin/redis_cluster/redis7001.conf
ps -ef | grep redis 查看进程
8.创建redis集群
/usr/local/bin/redis-cli --cluster create 192.168.253.16:7001 192.168.253.21:7002 192.168.253.22:7003 192.168.253.23:7004 192.168.253.24:7005 192.168.253.25:7006 --cluster-replicas 1
cluster-replicas 1
1其实代表的是一个比例,就是主节点数/从节点数的比例。会按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
这里输入 yes 如下图创建集群成功
切记 先开启服务端在连接客户端
9.使用cli连接redis集群
使用客户端链接集群 必须使用 -c 连接
/usr/local/bin/redis-cli -c -h 192.168.253.21 -p 7002
10.查看集群的节点的信息 :cluster nodes
11.检查集群的状态
/usr/local/bin/redis-cli --cluster check 192.168.253.21:7002
12.添加主节点
新建虚拟机,配置 ip 与 .conf文件,与前六台配置一样。
例如 IP 192.168.253.26 redis服务端口 7007
启动服务后
/usr/local/bin/redis-cli --cluster add-node 192.168.253.26:7007 192.168.253.21:7002
前面的IP加端口号是要添加的redis节点,后面的IP和端口号是集群中的任意一个节点。
13.配置从节点
新建虚拟机 配置 IP 与 端口
例如 IP 192.168.253.27 redis服务端口 7008
刚才添加的主节点还没有分配槽,所以无法使用
添加从节点之前需要设置从节点并启动节点
--cluster-master-id 为从节点对应主节点的id
列: 添加刚才主节点的从节点
/usr/local/bin/redis-cli --cluster add-node 192.168.253.27:7008 192.168.253.26:7007 --cluster-slave --cluster-master-id 刚才添加的主节点的id
14.重新分配slots
添加的主节点还不能使用,因为没有分配slots,
slot的概念。slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读
/usr/local/bin/redis-cli --cluster reshard 192.168.253.21:7002(要移动插槽的IP)
然后再执行后的输入框 输入 接收插槽的IP的id
最后输入 all 或 done
all 代表从所有有数据据节点进行迁移到目的节点,也可以选择 目标节点id回车,最后以done进行结束
done 代表结束
15.删除主节点
--cluster del-node 节点id
删除主节点需要先使用 reshard 把主节点的slots移到其他节点才可以
/usr/local/bin/redis-cli --cluster del-node 192.168.253.16:7007 67211a02cffe48ee7197092ca48e9e7294dc5961
16.删除从节点
--cluster del-node 集群 节点id
/usr/java/redis/bin/redis-cli --cluster del-node 192.168.159.34:7002 cd7545b656df4c8c97bd9d4210ce71880d0fdb54