Redis的高可用——主从复制、哨兵模式、Redis群集部署

目录

Redis高可用

Redis主从复制

主从复制的作用

主从复制的流程

主从复制部署

Redis哨兵模式

哨兵的核心功能

哨兵模式的作用

哨兵结构的组成

哨兵模式故障转移机制

故障转移过程

哨兵模式部署

Redis群集

集群的作用

Redis集群的数据分片

Redis集群部署

Redis集群节点扩容


Redis高可用

在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。

在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和 Cluster集群,下面分别说明它们的作用,以及解决了什么样的问题。

●  持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。

●  主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。

●  哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限制。

●  Cluster集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

Redis主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点)但一个从节点只能有一个主节点

主从复制的作用

●   数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

●   故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

●   负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

●   高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

主从复制的流程

1、启动slave进程后,slave会向master发送sync命令请求同步连接

2、master收到后,会启动一个后台进程,将数据快照保存到数据文件中,同时还会记录修改数据的所有操作

3、快照好数据文件之后,master将数据文件发送给slave,slave将数据文件存到磁盘里,master会将修改数据的所有记录一并发给slave,保证数据完全同步

主从复制部署

环境:

master:192.168.3.10

slave1:192.168.3.11

slave2:192.168.3.12

提前安装好Redis数据库,此处就忽略Redis数据库的安装了,若还没有安装Redis,请移步上一篇文章

1、环境准备

systemctl stop firewalld        #临时关闭防火墙
systemctl disable firewalld        #关闭防火墙开机自启
setenforce 0                #临时关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config        #修改selinux的config文件,永久关闭selinux

2、修改Redis配置文件

master节点操作:

vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0									#87行,修改监听地址为0.0.0.0,或直接注释掉该行
protected-mode no								#111行,将本机访问保护模式设置no
port 6379										#138行,Redis默认的监听6379端口
daemonize yes									#309行,设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6379.pid		#341行,指定 PID 文件
logfile "/usr/local/redis/log/redis_6379.log"	#354行,指定日志文件
dir /usr/local/redis/data						#504行,指定持久化文件所在目录
#requirepass abc123								#1037行,可选,设置redis密码
appendonly yes									#1380行,开启AOF

systemctl restart redis-server.service    #重启redis服务

slave节点操作:

vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0									#87行,修改监听地址为0.0.0.0
protected-mode no								#111行,将本机访问保护模式设置no
port 6379										#138行,Redis默认的监听6379端口
daemonize yes									#309行,设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6379.pid		#341行,指定 PID 文件
logfile "/usr/local/redis/log/redis_6379.log"	#354行,指定日志文件
dir /usr/local/redis/data						#504行,指定持久化文件所在目录
#requirepass 123123								#1037行,可选,设置redis密码
appendonly yes									#1380行,开启AOF
replicaof 192.168.3.10 6379					    #528行,指定要同步的Master节点IP和端口
masterauth 123123								#535行,可选,指定Master节点的密码,仅在Master节点设置了requirepass

systemctl restart redis-server.service    #重启redis服务

slave配置修改仅比master配置多修改528行和535行,其他一样的配置

可以选择,将master的配置文件复制给slave,然后在 从master上复制到slave上的配置文件的基础上进行修改

cd /usr/local/redis/conf/                #首先进入到配置文件所在目录

scp redis.conf 192.168.3.11:`pwd`        #将master配置文件拷贝给slave

scp redis.conf 192.168.3.12:`pwd`

replicaof 192.168.3.10 6379                    #528行,指定要同步的Master节点IP和端口
masterauth 123123                                #535行,可选,指定Master节点的密码,仅在Master节点设置了requirepass

3、查看master的日志,查看主从同步连接情况

tail -f /usr/local/redis/log/redis_6379.log 

4、在master上验证从节点

redis-cli info replication                #master未设置了密码

redis-cli -a 密码 info replication                #master设置了密码

5、登录到redis中,创建一个键,在slave上验证

master:

redis-cli   -h 192.168.3.10 -p 6379 -a 123123

set  name  heitui


selave:

redis-cli   -h 192.168.3.10 -p 6379 -a 123123

keys   *        #查看所有的键

get   name        #获取name键的值

Redis哨兵模式

哨兵的核心功能

在主从复制的基础上,哨兵引入了主节点的自动故障转移

哨兵模式的作用

●   监控:哨兵会不断地检查主节点和从节点是否运作正常。

●   自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。

