redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)


文章目录

    • 一、redis集群类型
    • 二、主从复制
      • 2.1、主从复制概念
      • 2.2、工作原理
      • 2.3、主从复制启用
      • 2.4、主从复制优缺点
        • 2.4.1、优点
        • 2.4.2、缺点
    • 三、哨兵模式
      • 3.1、基本概念
      • 3.2、哨兵模式的优缺点
        • 3.2.1、优点
        • 3.2.2、缺点
    • 四、Redis-Cluster集群
      • 4.1、cluster集群概述
      • 4.2、优缺点
    • 五、redis-cluster集群部署
      • 5.1、环境说明
      • 5.2、部署过程

一、redis集群类型
  • redis集群模式主要有以下几种方式:
    • 1、 主从复制(redis2.8版本之前的模式)
    • 2、Redis Sentinel 哨兵模式(redis2.8及之后的模式)
    • 3、Redis Cluster集群模式(客户端sharding)(redis3.0版本之后)
    • 4、Jedis sharding集群(客户端sharding)
    • 5、利用中间件代理
【redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)】在这里主要讲述主从复制、哨兵模式、Redis Cluster集群这三种方式。
二、主从复制 2.1、主从复制概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
主从复制架构图:
redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)
文章图片

2.2、工作原理
  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;(从服务器初始化完成)
  • 主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令 (从服务器初始化完成后的操作)
工作原理图:
redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)
文章图片

2.3、主从复制启用
从节点开启主从复制,有3种方式:
配置文件: 在从服务器的配置文件中加入:slaveof
启动命令: redis-server启动命令后加入 --slaveof
客户端命令: Redis服务器启动后,直接通过客户端执行命令:slaveof
,则该Redis实例成为从节点。
通过 info replication 命令可以看到复制的一些信息
2.4、主从复制优缺点
2.4.1、优点
  • 支持主从复制,可以进行读写分离
  • 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
  • Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
  • Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
  • Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
2.4.2、缺点
  • Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
三、哨兵模式 3.1、基本概念
当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
它的功能包括以下两个:
  • 1、监控主服务器和从服务器是否正常运行。
  • 2、主服务器出现故障时自动将从服务器转换为主服务器。
架构图:
redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)
文章图片

3.2、哨兵模式的优缺点
3.2.1、优点
  • 哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式都具有。
  • 主从可以自动切换,进行故障转移,系统更健壮,可用性更高。
3.2.2、缺点
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
四、Redis-Cluster集群 4.1、cluster集群概述
在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态,基本已经可以实现高可用,读写分离。
而Redis Cluster 是 Redis 的分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis 在 分布式 方面的需求。当遇到 单机内存、并发、流量 等瓶颈时,可以采用 Cluster 架构方案达到 负载均衡 的目的。
redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)
文章图片

在 redis-cluster 架构中,redis-master节点一般用于接收读写,而redis-slave节点则一般只用于备份, 其与对应的 master 拥有相同的 slot 集合,若某个 redis-master 意外失效,则再将其对应的 slave 进行升级为临时 redis-master。
4.2、优缺点
优点:
  • 无中心架构
  • 可扩展性高
  • 高可用性
  • 降低运维成本,提高系统的扩展性和可用性。
缺点:
  • 数据通过异步复制,不保证数据的强一致性。
  • 多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况。
