Redis高可用---三种模式

虚拟机要提前安装docke和下载redis镜像

一、主从模式

        1、什么是主从模式:

        主从模式中,会将几台服务器划分成主服务器和从服务器,一般来说,从服务器的数量会多于主服务器。在主从模式中,主服务器负责写操作,从服务器负责读操作,进行读写分离,减轻单台redis服务器的访问压力,在向主服务器添加数据时,也需要向从服务器同步数据,不然会导致主从服务器的数据不一致。Redis使用了两种同步策略,分别是全量复制和增量复制。当从服务器连接主服务器时,先执行全量复制,主服务器会将RDB文件发送到从服务器上进行数据导入。之后,主服务器再发生数据变化时,需要将指令同步给从服务器,从服务器就会和主服务器执行相同的操作。

        2、主从模式的实现:

                (1)启动主服务器:

    docker run -d --name redis6379 \               

    --net host \                                   

    --restart=always \            

    redis                         

        -d :让容器进入后台运行模式

        run:启动容器

        --name:给该容器自定义名字,本次定义的名字为redis6379

        --restart host:让容器直接使用宿主机的网络和端口

        --restart=always:让容器随着docker一起启动,类似于开机自启动

        redis:容器的名字 (未设置端口号,则使用默认的端口号)

  注意:每个“ \ ”和前面字符之间要有一个空格。

                (2)启动从服务器:

docker run -d --name redis6380 \    
--net host \                        
--restart=always \                  
redis redis-server --port 6380 \    
--slaveof 192.168.64.140 6379       

 redis-server:是在启动redis 的命令

--slaveof:将该服务器设置为从服务器,后面跟的IP和端口为主服务器的端口

        3、结果演示:        

                (1)启动服务:

                 (2)向主服务添加数据:set b 222

                (3)在从服务器读取数据,并且在从服务器上添加数据失败:

                (1)命令如下:

docker exec -it redis6379 redis-cli    进入到某一个容器
info replication                       查看信息
注:我们也可以借用其他工具来查看服务器的角色,例如ARDN

        4、主从模式的优缺点:

                优点:读写分离,减轻单台redis服务器的压力

                缺点:一旦主服务器由于故障不能提供服务,从服务器也不能自动升级为主服务器,提供主服务的服务,而是需要人工手动改变主从角色,将某台从服务器升级为主服务器,其他从服务器也要更改主服务器配置。同时,还要通知应用方更新主服务器节点。

二、哨兵模式:

        1、什么是哨兵模式:

        由于主从模式中,主从服务器不能自动转换角色。所以,redis在2.8版本以后,提供了redis Sentinel架构,也就是哨兵模式来解决这个问题。哨兵模式是在主从模式的基础上,增加了哨兵集群,哨兵也是需要使用多个,防止单哨兵出现故障而不能监控主从服务器。哨兵集群会监视所有的主服务器和从服务器,当主服务器出现故障下线时,由哨兵对主服务器下线状态进行确认,具体需要几台哨兵确认,这个是可以设置的,我们一般是按照少数服从多数的机制,当超过一半的哨兵确认主服务器状态为下线时,才可正式确认主服务器下线,然后从从服务器中挑选某个从服务器升级为主服务器。

        2、哨兵模式的实现:

                (1)本次以三个哨兵为例。我们需要先准备三个哨兵的配置文件,先创建文件夹:

mkdir /opt/sentinel/
cd /opt/sentinel/

                (2)创建文件夹并写入配置项:

cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.140 6379 2    
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.140 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.140 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

<<EOF:当在文件中写入信息时,遇到EOF字符,立即保存退出。 

sentinel monitor mymaster 192.168.64.140 6379 2:

        6379:监视的端口        

        2:最后的数字2,需要两个哨兵确认才可以正式下线。

                (3)启动三个哨兵服务:

docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net host \
--restart=always \
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5001 \
-v /opt/sentinel/5001.conf:/sentinel.conf \
--net host \
--restart=always \
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5002 \
-v /opt/sentinel/5002.conf:/sentinel.conf \
--net host \
--restart=always \
redis redis-sentinel /sentinel.conf

                (4)接下来测试主服务器宕机,会不会有新的主服务提供服务:

docker stop redis6379        将主服务器停掉,同时在redis6380添加数据成功

info replicatio   查看服务器的角色信息

 

三、Cluster集群模式:

        1、什么是Cluster集群:

        redis Cluster集群模式要求至少需要3个master才能组成一个集群,同时每个master至少需要一个slave节点,各节点之间保持TCP通信。当master节点发生宕机,redis Cluster自动将对应的slave节点提拔为master,来重新对外提供服务。当使用cluster集群提供服务时,怎么知道请求落到那台服务器上。Redis集群采用哈希槽算法来确认由哪台服务器提供服务,哈希槽槽位义工有16384个,假设有3个master节点,则这些槽位会平均的分配给3个节点,每个节点覆盖一段哈希槽。在添加key时,首先用哈希槽算法计算该key存放的哈希槽,然后存放到对应的主机。

        2、Cluster集群的实现(本次以3个master各带一个slave节点讲解):

                (1)先准备配置文件,至少是6个,然后向各文件添加配置,如下:

kdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005

cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

                (2)启动服务: 

docker run -d --name redis7000 --restart=always \
--net host -v /opt/redis/7000/redis.conf:/redis.conf \
redis redis-server /redis.conf

docker run -d --name redis7001 --restart=always \
--net host -v /opt/redis/7001/redis.conf:/redis.conf \
redis redis-server /redis.conf

docker run -d --name redis7002 --restart=always \
--net host -v /opt/redis/7002/redis.conf:/redis.conf \
redis redis-server /redis.conf

docker run -d --name redis7003 --restart=always \
--net host -v /opt/redis/7003/redis.conf:/redis.conf \
redis redis-server /redis.conf

docker run -d --name redis7004 --restart=always \
--net host -v /opt/redis/7004/redis.conf:/redis.conf \
redis redis-server /redis.conf

docker run -d --name redis7005 --restart=always \
--net host -v /opt/redis/7005/redis.conf:/redis.conf \
redis redis-server /redis.conf

 

                (3)组成集群,组成集群前,添加数据都是失败的:

                         

docker exec -it redis7000 redis-cli --cluster create \
192.168.64.140:7000 192.168.64.140:7001 \
192.168.64.140:7002 192.168.64.140:7003 \
192.168.64.140:7004 192.168.64.140:7005 \
--cluster-replicas 1

  

                (4) 向服务器添加数据进行测试:

注:从结果可以得知,value相同,key不同,它们存储到的服务器是不一样的,就算在在某个服务器下执行添加操作,还是会跳到其他服务器上。这是因为key经过哈希槽算法计算后,才确定具体存储到哪台服务器。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值