●    通知(提醒):哨兵可以将故障转移的结果发送给客户端。

哨兵结构的组成

●   哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。

●   数据节点:主节点和从节点都是数据节点。

哨兵模式故障转移机制

1、由哨兵节点定期检查主节点是否出现故障,每个哨兵节点每隔1秒会向主节点从节点其它哨兵节点发送一次ping命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

2、当主节点出现故障时,哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨兵节点leader,来负责主节点的故障转移和通知

故障转移过程

1)master出现故障,将某一个slave节点提升为新的master节点,让其他slave节点指向新的master节点

2)若原来的master节点恢复了,则变成slave加入,指向新的master节点

3)通知客户端master节点已更换

哨兵模式部署

哨兵模式基于主从复制的基础上,所以就在上述的主从复制的基础上继续部署

环境:

master:192.168.3.10

slave1:192.168.3.11

slave2:192.168.3.12

1、将哨兵文件复制到redis安装目录下的conf目录中

master、slave1、slave2:

cp /opt/redis-7.0.9/sentinel.conf /usr/local/redis/conf/
chown redis.redis /usr/local/redis/conf/sentinel.conf                #一定要将哨兵配置文件的属主和属组改成redis

2、修改哨兵配置文件

vim /usr/local/redis/conf/sentinel.conf

protected-mode no                                    #6行,关闭保护模式
port 26379                                            #10行,Redis哨兵默认的监听端口
daemonize yes                                        #15行,指定sentinel为后台启动
pidfile /usr/local/redis/log/redis-sentinel.pid        #20行,指定 PID 文件
logfile "/usr/local/redis/log/sentinel.log"            #25行,指定日志存放路径
dir /usr/local/redis/data                            #54行,指定数据库存放路径
sentinel monitor mymaster 192.168.3.10 6379 2        #73行,修改 指定该哨兵节点监控192.168.80.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
#sentinel auth-pass mymaster abc123                    #76行,可选,指定Master节点的密码,仅在Master节点设置了requirepass
sentinel down-after-milliseconds mymaster 3000        #114行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000            #214行,同一个sentinel对同一个master两次failover之间的间隔时间(180秒)

3、哨兵启动

启动顺序,先master,然后再slave

cd /usr/local/redis/conf/
redis-sentinel sentinel.conf &

4、查看哨兵信息

redis-cli -p 26379 info Sentinel

Redis群集

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。

集群由多组节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护从节点只进行主节点数据和状态信息的复制

集群的作用

1、数据分片:数据分区(或称数据分片)是集群最核心的功能。

2、高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

Redis集群的数据分片

