Redis的主从复制、哨兵、集群的见解与认识

主从复制

就是创建多个服务器,将其中一台作为主服务器(主节点),其它作为从服务器(从节点),而数据的复制只能是单向的,也就是主节点的数据复制到从节点上。一般Redis服务器而言每台都是一个主节点,并且一般情况是一个主节点可以有多个从节点或没有从节点,而一个从节点只能有一个主节点。

那么主从复制的作用为何?

  1. 数据冗余:实现了数据的热备份,算一种持久化之外的冗余方法。
  2. 故障恢复:就是保障服务不中断,因为主节点出现问题时会由从节点代替提供服务,算是一种服务的冗余。
  3. 负载均衡:在主从复制的基础上配合读写分离,它是这样的主节点提供写服务,从节点提供读服务,可以分担服务器负载加快读写速度,提高了并发量(一般情况下写少读多,所以从节点提高读服务)。
  4. 高可用基础:哨兵和集群是建立在主从复制的基础上完成的。

主从复制流程

从节点会发送命令请求同步连接,主节点就会启动一个后台进程将数据块中保存到数据文件(数据文件保存的内容是修改数据的所有命令)。完成数据文件后,主节点会将数据文件发送给从节点同步数据(接收数据文件加载到内存),同步期间主节点所有修改数据操作都会发给从节点,若是从节点宕机恢复后也会重新连接。连接主节点后主节点就会发送最新的数据文件同步数据,如果有多个从节点向主节点请求连接,那么主节点还是在后台启动一个进程来保存数据文件,保存好之后会发送给所有从节点同步。

主从复制部署——Redis

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

主节点

-----------修改Redis 配置文件(Master节点操作) ----------
vim /etc/redis/6379.conf
bind 0.0.0.0         			   #70行,注释掉bind项,或修改为0.0.0.0,默认监听所有网卡
daemonize yes         			   #137行,开启守护进程
logfile /var/log/redis_6379.log    #172行,指定日志文件目录
dir /var/lib/redis/6379            #264行,指定工作目录
appendonly yes       			   #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart

从节点

-----------修改Redis 配置文件(Slave节点操作)------------
vim /etc/redis/6379.conf
bind 0.0.0.0        				 #70行,修改监听地址为0.0.0.0
daemonize yes       				 #137行,开启守护进程
logfile /var/log/redis_6379.log      #172行,指定日志文件目录
dir /var/lib/redis/6379              #264行,指定工作目录
replicaof 192.168.80.10 6379         #287行,取消注释并指定要同步的Master节点IP和端口
appendonly yes       				 #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart

测试主从节点

-------------验证主从效果-------------
在Master节点上看日志:
tail -f /var/log/redis_6379.log
在Master节点上验证从节点:
redis-cli
127.0.0.1:6379> info replication

在这里插入图片描述
在这里插入图片描述

哨兵模式

哨兵模式建立在主从复制的基础上,引入主节点的自动故障转移。
原理:属于一个分布式系统,主要是用于监控(监控主从结构下每台服务器),若主节点出现故障就会通过一种投票机制选择新的主节点(将选取从节点提升为主节点),每个运行哨兵的集群下节点数不能少于3个。

哨兵的作用

  1. **监控:**检查主节点与从节点是否正常。
  2. **自动故障转移:**实际就是将主节点下的一个从节点提升为主节点代替提供服务(投票机制选取从节点),主节点修复后会。
  3. 通知:会将故障转移结果发送给客户端。

哨兵的结构

哨兵结构的两部分:

  1. 哨兵节点:属于哨兵系统中的单元,不存储数据,算得上一个特殊的Redis系统。
  2. 数据节点:就是主从节点。

哨兵节点的建立部署是以主从结构为基础的,需要在每一台主从节点上部署哨兵,以此监控主节点是否正常运行,当主节点发生故障时,哨兵节点之间会进行投票 判断主节点是否正常运行,当票数过半则认定主节点不能正常运行,然后从节点会选举代替原本主节点,成为新的节点。

客观下线为主节点概念,但从节点和哨兵节点发生故障,被哨兵主观下线,那么客观下线就会消失也就没有故障转移

部署哨兵

--------修改Redis哨兵模式的配置文件(所有节点操作) --------
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no     #17行,关闭保护模式
port 26379            #21行,Redis哨兵默认的监听端口
daemonize yes         #26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log"     #36行,指定日志存放路径
dir "/var/lib/redis/6379"           #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.80.10 6379 2        #84行, 修改
指定该哨兵节点监控192.168.80.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000   #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000        #146行,故障节点的最大超时时间为180000 (180秒 )

启动哨兵

----------启动哨兵模式-----------------
注意:先启master,再启slave
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

查看哨兵信息

-----------查看哨兵信息------------------
redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.80.10:6379,slaves=2,sentinels=3

模拟故障