五、redis-cluster集群部署 redis官方推荐使用6个节点,其中3个为主节点,3个为从节点。
一旦有master 发生故障的时候,Redis Cluster集群可以选举出对应的slave成为新的主节点,继续对外服务,从而保证服务的高可用性。
这里的实验模拟采用两个虚拟机,每个虚拟机三个网卡,充当6个节点。
5.1、环境说明
节点类型 IP地址 操作系统 所需软件包
master 192.168.100.128
192.168.100.100
192.168.100.101
centos7 redis-5.0.7.tar.gz
rvm-1.29.9.tar.gz
slave 192.168.100.131
192.168.100.102
192.168.100.103
centos7 redis-5.0.7.tar.gz
5.2、部署过程
1、master 和 slave节点都安装redis包,步骤一样
//先安装防火墙 systemctl stop firewalld setenforce 0//通过yum工具,安装编译工具 yum install gcc gcc-c++ make -y //解压redis软件包 tar xzvf redis-5.0.7.tar.gz -C /opt//编译且安装 cd /opt/redis-5.0.7/ make make PREFIX=/usr/local/redis install//开启服务,设置各类文件 cd /opt/redis-5.0.7/utils/[root@localhost utils]# ./install_server.sh Welcome to the redis service installer This script will help you easily set up a running redis server Please select the redis port for this instance: [6379] Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf]//定义主配置文件 Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log]//定义日志文件 Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] //数据文件 Selected default - /var/lib/redis/6379 Please select the redis executable path [] /usr/local/redis/bin/redis-server //可执行文件路径,需要自行定义 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/redis/bin/redis-server Cli Executable : /usr/local/redis/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf => /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful!//创建软链接,便于服务控制 ln -s /usr/local/redis/bin/* /usr/local/bin/

2、主从节点都修改配置文件,进行优化
vim /etc/redis/6379.conf 70行/注释掉 bind 项#注释后监听所有IP地址 89/ protected mode no#关闭保护模式 93/ port 6379 137/ daemonize yes#以独立进程启动 700/ appendonly yes#开启aof持久化功能 833/ cluster-enabled yes#开启群集功能 841/ pluster-config-file nodes-6379.conf#群集名称文件设置 847/ cluster-node- timeout 15000#群集超时时间设置service redis_6379 restart#重启服务 ls /var/lib/redis/6379///生成下列三个文件说明设置成功 文件有: 1、持久化 appendonly.aof 文件 2、节点首次启动生成的nodes-6379.conf 配置文件。

redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)
文章图片

3、只在master节点操作,安装rvm、ruby等软件包
//安装管理 ruby的工具:rvm ,安装命令在官网找:http://rvm.io/ 1、安装GPG keys gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 注意:若出现超时状态,重新导入一次即可 2、安装RVM curl -sSL https://get.rvm.io | bash -s stable

安装完提示去网站下载ruby安装包:https://github.com/rvm/rvm/archive/1.29.9.tar.gz
redis集群之主从复制+哨兵模式+cluster群集(理论+实战,收获满满!!!)
文章图片

tar xzvf rvm-1.29.9.tar.gz -C /opt cd /opt/rvm-1.29.9/ ./install source /etc/profile.d/rvm.sh#执行环境变量rvm list known#列出ruby可以安装的版本 rvm install 2.4.1#安装ruby2.4.1版本,安装版本的事件会比较长 ruby -v#查看当前ruby版本gem install redis#再次安装redis

4、分别在主、从服务器上添加两张网卡(NAT模式),设置IP地址
主服务器的IP地址:
[root@localhost network-scripts]# ifconfig ens33: flags=4163mtu 1500 inet 192.168.100.128netmask 255.255.255.0broadcast 192.168.100.255 inet6 fe80::c7ca:cf27:f0bb:92aaprefixlen 64scopeid 0x20 ether 00:0c:29:67:b0:5dtxqueuelen 1000(Ethernet) RX packets 816405bytes 290626803 (277.1 MiB) RX errors 0dropped 0overruns 0frame 0 TX packets 1003561bytes 150373025 (143.4 MiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0ens36: flags=4163mtu 1500 inet 192.168.100.100netmask 255.255.255.0broadcast 192.168.100.255 inet6 fe80::d4d1:edc1:f4fe:dc9cprefixlen 64scopeid 0x20 inet6 fe80::7aa5:ee9:42b9:c023prefixlen 64scopeid 0x20 ether 00:0c:29:67:b0:71txqueuelen 1000(Ethernet) RX packets 4642bytes 1339135 (1.2 MiB) RX errors 0dropped 0overruns 0frame 0 TX packets 4207bytes 746165 (728.6 KiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0ens37: flags=4163mtu 1500 inet 192.168.100.101netmask 255.255.255.0broadcast 192.168.100.255 inet6 fe80::4c48:e4cd:3aa9:a652prefixlen 64scopeid 0x20 inet6 fe80::b066:20a7:751d:dc88prefixlen 64scopeid 0x20 ether 00:0c:29:67:b0:67txqueuelen 1000(Ethernet) RX packets 4646bytes 1340305 (1.2 MiB) RX errors 0dropped 0overruns 0frame 0 TX packets 4195bytes 743666 (726.2 KiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0

