案例概述
单节点Redis服务器带来的问题
●单点故障,服务不可用
●无法处理大量的并发数据请求
●数据丢失–大灾难
解决方法
●搭建Redis集群
Redis集群介绍
●Redis集群是一个提供在多个Redis间节点间共享数据的程序集
●Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
●Redis集群通过分区来提供一定程序的可用性,在实际环境中某个节点宕机或者不可达的情况下可继续处理命令
Redis集群的优势
●自动分割数据到不同的节点上
●整个集群的部分节点失败或者不可达的情况下能够继续处理命令
Redis集群的实现方法
●有客户端分片:所有的寻址都是定义在客户端中(后端语言)
●代理分片:由代理服务器去解决路由寻址和决定由哪台redis提供服务
●服务器端分片:没有代理端,路由和配置是在服务器端
Redis-Cluster数据分片
●Redis集群没有使用一致性hash,而是引入了哈希槽概念
●Redis集群有16384个哈希槽
●每个key通过CRC16校验后对16384取模来决定放置槽
●集群的每个节点负一部分哈希槽
Redis-Cluster数据分片(续)
●以3个节点组成的集群为例
- 节点A包含0到5500号哈希槽
- 节点B包含5501到11000号哈希槽
- 节点C包含11001到16384号哈希槽
●支持添加或者删除节点
- 添加删除节点无需停止服务
- 例如:
1.如果想添加个节点D,需要移动节点A B C中的部分槽到D上
2.如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除
Redis-Cluster的主从复制模型
●集群具有A B C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用
●为每个节点添加一个从节点A1 B1 C1整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1为新的主节点继续服务
●当B和B1都失败后,集群将不可用
Redis群集实验
实验环境
●Redis官网建议使用6台服务器搭建群集,3台master,3台slave
●我们用两台服务器模拟6台服务器,剩下的服务器添加网卡模拟
●Redis主服务器需要安装rvm和Ruby控制集群软件
推荐步骤
1.修改配置文件
[root@localhost utils]# vim /etc/redis/6379.conf
70 #bind 127.0.0.1 ##70行听地址注释,这样可以被访问
89 protected-mode no ##关闭保护模式
93 port 6379 ##去掉第93行注释,开启端口6379
137 daemonize yes ##去掉第137行注释,以独立进程启动
833 cluster-enabled yes ##去掉第833行注释,开启群集功能
841 cluster-config-file nodes-6379.conf ##去掉第841行注释,群集名称文件设置
847 cluster-node-timeout 15000 ##去掉第847行注释,群集超时时间设置
700 appendonly yes ##去掉第700行注释,开启aof持久化
[root@localhost utils]# cd /var/lib/redis/6379/
[root@localhost 6379]# /etc/init.d/redis_6379 restart
生成了三个文件,appendonly.aof是AOF持久化文件,dump.rdb是RDB快照文件,nodes-6379.conf是节点首次启动生成的配置文件
从服务器的配置到此就不需要配置了;
2.主服务器安装rvm,RUBY控制集群软件
[root@localhost 6379]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
[root@localhost 6379]# cd /opt/ ##切换到/opt目录下
[root@localhost opt]# ls
redis-5.0.7 rh rvm-installer.sh.txt
[root@localhost opt]# mv rvm-installer.sh.txt rvm-installer.sh ##将文件名称改为.sh结尾
[root@localhost opt]# ls
redis-5.0.7 rh rvm-installer.sh
[root@localhost opt]# chmod +x rvm-installer.sh ##给脚本增加权限
[root@localhost opt]# ls
redis-5.0.7 rh rvm-installer.sh
[root@localhost opt]# ./rvm-installer.sh
[root@localhost profile.d]# source /etc/profile.d/rvm.sh '//执行环境变量
[root@localhost profile.d]# rvm list known ##显示可以安装的版本
[root@localhost profile.d]# rvm install 2.4.10 ##安装2.4.10版本...这边安装时间过长建议开热点下载
[root@localhost profile.d]# ruby -v ##显示版本信息
ruby 2.4.10p364 (2020-03-31 revision 67879) [x86_64-linux]
[root@localhost profile.d]# rvm use 2.4.10 ##使用ruby2.4.10版本
Using /usr/local/rvm/gems/ruby-2.4.10
[root@localhost profile.d]# gem install redis ##再次安装redis
3.主服务器添加两张网卡
4.从服务器也需要添加两张网卡
主服务器修改两张网卡信息
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
从服务器修改两张网卡信息
主服务器上创建群集
[root@localhost network-scripts]# redis-cli --cluster create 192.168.148.131:6379 192.168.148.140:6379 192.168.148.141:6379 192.168.148.132:6379 192.168.148.142:6379 192.168.148.143:6379 --cluster-replicas 1
集群验证
1.几个节点都可以登录
[root@localhost network-scripts]# redis-cli -c -h 192.168.148.131
192.168.148.131:6379> exit
[root@localhost network-scripts]# redis-cli -c -h 192.168.148.132
192.168.148.132:6379> exit
[root@localhost network-scripts]# redis-cli -c -h 192.168.148.140
192.168.148.140:6379> exit
2.在主的服务器上新建数值,测试从服务器上是否备份了数据
[root@localhost network-scripts]# redis-cli -c -h 192.168.148.131
192.168.148.131:6379> set name zhangsan ##在主服务器的节点上设置键值
OK
192.168.148.131:6379> keys * ##显示所有键
1) "name"
192.168.148.131:6379> get name ##调用name键
"zhangsan"
[root@localhost network-scripts]# redis-cli -c -h 192.168.148.132 ##退出登录到从服务器节点上
192.168.148.142:6379> keys * ##显示所有键
1) "name"
192.168.148.132:6379> get name ##调用name的键值
-> Redirected to slot [5798] located at 192.168.148.131:6379
"zhangsan" ##键值被调用
3.在主的服务器上删除数值,测试从服务器上是否删除了数据
192.168.148.131:6379> keys *
1) "name"
192.168.148.131:6379> del name ##将name键删除
(integer) 1
[root@localhost network-scripts]# redis-cli -c -h 192.168.148.132
192.168.148.132:6379> keys * ##登录到从服务器节点上数据也被删除了
(empty list or set)
192.168.148.132:6379>