Redis主从以及哨兵集群搭建(二)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

Redis主从以及哨兵集群搭建

wKioL1l99enjKPRRAA0_8Mgawzg502.bmp

一、前言

  Redis主从同步原理同MySQL的主从原理十分相似,而解决Redis单点故障的哨兵机制(sentinel)又同解决MySQL单点故障的MHA十分相似。因此我们在学习Redis时,可以将学习MySQL的知识迁移,这样一来,有利于我们快速掌握Redis主从机制,Redis哨兵集群的搭建。Redis的Sentinel机制大概是这样的。sentinel即哨兵,作用即放哨。开个玩笑,其实哨兵有三个作用:监控、通知和自动故障转移。哨兵是用来监控Redis的master(主服务器)的,一旦master宕机了,便立刻通知其他slave(从服务器)做好成为master的准备。一旦在自设定的时间内确定master是真的宕机了,就会随机切换一个slave成为master。但是这里会出现一个问题,哨兵(sentinel)的权利是不是太大了?而且万一在监控的时间内出问题的是哨兵自己而不是master,那就会出现误报。因此,我们需要有一个机制限制哨兵的权利。这个机制就是quorum(法定投票机制)机制。我们可以通过投票的方式来决定哨兵的消息是否真实可靠而不是哨兵自己本身宕机了?那既然需要投票,一个哨兵肯定不行,那两个呢?那肯定也不行!假设一台哨兵宕机了,而master是没有宕机的。那这台哨兵会报告master宕机的消息,而另外一台哨兵服务器则不会报告master宕机的消息。那这种情况就很尴尬了,左右为难了。因此我们既然要投票而且必须要有一个正确的可靠消息,那需要的哨兵数必然要大于2个了,因此一般推荐哨兵个数三个以上。

二、实验环境

  wKiom1l99aCxYFX7AAAIIjjY0_U167.png

    说明:系统为CentOS7.3。由于是在虚拟机上实验的,这里为了节省资源将三个从节点也配置了Sentinel的功能,当然你也可以将Sentinel独立出来为一个集群。

三、实验配置

  1 初始化配置

    #node1 /etc/hosts文件修改(其他节点也做类似的修改,保证本机能够基于主机名通信) 

1
2
3
4
5
6
       127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 node1
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 node1
     192.168.0.51 node1
     192.168.0.52 node2
     192.168.0.53 node3
     192.168.0.54 node4

    #修改hostname(可立即生效)  

1
2
3
4
       hostnamectl  set - hostname  node1
     hostnamectl  set - hostname  node2
     hostnamectl  set - hostname  node3
     hostnamectl  set - hostname  node4

    #查看hostname

    [root@localhost ~]# hostnamectl 

1
2
3
4
5
6
7
8
9
10
11
    Static  hostname : node1
    Icon name: computer-vm
    Chassis: vm
    Machine ID: 3d8bf6a9bfb24fae9bedcb9cfc6c5960
    Boot ID: 75905236f9eb4d91ade64f99a690d329
    Virtualization: vmware
    Operating System: CentOS Linux 7 (Core)
    CPE OS Name: cpe: /o :centos:centos:7
    Kernel: Linux 3.10.0-514.el7.x86_64
    Architecture: x86-64
    #注:重新登陆终端,命令提示符就会更改成你修改的hostname

    #时间同步(四个节点都要同步)

1
2
     [root@node1 ~] # ntpdate 172.16.0.1
     18 Jul 22:45:00 ntpdate[10418]: step  time  server 172.16.0.1 offset 0.708020 sec

    #另外防火墙规则请自行设置好,selinux确保关闭

  2 安装redis,redis主从配置

    #下载好redis rpm包

1
     redis-3.2.3-1.el7.x86_64.rpm

    #安装redis(4个节点都要执行)

1
     yum  install  -y redis-3.2.3-1.el7.x86_64.rpm

    #将配置文件备份(4个节点都要执行)

1
     cp  /etc/redis .conf{,.bak}

    #修改配置文件(4个节点都要执行)

