一、案例概述
- 单节点Redis服务器带来的问题
- 单点故障,服务不可用
- 无法处理大量的并发数据请求
- 数据丢失一大灾难
- 解决方法:搭建Redis集群
二、Redis群集介绍
- Redis群集是一个提供在多个Redis间节点间共享数据的程序集
- Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
- Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令
- Redis集群的优势
- 自动分割数据到不同的节点上
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令
- Redis集群的实现方法
- 有客户端分片
- 代理分片
- 服务器分片
- 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节点从集群中移除
-
Redis-Cluster的主从复制模型
①集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用
②为每个节点添加一个从节点A1、B1、C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选择B1位新的主节点继续服务
③当B和B1都失败后,集群将不可用
三、Redis群集搭建
- 实验环境:VMware Workstation 15.5、Xshell 6、Centos7.6
- 实验准备:在两台服务器上各添加2块网卡(每台一共3块)并安装Redis
- 服务器IP规划:
服务器名(网卡) | IP地址 |
---|---|
master(ens33) | 192.168.50.133 |
master(ens36) | 192.168.50.130 |
master(ens37) | 192.168.50.131 |
slave(ens33) | 192.168.50.134 |
slave(ens36) | 192.168.50.132 |
slave(ens37) | 192.168.50.136 |
- 实验步骤:
1、关闭两台服务器的防火墙
setenforce 0
iptables -F
2、分别编辑Redis配置文件
vim /etc/redis/6379.conf ## 编辑配置文件
修改如下内容:(前面的数字为行号)
70 注释掉 #bind 127.0.0.1
89 protected-mode no //yes改为no(关闭保护模式)
137 daemonize yes
833 # cluster-enabled yes //去掉注释(以独立进程启动)
841 cluster-config-file nodes-6379.conf //去掉注释(群集名称文件设置)
847 # cluster-node-timeout 15000 //去掉注释(群集超时时间设置)
700 appendonly yes //no改为yes(开启aof持久化)
3、重启Redis服务
/etc/init.d/redis_6379 restart
cd /var/lib/redis/6379 //进入目录
可以看到三个文件:
-rw-r--r--. 1 root root 0 9月 9 15:20 appendonly.aof ## 持久化AOF文件
-rw-r--r--. 1 root root 92 9月 9 15:20 dump.rdb
-rw-r--r--. 1 root root 114 9月 9 15:20 nodes-6379.conf ## 首次启动生成
4、导入key文件
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
5、从本地上传脚本到主服务器并添加执行权限
下载地址:https://wwa.lanzous.com/i93nrghemyd
chmod +x rvm-installer.sh
6、执行脚本
./rvm-installer.sh
7、执行环境变量
source /etc/profile.d/rvm.sh
8、列出Ruby可安装的按本
rvm list known
9、安装Ruby2.4.10版本【等待时间较长,耐心等待】
rvm install 2.4.10
10、使用Ruby2.4.10版本
rvm use 2.4.10
11、查看当前Ruby2.4.10版本
ruby -v ## 查看ruby版本
返回结果:ruby 2.4.10p364 (2020-03-31 revision 67879) [x86_64-linux]
12、再次安装Redis(构建群集)
gem install redis
13、进行集群开启前配置
vim /etc/redis/6379.conf ## 编辑配置文件
主服务器上更改第70行:
70 bind 192.168.50.133 192.168.50.130 192.168.50.131
从服务器上更改第70行:
70 bind 192.168.50.134 192.168.50.132 192.168.50.136
修改完成后重启Redis服务:/etc/init.d/redis_6379 restart
查看服务状态:netstat -nultp | grep 6379
[root@localhost profile.d]# netstat -nultp | grep 6379
tcp 0 0 192.168.50.131:6379 0.0.0.0:* LISTEN 102094/redis-server
tcp 0 0 192.168.50.130:6379 0.0.0.0:* LISTEN 102094/redis-server
tcp 0 0 192.168.50.133:6379 0.0.0.0:* LISTEN 102094/redis-server
tcp 0 0 192.168.50.131:16379 0.0.0.0:* LISTEN 102094/redis-server
tcp 0 0 192.168.50.130:16379 0.0.0.0:* LISTEN 102094/redis-server
tcp 0 0 192.168.50.133:16379 0.0.0.0:* LISTEN 102094/redis-server
14、开启集群
redis-cli --cluster create 192.168.50.133:6379 192.168.50.130:6379 192.168.50.131:6379 192.168.50.134:6379 192.168.50.132:6379 192.168.50.136:6379 --cluster-replicas 1
15、验证试验结果
[root@localhost profile.d]# redis-cli -c -h 192.168.50.133
192.168.50.133:6379> set name tom
OK
[root@localhost profile.d]# redis-cli -c -h 192.168.50.131
192.168.50.131:6379> get name
"tom"
[root@localhost profile.d]# redis-cli -c -h 192.168.50.136
192.168.50.133:6379> get name
"tom"