NoSQL之Redis集群

文章目录

  • 一、案例概述
    • 1.1 单节点Redis服务器带来的问题
    • 1.2 解决方法
  • 二、案例前置知识点
    • 2.1 Redis集群介绍
    • 2.2 Redis集群的优势
    • 2.3 Redis集群的实现方法
    • 2.4 Redis-Cluster数据分片
    • 2.5 Redis-Cluster的主从复制模型
  • 三、案例环境
    • 案例拓扑图
  • 四、案例实施
    • 实验
      • 环境
      • 过程

一、案例概述

1.1 单节点Redis服务器带来的问题

  • 单点故障,服务不可用
  • 无法处理大量的并发数据请求
  • 数据丢书一大灾难

1.2 解决方法

  • 搭建Redis集群

二、案例前置知识点

2.1 Redis集群介绍

  • Redis集群是一个提供在多个Redis间节点间共享数据的程序集(路由)
  • Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
  • Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

2.2 Redis集群的优势

  • 自动分割数据到不同的节点上
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令

2.3 Redis集群的实现方法

  • 有客户端分片
    NoSQL之Redis集群_第1张图片

  • 代理分片
    NoSQL之Redis集群_第2张图片

  • 服务器端分片
    NoSQL之Redis集群_第3张图片
    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都失败后,集群将不可用

三、案例环境

案例拓扑图

NoSQL之Redis集群_第4张图片

四、案例实施

  • 设置网络参数、关闭防火墙和selinux(所有节点)

  • 下载并安装Redis(所有节点)

  • 修改Redis配置文件(所有节点)

  • 创建Redis集群(master1节点)

    • 导入key文件并安装rvm
    • 执行环境变量让其生效
    • 安装Ruby2.4.1版本
    • 安装redis客户端
    • 创建redis集群
  • 调整Redis集群主从关系

    • 删除所有的从节点(master1节点)
    • 删除节点配置文件和持久化文件(slave1、2、3节点)
    • 重新添加从节点(master1节点)
    • 检查新的主从关系(master节点)
  • 测试集群数据读写

实验

环境

两台虚拟机,每台配置三个网卡,第一台作为master,第二台作为slave

过程

'设置网络参数、关闭防火墙和selinux(所有节点)'
iptables -F
setenforce 0 

yum install gcc gcc-c++ -y

#拖入安装包 redis-5.0.7.tar.gz

tar zxvf redis-5.0.7.tar.gz -C /opt/

cd /opt/redis-5.0.7 
make
make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/* /usr/local/bin/


cd /opt/redis-5.0.7/utils/
./install_server.sh
... #一直回车
    #输入ok 

Selected config:
Port : 6379
Config file : /etc/redis/6379.conf    //配置文件路径
Log file : /var/log/redis_6379.log    //日志文件路径
Data dir : /var/lib/redis/6379          //数据文件路径
Executable : /usr/local/bin/redis-server   //可执行文件路径
Cli Executable : /usr/local/bin/redis-cli    //客户端命令工具

[root@localhost utils]# netstat -lnupt | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      100865/redis-server 
'修改Redis配置文件(所有节点)'
vim /etc/redis/6379.conf 
  70 #bind 127.0.0.1     ##注释掉bind项,redis中bind选项默认监听所有网卡
  89 protected-mode no    ##关闭保护模式
  93 port 6379
 137 daemonize yes    ##以独立进程启动
 700 appendonly yes   ##开启aof持久化
 833 cluster-enabled yes   ##开启群集功能
 841 cluster-config-file nodes-6379.conf     ##群集名称文件设置
 847 cluster-node-timeout 15000     ##群集超时时间设置

/etc/init.d/redis_6379 restart

'正常启动后,/var/lib/redis/6379/目录下会多出两个文件,'
'一个是持久化appendonly.aof文件,另外一个节点自动生成的nodes-6379.conf配置文件。'
'创建Redis集群(master1节点)'
'##导入key文件'
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

cd /opt/
##拖入软件包 rvm-installer.sh   '(可从网站下载:另存为rvm-installer.sh文件,运行:curl -sSL https://get.rvm.io | bash -s stable)'

chmod +x rvm-installer.sh

'##执行脚本'
./rvm-installer.sh       

'##执行环境变量'
cd /etc/profile.d/
source /etc/profile.d/rvm.sh

'##列出Ruby可安装的版本'
rvm list known

'##安装2.4.10版本'
rvm install 2.4.10

'##使用Ruby2.4.10版本'
rvm use 2.4.10

'##查看当前Ruby2.4.10版本'
ruby -v

'##再次安装Redis'
gem install redis

'##创建集群'
'六个实例分为三组,每组一主一从,--replicas 1 表示每组一个从,下面交互的时候,需要输入yes才可以创建。'
'使用源码解压目录中的redis-trib.rb 工具创建群集。'
M:
14.0.0.77
14.0.0.131
14.0.0.132

S:
14.0.0.99
14.0.0.133
14.0.0.134


vim /etc/redis/6379.conf
bind 14.0.0.77 14.0.0.131 14.0.0.132    ##监听三个地址
/etc/init.d/redis_6379 restart


vim /etc/redis/6379.conf
bind 14.0.0.99 14.0.0.133 14.0.0.134
/etc/init.d/redis_6379 restart
'###创建哈希槽'
redis-cli --cluster create 14.0.0.77:6379 14.0.0.131:6379 14.0.0.132:6379 14.0.0.99:6379 14.0.0.133:6379 14.0.0.134:6379 --cluster-replicas 1

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 14.0.0.133:6379 to 14.0.0.77:6379
Adding replica 14.0.0.134:6379 to 14.0.0.131:6379
Adding replica 14.0.0.99:6379 to 14.0.0.132:6379
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.77:6379
   slots:[0-16383] (5461 slots) master
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.131:6379
   slots:[0-16383] (5462 slots) master
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.132:6379
   slots:[0-16383] (5461 slots) master
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.99:6379
   replicates 99c08e17828e26502410da43e06bffc9e241b261
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.133:6379
   replicates 99c08e17828e26502410da43e06bffc9e241b261
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.134:6379
   replicates 99c08e17828e26502410da43e06bffc9e241b261
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 14.0.0.77:6379)
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.77:6379
   slots:[0-16383] (16384 slots) master
   1 additional replica(s)
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.133:6379
   slots: (0 slots) slave
   replicates 99c08e17828e26502410da43e06bffc9e241b261
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
redis-cli -c -h 14.0.0.77    '##进入master'
set name zhangsan

'##进入其他节点(slave)'
redis-cli -c -h 14.0.0.131
get name
redis-cli -c -h 14.0.0.132
get name
redis-cli -c -h 14.0.0.99
get name
redis-cli -c -h 14.0.0.133
get name
redis-cli -c -h 14.0.0.134
get name

你可能感兴趣的:(缓存加速,redis,linux,经验分享)