1
2
   vim redis.conf
     bind 192.168.0.51   #改为各个节点的IP

    #在从节点(node2、node3、node4)开启slave功能

1
2
3
4
   vim  /etc/redis .conf
     ################################# REPLICATION #################################
     # slaveof <masterip> <masterport>
     slaveof 192.168.0.51 6379

    #启动redis-server(4个节点都启动)

1
   redis-server  /etc/redis .conf

    #查看服务是否启动(演示node2,其他自行测试)

1
2
3
4
5
6
7
     [root@node2 ~] # ss -tln
     State      Recv-Q Send-Q Local Address:Port                Peer Address:Port              
     LISTEN     0      128     192.168.0.52:6379                           *:*                  
     LISTEN     0      128                *:22                             *:*                  
     LISTEN     0      100        127.0.0.1:25                             *:*                  
     LISTEN     0      128               :::22                            :::*                  
     LISTEN     0      100              ::1:25                            :::*

    #在主机上登陆redis

1
2
3
   [root@node1 ~] # redis-cli -h 192.168.0.51 
     192.168.0.51:6379> KEYS * 
     (empty list or  set )

    #设置一对键值,用于同步测试  

1
2
3
4
192.168.0.51:6379> SET  test  'amazing'
     OK
     192.168.0.51:6379> get  test
     "amazing"

    #登陆其他三台从服务器

1
2
3
     redis-cli -h 192.168.0.52
     redis-cli -h 192.168.0.53
     redis-cli -h 192.168.0.54

    #三个节点上测试

1
2
3
4
5
6
7
8
9
10
11
12
13
     #node2查看键值对,已经同步了
     192.168.0.52:6379> keys * 
     1)  "test"
     192.168.0.52:6379> get  test
     "amazing"
     
     #node3查看键值对,已经同步了
     192.168.0.53:6379> keys * 
     1)  "test"
     
     node4查看键值对,已经同步了
     192.168.0.54:6379> keys * 
     1)  "test"

    由此证明redis主从配置基本实现

    #node1上查看主从信息,也可看到主从配置已经实现

1
2
3
4
5
6
7
8
9
10
11
12
     192.168.0.51:6379> INFO replication
     # Replication
     role:master
     connected_slaves:3
     slave0:ip=192.168.0.52,port=6379,state=online,offset=732,lag=0
     slave1:ip=192.168.0.53,port=6379,state=online,offset=732,lag=0
     slave2:ip=192.168.0.54,port=6379,state=online,offset=732,lag=0
     master_repl_offset:732
     repl_backlog_active:1
     repl_backlog_size:1048576
     repl_backlog_first_byte_offset:2
     repl_backlog_histlen:731

  3 sentinel集群实现(哨兵)    

    接下来在三个从节点上配置sentinel,实现故障转移。

    #三个从节点都需要做如下配置 

1
2
3
4
5
      cp  /etc/redis-sentinel .conf{,.bak}
     vi  /etc/redis-sentinel .conf
     sentinel monitor mymaster 192.168.0.51 6379 2
     sentinel down-after-milliseconds mymaster 5000
     sentinel failover-timeout mymaster 18000

    #启动服务

1
      redis-sentinel  /etc/redis-sentinel .conf

    #查看服务是否正常启动

1
2
3
4
5
6
7
8
9
   [root@node ~] # ss -tln
     State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
     LISTEN     0      128             *:26379                       *:*                  
     LISTEN     0      128    192.168.0.55:6379                        *:*                  
     LISTEN     0      128             *:22                          *:*                  
     LISTEN     0      100     127.0.0.1:25                          *:*                  
     LISTEN     0      128            :::26379                      :::*                  
     LISTEN     0      128            :::22                         :::*                  
     LISTEN     0      100           ::1:25                         :::*

    #模拟故障

