一、案例概述
1.1单节点Redis服务器带来的问题
单点故障,服务不可用
无法处理大量的并发数据请求
数据丢书一大灾难
1.2 解决方法
搭建Redis集群
二、案例前置知识点
2.1 Redis集群介绍
Redis集群是一个提供在多个Redis间节点间共享数据的程序集(路由)
Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令
2.2 Redis集群的优势
自动分割数据到不同的节点上
整个集群的部分节点失败或者不可达的情况下能够继续处理命令
2.3 Redis集群的实现方法
有客户端分片
代理分片
服务器端分片
Redis群集:去中心化模式——>区块链用的多
2.4 Redis-Cluster数据分片
Redis集群没有使用一致性hash,而是引入了哈希槽概念
Redis集群有16384个哈希槽
每个key通过CRC16校验后对16384取模来决定放置槽
集群的每个节点负责一部分哈希槽
以3个节点组成的集群为例
节点A包含0到5500号到哈希槽
节点B包含5501到11000号哈希槽
节点C包含11001到16384号哈希槽
支持添加或者删除节点
添加删除节点无需停止服务
例如
如果想新添加节点D,需要移动节点A、B、C中的部分槽到D上
如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除
2.5 Redis-Cluster的主从复制模型
集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会缺少5501-11000这个范围的槽而不可用
为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1成为新的主节点继续服务
当B和B1都失败后,集群将不可用
三、案例环境
案例拓扑图
操作系统 | 配置 | 主机名 | ip |
Centos7.9 | 2G4G | master1 | 192.168.10.129 |
Centos7.9 | 2G4G | master2 | 192.168.10.130 |
Centos7.9 | 2G4G | master3 | 192.168.10.131 |
Centos7.9 | 2G4G | slave1 | 192.168.10.132 |
Centos7.9 | 2G4G | slave2 | 192.168.10.133 |
Centos7.9 | 2G4G | slave3 | 192.168.10.134 |
案例实施
下载并安装Redis(所有节点)
修改Redis配置文件(所有节点)
#6台虚拟机都要做, # 准备Redis源码包
[root@master1 ~]# ls anaconda-ks.cfg redis-4.0.9.tar.gz
# 安装gcc环境
[root@master1 ~]# yum -y install gcc gcc-* # 解包,配置,编译安装
[root@master1 ~]# tar zxf redis-4.0.9.tar.gz
[root@master1 ~]# cd redis-4.0.9
[root@master1 redis-4.0.9]# make && make PREFIX=/usr/local/redis install
# 查看返回结果,以免安装出错
[root@master1 redis-4.0.9]# echo $? 0
[root@master1 redis-4.0.9]# cd utils/
# 创建软链接
[root@master1 utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
#执行脚本,一直回车就可以
[root@master1 utils]# ./install_server.sh
# 查看6379端口号
[root@master1 utils]# ss -nlpt | grep 6379 LISTEN 0 128 127.0.0.1:6379
修改Redis配置文件 [root@master1 ~]# vi /etc/redis/6379.conf
70行加注释
89行yes改成no
815行删注释
823行删注释,829删注释并把后面的15000参数改成5000
673行改成yes
#因为一个一个改太麻烦了所以,先把第一台配置文件改好然后用 SCP命令进行复制传输给每台虚拟机
[root@master1 utils]# scp /etc/redis/6379.conf root@192.168.10.130:/etc/redis/6379.conf
SCP命令用于在本地主机和远程主机之间复制文件或目录。 /etc/redis/6379.conf #需要传输的文件以及目录 root@192.168.10.130 接收用户,ip /etc/redis/6379.conf #传输位置 SCP命令的基本语法如下: scp [选项] [源文件] [目标文件] 常用的选项包括: -r:递归复制目录及其内容。 -P:指定远程主机的端口号。 -i:指定用于身份验证的私钥文件。 -v:显示详细的传输信息。 #改完刷新重启
[root@master1 ~]# /etc/init.d/redis_6379 restart
创建Redis集群(master1节点)
在master1节点拉取ruby-2.6.9的源码包
# 安装所需依赖包
[root@master1 ~]# yum -y install zlib-devel openssl-devel
[root@master1 ~]# sudo yum install -y gcc make openssl-devel readline-devel zlib-devel
# 编译安装
[root@master1 ~]# tar zxvf ruby-2.6.9.tar.gz -C /usr/src/
[root@master1 ~]# cd /usr/src/ruby-2.6.9/
[root@master1 ~]# ./configure --prefix=/usr/local/ruby-2.6.9
[root@master1 ~]# make && make install
# 优化执行路径
[root@master1 ~]# ln -s /usr/local/ruby-2.6.9/bin/ruby /usr/bin/ruby
[root@master1 ~]# ln -s /usr/local/ruby-2.6.9/bin/gem /usr/bin/gem
# 查看版本
[root@master1 ~]# ruby -v
[root@master1 ~]# gem -v
# 使用gem安装redis依赖
[root@master1 ~]# gem install redis
#验证安装结果 [root@master1 ruby-2.6.9]# echo $? 0
# 创建redis集群
[root@master1 ~]# redis-4.0.9/src/redis-trib.rb create --replicas 192.168.10.129:6379 192.168.10.130:6379 192.168.10.131:6379 \ 192.168.10.132:6379 192.168.10.133:6379 192.168.10.134:6379
# 删除所有的从节点(master1节点)
[root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb del-node 192.168.10.133:6379 e078b85f41ce868e02751a82e4ee69865ed249e8 >>> Removing node e078b85f41ce868e02751a82e4ee69865ed249e8 from cluster 192.168.10.133:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
[root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb del-node 192.168.10.132:6379 7b09ef916953d5f12aeaa577dd0209da55d897a3 >>> Removing node 7b09ef916953d5f12aeaa577dd0209da55d897a3 from cluster 192.168.10.132:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
[root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb del-node 192.168.10.134:6379 a14a3300355f68ed9993b793ce2f1fd67b216f8e >>> Removing node a14a3300355f68ed9993b793ce2f1fd67b216f8e from cluster 192.168.10.134:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
#删除节点配置文件和持久化文件(slave1、2、3节点) #在3个slave节点执行
[root@slave3 ~]# cd /var/lib/redis/6379/
[root@slave3 6379]# rm -rf appendonly.aof dump.rdb nodes-6379.conf
[root@slave3 6379]# /etc/init.d/redis_6379 restart
[root@slave3 6379]# echo $? 0
# 重新添加从节点(master1节点)
[root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb add-node --slave --master-id 2a5eabacf684cdc7fe96c70fd62c3bbfb9aa390f 192.168.10.132:6379 192.168.10.129:6379 [root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb add-node --slave --master-id dc0e877ee32557fca4280b5b9280a54c8f3412eb 192.168.10.133:6379 192.168.10.130:6379 [root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb add-node --slave --master-id 7096ea83fa6407d4a325a8c4e992f5914adbc8c9 192.168.10.134:6379 192.168.10.131:6379 # 检查新的主从关系(master节点)
[root@master1 ~]# /root/redis-4.0.9/src/redis-trib.rb check 192.168.10.129:6379
#测试集群数据读写
[root@master1 ~]# redis-cli -c 127.0.0.1:6379> set name zhangsan -> Redirected to slot [5798] located at 192.168.10.130:6379 OK 192.168.10.130:6379> set name zhangsan
[root@master1 ~]# redis-cli -c 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> [root@master2 utils]# redis-cli -c 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> get name "zhangsan"
结束