---------故障模拟--------------
#查看redis-server进程号(在Master 上进行):
ps -ef | grep redis
root      16913      1  0 19:12 ?        00:00:20 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root      18991      1  0 22:37 ?        00:00:02 redis-sentinel *:26379 [sentinel]
root      19141  16668  0 22:50 pts/1    00:00:00 grep --color=auto redis
#杀死 Master 节点上redis-server的进程号
kill -9 57521      #Master节点上redis-server的进程号

验证结果

#验证结果,查看master是转换至从服务器
tail -f /var/log/sentinel.log
#在Slave1上查看是否转换成功
redis-cli -p 26379 INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.80.20:6379,slaves=2,sentinels=3

集群模式

Redis3.0开始引入分布式存储方案。集群是由多个节点组成的,而Redis的数据分布在这些节点中。而这些节点也划分为主节点(读写请求和维护集群信息)和从节点(复制主节点数据和状态信息)

集群的作用

1. 数据分区:即为数据分片,就是将数据分散在多个节点上存储,既能解决单机内存大小限制(存储容量增大),也能让每个主节点向外提供读写服务。这样就提高了集群的响应能力。(单机内存问题:内存太大时bgsave、bgrewriteao的fork操作导致主进程阻塞,主从环境会导致从节点无法提供服务,全量复制阶段主节点复制缓冲区也会溢出。各种毛病)
2. 高可用:集群支持了主从复制中主节点(如哨兵模式)的自动故障转移,而且任一节点发生故障也能对外提供服务。

那我们谈谈什么是数据分片

  1. 对Redis集群,引入了哈希槽概念(将内存划分为若干个哈希槽),
  2. Redis集群有16384个哈希槽(0~16383)
  3. 集群的每个节点负责了一部分哈希槽。
  4. 每个Key 通过 CRC16 校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作(这部分很复杂)

比如现有三个Redis节点,那么 16384 个哈希槽会均分为三部分,供三个节点使用。

集群下的主从复制中,有三个节点,哈希槽也被均分给这三个节点,这种情况如果一个节点故障就会导致该节点哈希槽的数据丢失,所以为解决此问题通过给每个节点添加从节点当该服务主节点宕机后群集会选举从节点为主节点继续服务。但是两个节点都宕机则集群就会瓦解。

Redis集群部署

原本需要准备六台服务器的,而我偷懒就在一台机器上部署算了,做为实验。

通过配置文件,生成自身所需所有节点

redis的集群一般需要6个节点, 3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分: 3个主节点端口号: 6001/6002/6003, 对应的从节点端口号: 6004/6005/6006
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}
for i in {1. .6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done

通过修改配置文件开启群集功能

#其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。
cd /etc/redis/redis-cluster/redis6001
vim redis.conf
#bind 127.0.0.1         #69行,注释掉bind项,默认监听所有网卡
protected-mode no       #88行,修改,关闭保护模式
port 6001               #92行,修改,redis监听端口
daemonize yes           #136行,开启守护进程,以独立进程启动
appendonly yes          #699行,修改,开启AOF持久化
cluster-enabled yes     #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf    #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000             #846行,取消注释群集超时时间设置
#可以写一个for循环将6001的文件复制给6002~6006,这样就不需要全部一个一个文件进行修改了
for i in {2..6}
do
/usr/bin/cp -f /etc/redis/redis-cluster/redis6001/redis.conf /etc/redis/redis-cluster/redis600$i/redis.conf
done
#之后稍微修改文件即可(修改以下两个配置项):
92行,修改,redis监听端口
840行,取消注释,群集名称文件设置

启动服务器上的所有节点用于测试

# 启动redis节点(方法一)
分别进入那六个文件夹,执行命令: redis-server redis.conf,来启动redis节点
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf
## 使用for循环一键启动所有节点(方法二)
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
ps -ef | grep redis

启动群集

#启动集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
#六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候需要输入yes 才可以创建。
-replicas 1       #表示每个主节点有1个从节点。

测试群集

#测试群集
redis-cli -p 6001 -c              #加-c参数,节点之间就可以互相跳转
127.0.0.1:6001> cluster slots     #查看节点的哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922      #哈希槽编号范围
   3) 1) "127.0.0.1" .
      2) (integer) 6003       #主节点IP和端口号
      3) " fdca661922216dd69a 63a7c9d3c4540cd6baef44"
   4) 1) "127.0.0.1"
      2) (integer) 6004       #从节点IP和端口号
      3) "a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "0e5873747a2e2 6bdc935bc76c2ba fb19d0a54b11"
   4) 1) "127.0.0.1"
      2) (integer) 6006
      3) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 10923 
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "81 6ddaa3d14 69540b2f fbcaaf9aa867646846b30"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) "f847077bfe6722466e96178ae8cbb09dc8b4d5eb"
127.0.0.1:6001> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1: 6003
OK
127.0.0.1:6001> cluster keyslot name    #查看name键的槽编号
(integer) 5798

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值