1
2
3
4
5
6
7
8
9
10
     #杀掉node1 redis进程
     [root@node1 ~] # pkill redis
     [root@node1 ~] # ss -tln
     State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
     LISTEN     0      128               *:111                           *:*                  
     LISTEN     0      128               *:22                            *:*                  
     LISTEN     0      100       127.0.0.1:25                            *:*                  
     LISTEN     0      128              :::111                          :::*                  
     LISTEN     0      128              :::22                           :::*                  
     LISTEN     0      100             ::1:25                           :::*

    #登陆node3,查看信息,发现node3变成master,实现故障转移

1
2
3
4
5
6
7
8
9
10
11
12
     [root@node3 ~] # redis-cli -h 192.168.0.53
     192.168.0.53:6379> INFO Replication
     # Replication
     role:master
     connected_slaves:2
     slave0:ip=192.168.0.54,port=6379,state=online,offset=23900,lag=0
     slave1:ip=192.168.0.52,port=6379,state=online,offset=23900,lag=0
     master_repl_offset:24177
     repl_backlog_active:1
     repl_backlog_size:1048576
     repl_backlog_first_byte_offset:2
     repl_backlog_histlen:24176

    #再次模拟故障

1
2
3
4
5
6
7
8
     #杀掉node3 redis
     [root@node3 ~] # pkill redis
     [root@node3 ~] # ss -tln
     State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
     LISTEN     0      128               *:22                            *:*                  
     LISTEN     0      100       127.0.0.1:25                            *:*                  
     LISTEN     0      128              :::22                           :::*                  
     LISTEN     0      100             ::1:25                           :::*

    #登陆node4 查看信息,发现node4为master,node2为从,此时为一主一次

1
2
3
4
5
6
7
8
9
10
11
   [root@node4 ~] # redis-cli -h 192.168.0.54
     192.168.0.54:6379> INFO Replication
     # Replication
     role:master
     connected_slaves:1
     slave0:ip=192.168.0.52,port=6379,state=online,offset=10508,lag=0
     master_repl_offset:10508
     repl_backlog_active:1
     repl_backlog_size:1048576
     repl_backlog_first_byte_offset:2
     repl_backlog_histlen:10507

    #启动node1和node3的redis服务,恢复到正常状态

1
2
      [root@node1 ~] # redis-server /etc/redis.conf
     [root@node3 ~] # redis-server /etc/redis.conf

    #node3变为主节点,现在为一主三从

1
2
3
4
5
6
7
8
9
10
11
12
13
     [root@node3 ~] # redis-cli -h 192.168.0.53
     192.168.0.53:6379> INFO Replication
     # Replication
     role:master
     connected_slaves:3
     slave0:ip=192.168.0.51,port=6379,state=online,offset=8008,lag=0
     slave1:ip=192.168.0.52,port=6379,state=online,offset=8146,lag=0
     slave2:ip=192.168.0.54,port=6379,state=online,offset=7869,lag=1
     master_repl_offset:8146
     repl_backlog_active:1
     repl_backlog_size:1048576
     repl_backlog_first_byte_offset:2
     repl_backlog_histlen:8145

    (PS:Redis系列第三篇将会介绍Redis的性能优化)



本文转自 PowerMichael 51CTO博客,原文链接:http://blog.51cto.com/huwho/1952183,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
13天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
46 0
|
22天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
34 2
|
27天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
32 0
|
22天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
31 0
面试官:如何搭建Redis集群?
|
25天前
|
存储 缓存 NoSQL
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)(一)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)
68 0
|
1月前
|
NoSQL Redis Docker
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
63 0
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群
|
2月前
|
运维 NoSQL 算法
Redis-Cluster 与 Redis 集群的技术大比拼
Redis-Cluster 与 Redis 集群的技术大比拼
46 0
|
1月前
|
运维 负载均衡 NoSQL
【大厂面试官】知道Redis集群和Redis主从有什么区别吗
集群节点之间的故障检测和Redis主从中的哨兵检测很类似,都是通过PING消息来检测的。。。面试官抓抓脑袋,继续看你的简历…得想想考点你不懂的😰。
67 1