从服务器的IP地址:
[root@localhost network-scripts]# ifconfig ens33: flags=4163mtu 1500 inet 192.168.100.131netmask 255.255.255.0broadcast 192.168.100.255 inet6 fe80::3661:4f5c:6149:3ae1prefixlen 64scopeid 0x20 inet6 fe80::c7ca:cf27:f0bb:92aaprefixlen 64scopeid 0x20 ether 00:0c:29:72:f9:68txqueuelen 1000(Ethernet) RX packets 680326bytes 405482087 (386.6 MiB) RX errors 0dropped 0overruns 0frame 0 TX packets 682537bytes 100916715 (96.2 MiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0ens36: flags=4163mtu 1500 inet 192.168.100.102netmask 255.255.255.0broadcast 192.168.100.255 inet6 fe80::7aa5:ee9:42b9:c023prefixlen 64scopeid 0x20 ether 00:0c:29:72:f9:7ctxqueuelen 1000(Ethernet) RX packets 4387bytes 1273664 (1.2 MiB) RX errors 0dropped 0overruns 0frame 0 TX packets 3669bytes 644059 (628.9 KiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0ens37: flags=4163mtu 1500 inet 192.168.100.103netmask 255.255.255.0broadcast 192.168.100.255 inet6 fe80::b066:20a7:751d:dc88prefixlen 64scopeid 0x20 ether 00:0c:29:72:f9:72txqueuelen 1000(Ethernet) RX packets 2677bytes 756825 (739.0 KiB) RX errors 0dropped 0overruns 0frame 0 TX packets 1855bytes 328843 (321.1 KiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0

5、创建集群
[root@localhost src]# redis-cli --cluster create --cluster-replicas 1 192.168.100.128:6379 192.168.100.100:6379 192.168.100.101:6379 192.168.100.131:6379 192.168.100.102:6379 192.168.100.103:6379 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.100.102:6379 to 192.168.100.131:6379 Adding replica 192.168.100.103:6379 to 192.168.100.100:6379 Adding replica 192.168.100.132:6379 to 192.168.100.101:6379 M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.128:6379 slots:[0-5460] (5461 slots) master M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.100:6379 slots:[5461-10922] (5462 slots) master M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.101:6379 slots:[10923-16383] (5461 slots) master S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.131:6379 replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1 S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.102:6379 replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1 S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.103:6379 replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1 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 192.168.100.131:6379) M: ed2d5df0072fd2d41d7d284753bdf565b549c6a1 192.168.100.128:6379 slots:[0-16383] (16384 slots) master 1 additional replica(s) S: 35ae81002d4a47f3a649e2a3aebdf084222e5a6a 192.168.100.131:6379 slots: (0 slots) slave replicates ed2d5df0072fd2d41d7d284753bdf565b549c6a1 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

6、验证群集功能,一个主节点master对应一个从节点slave。
[root@localhost ~]# redis-cli -h 192.168.100.128 -p 6379#进入192.168.100.128的数据库里 192.168.100.128:6379> set name zhangsan#创建一个键值对 OK 192.168.100.128:6379> keys *#查看所有键 1) "name" 192.168.100.128:6379> get name#查看name键的值 "zhangsan" 192.168.100.128:6379> exit [root@localhost ~]# redis-cli -h 192.168.100.102 -p 6379#进入192.168.100.102的数据库里 192.168.100.102:6379> keys * 1) "name" 192.168.100.102:6379> get name (error) MOVED 5474 192.168.100.131:6379 192.168.100.102:6379> exit [root@localhost ~]# redis-cli -h 192.168.100.131 -p 6379 192.168.100.131:6379> keys * 1) "name" 192.168.100.131:6379> get name "zhangsan"

    推荐阅读