NoSQL之Redis集群

案例概述

单节点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> 

猜你喜欢

转载自blog.csdn.net/Cpureman/article/details/108503568