Redis集群引入了哈希槽的概念
Redis集群有16384个哈希槽(编号0-16383
集群的每组节点负责一部分哈希槽
每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

Redis集群部署

由于个人电脑性能有限,所以在一台主机上部署Redis多实例

环境:3主3从

3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。

1、创建集群目录并拷贝redis的配置文件和redis的工具脚本

cd /usr/local/redis/        #切换到redis安装目录
mkdir -p redis-cluster/redis600{1..6}        #批量创建3主3从的安装目录
for i in {1..6}                #使用for循环进行拷贝相关文件
do
cp /opt/redis-7.0.13/redis.conf /usr/local/redis/redis-cluster/redis600$i
cp /opt/redis-7.0.13/src/redis-cli /opt/redis-7.0.13/src/redis-server /usr/local/redis/redis-cluster/redis600$i
done

2、修改配置文件

cd /usr/local/redis/redis-cluster/redis6001
vim redis.conf
---87行        注释掉
---111行        no
---138行        6001
---309行        yes
---341行        指定pid文件
---354行        指定日志文件
---1379行        yes
---1576行        取消注释,并改6001
---1584行        取消注释
---1590行        取消注释

3、将配置文件复制给其他实例,并修改内容

for  i  in {2..6}
do
\cp -f redis.conf ../redis600$i
done

cd ../redis6002
sed -i 's/6001/6002/' redis.conf
cd ../redis6003
sed -i 's/6001/6003/' redis.conf
cd ../redis6004
sed -i 's/6001/6004/' redis.conf
cd ../redis6005
sed -i 's/6001/6005/' redis.conf
cd ../redis6006
sed -i 's/6001/6006/' redis.conf

4、开启所有的redis实例

for  i  in  {1..6}
do
cd  /usr/local/redis/redis-cluster/redis600$i
./redis-server ./redis.conf
done


ps  -elf | grep redis-server                #通过过滤进程查看,是否启动成功

5、开启集群

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 才可以创建。

#上述的127.0.0.1是因为,我在一台机器上部署多实例实现集群,若不是一台机器,需要将其改成对应的ip

6、测试集群

redis-cli -p 6001 -c
cluster slots

set name zhangsan
cluster keylost name
quit

Redis集群节点扩容

基于上述的集群继续操作

1、创建另外两个实例目录

mkdir redis600{7..8}

cp /opt/redis-7.0.13/redis.conf /usr/local/redis/redis-cluster/redis6007

cp /opt/redis-7.0.13/redis.conf /usr/local/redis/redis-cluster/redis6008

cp /opt/redis-7.0.13/src/redis-cli /opt/redis-7.0.13/src/redis-server /usr/local/redis/redis-cluster/redis6007
cp /opt/redis-7.0.13/src/redis-cli /opt/redis-7.0.13/src/redis-server /usr/local/redis/redis-cluster/redis6008
cd redis6001

cp redis.conf ../redis6007

cp redis.conf ../redis6008

cd  ../redis6007

sed -i 's/6001/6007/' redis.conf

./redis-server  ./redis.conf

cd  ../redis6008

sed -i 's/6001/6008/' redis.conf

./redis-server  ./redis.conf

ps -elf | grep redis-server        #查看是否启动

2、创建一个新主节点

redis-cli -p 6001 --cluster add-node 127.0.0.1:6007 127.0.0.1:6008

redis-cli -p 6001
cluster meet 127.0.0.1 6007
cluster meet 127.0.0.1 6008

3、将127.0.0.1:6008创建为127.0.0.1:6007的从节点

redis-cli -p 6001 --cluster add-node 127.0.0.1:6008 127.0.0.1:6007 --cluster-slave --cluster-master-id 41db2af257a27a218ef73102316868e949c82c74

redis-cli -p 6008
cluster replicate 41db2af257a27a218ef73102316868e949c82c74

4、为新加入的主节点分配hash槽数

redis-cli -p 6007 --cluster reshard 127.0.0.1:6001 --cluster-from 110a930ebb94871b5e2b321ba1f041f8ae29b3c4 --cluster-to 41db2af257a27a218ef73102316868e949c82c74 --cluster-slots 1000 --cluster-yes

redis-cli -p 6007 --cluster reshard 127.0.0.1:6001
How many slots do you want to move (from 1 to 16384)? 1000                    #指定转移槽的数量
What is the receiving node ID? 41db2af257a27a218ef73102316868e949c82c74       #指定接收槽数量的主节点node ID
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: 110a930ebb94871b5e2b321ba1f041f8ae29b3c4           #指定分配的主节点node ID
Source node #2: done                                               #输入完毕,开始转移

5、查看集群状态

redis-cli -p 6001 cluster nodes

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis高可用主要通过主从复制和读写分离来实现。 主从复制实验过程如下: 1. 准备两个Redis实例,一个作为主服务器,一个作为从服务器。 2. 在主服务器上配置开启主从复制功能,并设置合适的密码认证。 3. 在从服务器上配置连接主服务器的IP地址和端口,并设置密码认证。 4. 在主服务器上执行命令SLAVEOF NO ONE,将该服务器设置为主服务器。 5. 在主服务器上编辑和插入数据。 6. 在从服务器上使用命令SLAVEOF <主服务器IP> <主服务器端口>,将该服务器设置为从服务器。 7. 从服务器连接主服务器后,会自动将主服务器上的数据同步到从服务器上。 8. 在主服务器上修改或删除数据,观察从服务器是否同步执行相同的操作。 读写分离实验过程如下: 1. 准备两个Redis实例,一个作为主服务器,一个作为从服务器。 2. 在主服务器上配置开启主从复制功能,并设置合适的密码认证。 3. 在从服务器上配置连接主服务器的IP地址和端口,并设置密码认证。 4. 在主服务器上编辑和插入数据。 5. 在应用程序中设置读写分离规则,将写操作发送到主服务器,将读操作发送到从服务器。 6. 在应用程序中进行读写操作,观察数据的读写是否按照设定的规则执行。 通过以上实验过程,可以验证Redis主从复制和读写分离功能是否正常工作。主从复制可以实现数据的同步备份,提高系统的可用性和容灾能力;读写分离可以分担主服务器的读负载,提高系统的性能和吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值