Linux下Redis集群 主从+哨兵模式搭建

一、Redis安装部署

  • 准备三台机器:10.117.201.80(从)、10.117.201.81(主)、10.117.201.82(从)

  • 官方下载地址为:redis,我这里使用的是redis-5.0.12.tar.gz,下载 .tar.gz包

  • 上传到指定目录、然后解压、重命名redis

    tar -zxvf redis-5.0.12.tar.gz -C /usr/local
    mv redis-5.0.12.tar.gz  redis
    
  • 分发解压文件给其他两台机器

    scp -r ./redis 10.117.200.80:/usr/local/ 10.117.201.81:/usr/local/
    #输入密码即可
    
  • 编译、去到解压安装包下

    [root@mon1-micro2 local]# pwd
    /usr/local
    [root@mon1-micro2 local]# cd redis
    [root@mon1-micro2 redis]# make
    

    编译完成之后,可以看到redis目录里面会有src、conf等文件

  • 进入src目录使用 make && make install 编译安装

    [root@mon1-micro2 redis]# ls
    00-RELEASENOTES  CONDUCT       COPYING  etc      Makefile   README.md   runtest          runtest-moduleapi  sentinel.conf  tests   utils
    BUGS             CONTRIBUTING  deps     INSTALL  MANIFESTO  redis.conf  runtest-cluster  runtest-sentinel   src            TLS.md
    [root@mon1-micro2 redis]# cd src
    [root@mon1-micro2 src]# pwd
    /usr/local/redis/src
    [root@mon1-micro2 src]# make && make install
    
  • 安装完成之后,显示如下

    [root@mon1-micro2 src]# make install
    
    Hint: It's a good idea to run 'make test' ;)
    
        INSTALL install
        INSTALL install
        INSTALL install
    

    以上表示安装完成。这里可能在安装的时候出现一个问题:如出现/bin/sh: cc: command not found错误,是因为没有安装 gcc 环境,使用命令

    yum install gcc
    

    安装 gcc 环境即可

  • 管理文件

    由于src 下面文件非常多,可以将几个常用的命令和conf配置文件复制出来进行统一管理、在redis目录下etc/bin文件夹。

    [root@mon1-micro2 redis]# pwd
    /usr/local/redis
    [root@mon1-micro2 redis]# mkdir -p etc/bin/
    

    最终如下

    [root@mon1-micro2 redis]# pwd
    /usr/local/redis
    [root@mon1-micro2 redis]# ll
    总用量 232
    -rw-r--r--  1 root root 21263 4月  15 09:17 00-RELEASENOTES
    -rw-r--r--  1 root root    51 4月  15 09:17 BUGS
    -rw-r--r--  1 root root  5026 4月  15 09:17 CONDUCT
    -rw-r--r--  1 root root  3384 4月  15 09:17 CONTRIBUTING
    -rw-r--r--  1 root root  1487 4月  15 09:17 COPYING
    drwxrwxr-x  7 root root   213 4月  15 09:40 deps
    drwxr-xr-x  3 root root    56 4月  15 16:08 etc  --创建的etc目录
    -rw-r--r--  1 root root    11 4月  15 09:17 INSTALL
    -rw-r--r--  1 root root   151 4月  15 09:17 Makefile
    -rw-r--r--  1 root root  6888 4月  15 09:17 MANIFESTO
    -rw-r--r--  1 root root 21594 4月  15 09:17 README.md
    -rw-r--r--  1 root root 92222 4月  15 09:17 redis.conf
    -rwxr-xr-x  1 root root   275 4月  15 09:17 runtest
    -rwxr-xr-x  1 root root   279 4月  15 09:17 runtest-cluster
    -rwxr-xr-x  1 root root  1046 4月  15 09:17 runtest-moduleapi
    -rwxr-xr-x  1 root root   281 4月  15 09:17 runtest-sentinel
    -rw-r--r--  1 root root 13768 4月  15 09:17 sentinel.conf
    drwxrwxr-x  3 root root 12288 4月  16 10:04 src 
    drwxrwxr-x 11 root root   182 4月  15 09:17 tests
    -rw-r--r--  1 root root  3055 4月  15 09:17 TLS.md
    drwxrwxr-x  9 root root  4096 4月  15 09:17 utils
    [root@mon1-micro2 redis]# cd etc
    [root@mon1-micro2 etc]# ll
    总用量 108
    drwxr-xr-x 2 root root   214 4月  15 17:08 bin
    -rw-r--r-- 1 root root 92572 4月  15 16:01 redis.conf
    -rw-r--r-- 1 root root 14135 4月  15 16:08 sentinel.conf
    
    

    将redis.conf 复制到etc文件夹中,将src文件夹下的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-rdb、redis-cli、redis-server、redis-sentinel文件复制到 bin 文件夹。

    cd src
    cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel ../etc/bin/
    

    复制后如下

    [root@mon1-micro2 bin]# pwd
    /usr/local/redis/etc/bin
    [root@mon1-micro2 bin]# ll
    总用量 42804
    -rw-r--r-- 1 root root     198 4月  15 17:08 dump.rdb
    -rwxr-xr-x 1 root root     735 4月  15 10:13 mkreleasehdr.sh
    -rwxr-xr-x 1 root root 4833392 4月  15 10:13 redis-benchmark
    -rwxr-xr-x 1 root root 9450264 4月  15 10:13 redis-check-aof
    -rwxr-xr-x 1 root root 9450264 4月  15 10:13 redis-check-rdb
    -rw-r--r-- 1 root root 1164879 4月  15 17:08 redis.log
    -rwxr-xr-x 1 root root 9450264 4月  15 10:13 redis-sentinel
    -rwxr-xr-x 1 root root 9450264 4月  15 10:13 redis-server
    -rwxr-xr-x 1 root root    3600 4月  15 10:13 redis-trib.rb
    -rw-r--r-- 1 root root       0 4月  15 15:14 sentinel.log
    [root@mon1-micro2 bin]#
    
  • 启动redis服务

    切换到bin目录下,使用./redis-server即可启动服务、但是这种方式没有指明配置文件,redis将采用默认配置。所以需要让redis按照我们的配置文件来启动。

    [root@mon1-micro2 bin]# ./redis-server ../redis.conf
    

    启动后查看redis的进程

    [root@mon1-micro2 bin]# ps -ef|grep redis
    root     1073894       1  0 4月15 ?       00:07:52 ./redis-sentinel *:26379 [sentinel]
    root     1139640       1  0 4月15 ?       00:05:35 ./redis-server 0.0.0.0:6379
    root     1456000 1446888  0 11:24 pts/0    00:00:00 grep --color=auto redis
    

    使用redis-cli 命令连接客户端

    [root@mon1-micro2 bin]# redis-cli -p 6379
    127.0.0.1:6379> auth redis
    OK
    127.0.0.1:6379> get zt
    "I love you"
    127.0.0.1:6379> 
    

二、Redis集群架构

​ 这里采用的集群架构就是主从结构+哨兵,实现容灾的自动切换、如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ACngDvfF-1620293351925)(https://i.loli.net/2021/04/16/wIMVGY5aRb8Lfk9.jpg)]

一个主节点master可以拥有多个从节点slave,从节点实现对主节点的复制,保证数据同步,而哨兵则对各个节点进行监控,主要包括主节点存活检测,主从运行情况检测等。一旦主节点宕机,哨兵可以自动进行故障转移,主从切换。接下来就开始搭建这样的一个集群,先从主从结构、然后哨兵模式,往下看。

三、Redis主从配置

在第一步中安装了redis,并且启动了redis服务,但是配置文件并没有做修改。因此主从配置是通过修改配置文件来实现的。

这里:10.117.201.80从节点slave、10.117.201.81主节点master、10.117.201.82从节点slave.

进入etc文件夹,这里指的是redis下面我们创建的etc文件夹,使用vi redis.conf命令打开编辑redis.conf配置文件。如下

[root@mon1 ~]# cd /usr/local/
[root@mon1 local]# ls
bin  etc  games  include  lib  lib64  libexec  mysql  nacos  redis  sbin  share  src
[root@mon1 local]# cd redis/
[root@mon1 redis]# ls
00-RELEASENOTES  CONDUCT       COPYING  etc      Makefile   README.md   runtest          runtest-moduleapi  sentinel.conf  tests   utils
BUGS             CONTRIBUTING  deps     INSTALL  MANIFESTO  redis.conf  runtest-cluster  runtest-sentinel   src            TLS.md
[root@mon1 redis]# cd etc
[root@mon1 etc]# ls
bin  redis.conf  sentinel.conf
[root@mon1 etc]# vi redis.conf

redis.conf 配置文件中的各个参数,详解如下

# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。 
daemonize no 
# 指定redis进程的PID文件存放位置 
pidfile /var/run/redis.pid 
# redis进程的端口号 
port 6379 
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。 
protected-mode yes 
# 绑定的主机地址 
bind 127.0.0.1 
# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能 
timeout 300 
# redis日志级别,可用的级别有debug.verbose.notice.warning 
loglevel verbose 
# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了 
logfile stdout 
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id 
databases 16 
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件 
save <seconds> <changes> 
# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储 
rdbcompression yes 
# 指定本地数据库文件名 
dbfilename dump.db 
# 指定本地数据问就按存放位置 
dir ./ 
# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步 
replicaof <masterip> <masterport> 
# 当master设置了密码保护时,slave服务连接master的密码 
masterauth <master-password> 
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭 
requirepass footbared 
# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息 
maxclients 128 
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区 
maxmemory<bytes> 
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。 
appendonly no 
# 指定跟新日志文件名默认为appendonly.aof 
appendfilename appendonly.aof 
# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值); 
appendfsync everysec 
  • 主机配置(10.117.201.81)需要改动的配置如下所示、修改完毕后esc、:wq命令保存退出

    bind 0.0.0.0 
    port 6379 
    protected-mode no 
    daemonize yes 
    logfile ./redis.log 
    requirepass redis
    masterauth redis 
    replicaof 10.117.201.81 6379 
    

    bind :0.0.0.0 redis 默认只允许本机访问,把bind修改成0.0.00表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip.

    port:6379 监听端口默认为6379,想改成其他的也行。

    protected-mode:no 关闭保护模式、可以外部访问。

    daemonize:yes 设置后台启动

    logfile:./redis.log redis日志文件,生成之后在bin目录下可以找到

    requirepass:redis@123 设置redis连接密码

    masterauth:slave服务连接master的密码。

    replicaof:10.117.201.81 6379 设置成master服务的ip地址及端口

  • 从机器配置

    从机器的配置与主机器相似,相同的地方不再详解,不同的地方是需要使用replicaof指定主机master的IP地址和端口。需要注意的是老版本使用的是slaveof,目前使用的版本是redis 6.2.1版本,所以要使用replicaof,如下

    bind 0.0.0.0 
    port 6379 
    protected-mode no 
    daemonize yes 
    logfile ./redis.log 
    requirepass redis  
    masterauth redis  
    replicaof 10.117.201.81 6379 
    

    指定当本机为slave服务时,设置master服务的的IP地址及端口,在redis启动的时候会自动跟master进行数据同步,所以从机80、82、也是这么配置即可。

    注意:由于搭建的集群需要自动容灾切换,主数据库可能会变成从数据库,所以三台机器上都需要同时设置requirepass、masterauth配置项。

  • 数据同步

    上面我们主从节点的配置文件配置好以后,重启redis服务。进入bin目录即可查看配置文件中指定的redis.log文件。

    [root@mon1 redis]# cd etc/bin/
    [root@mon1 bin]# ll
    总用量 132128
    -rw-r--r-- 1 root root      198 4月  15 17:08 dump.rdb
    -rwxr-xr-x 1 root root      735 4月  15 10:13 mkreleasehdr.sh
    -rwxr-xr-x 1 root root  4833392 4月  15 10:13 redis-benchmark
    -rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-check-aof
    -rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-check-rdb
    -rw-r--r-- 1 root root 92632663 4月  15 17:08 redis.log --日志、根据logfile配置的
    -rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-sentinel
    -rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-server
    -rwxr-xr-x 1 root root     3600 4月  15 10:13 redis-trib.rb
    -rw-r--r-- 1 root root        0 4月  15 15:13 sentinel.log
    
    

    同时确保主从机器节点之间机器端口是通的。例如开放6379端口

    firewall-cmd --add-port=6379/tcp --permanent --zone=public 
    #重启防火墙(修改配置后要重启防火墙) 
    firewall-cmd --reload
    

    至此主从结构搭建完毕。

  • 检查节点信息是否正确、同时数据是否真的可以同步

    redis-cli -p 6379
    auth redis
    

    10.117.201.81 master、需要说明的是,之前我测试了一下故障转移,所以master由81主机变成82主机,而81主机重新启动连接集群之后变成了从节点。

    127.0.0.1:6379> info replication
    # Replication
    role:master  --节点角色
    connected_slaves:2 --连接从节点个数
    slave0:ip=10.117.201.80,port=6379,state=online,offset=16220502,lag=0  --从节点 80
    slave1:ip=10.117.201.81,port=6379,state=online,offset=16220502,lag=1  --从节点 81
    master_failover_state:no-failover
    master_replid:c0a2102172e7881617d30f7138b0d2923f322d98
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:16220502
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:15171927
    repl_backlog_histlen:1048576
    

    10.117.201.81 --slave

    127.0.0.1:6379> info replication
    # Replication
    role:slave 
    master_host:10.117.201.82
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:16172364
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:c0a2102172e7881617d30f7138b0d2923f322d98
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:16172364
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:15123789
    repl_backlog_histlen:1048576
    127.0.0.1:6379>
    

    10.117.200.80 --slave

    127.0.0.1:6379> info replication
    # Replication
    role:slave 
    master_host:10.117.201.82
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:16172364
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:c0a2102172e7881617d30f7138b0d2923f322d98
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:16172364
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:15123789
    repl_backlog_histlen:1048576
    127.0.0.1:6379>
    

    在主节点机器82上面输入

    127.0.0.1:6379> select 0 --选择其中一个数据库,redis默认数据库有16个
    127.0.0.1:6379> set tt 26
    OK
    127.0.0.1:6379> get tt
    "26"
    127.0.0.1:6379> 
    

    观察80、81上面能不能获取到该数据

    127.0.0.1:6379> select 0
    OK
    127.0.0.1:6379> get tt
    "26"
    127.0.0.1:6379>
    
    127.0.0.1:6379> select 0
    OK
    127.0.0.1:6379> get tt
    "26"
    127.0.0.1:6379>
    

    确实可以看到数据同步过去了。

四、哨兵模式搭建

​ Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

  • 监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
  • 通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。
  • 故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换。
  • 统一的配置管理:连接者询问sentinel取得主从的地址

配置文件详解

​ 哨兵的配置主要就是修改sentinel.conf配置文件中的参数,在Redis安装目录即可看到此配置文件,各参数详解如下

# 哨兵sentinel实例运行的端口,默认26379   
port 26379 
# 哨兵sentinel的工作目录 
dir ./ 
# 是否开启保护模式,默认开启。 
protected-mode:no 
# 是否设置为后台启动。 
daemonize:yes 
 
# 哨兵sentinel的日志文件 
logfile:./sentinel.log 
 
# 哨兵sentinel监控的redis主节点的  
## ip:主机ip地址 
## port:哨兵端口号 
## master-name:可以自己命名的主节点名字(只能由字母A-z、数字0-9 、这三个字符".-_"组成。) 
## quorum:当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了   
# sentinel monitor <master-name> <ip> <redis-port> <quorum>   
sentinel monitor mymaster 10.117.201.80 6379 2 
 
# 当在Redis实例中开启了requirepass,所有连接Redis实例的客户端都要提供密码。 
# sentinel auth-pass <master-name> <password>   
sentinel auth-pass mymaster redis@123  
 
# 指定主节点应答哨兵sentinel的最大时间间隔,超过这个时间,哨兵主观上认为主节点下线,默认30秒   
# sentinel down-after-milliseconds <master-name> <milliseconds> 
sentinel down-after-milliseconds mymaster 30000   
 
# 指定了在发生failover主备切换时,最多可以有多少个slave同时对新的master进行同步。这个数字越小,完成failover所需的时间就越长;反之,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1,来保证每次只有一个slave,处于不能处理命令请求的状态。 
# sentinel parallel-syncs <master-name> <numslaves> 
sentinel parallel-syncs mymaster 1   
 
# 故障转移的超时时间failover-timeout,默认三分钟,可以用在以下这些方面: 
## 1. 同一个sentinel对同一个master两次failover之间的间隔时间。   
## 2. 当一个slave从一个错误的master那里同步数据时开始,直到slave被纠正为从正确的master那里同步数据时结束。   
## 3. 当想要取消一个正在进行的failover时所需要的时间。 
## 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来同步数据了 
# sentinel failover-timeout <master-name> <milliseconds>   
sentinel failover-timeout mymaster 180000 
 
# 当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本。一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。 
# 对于脚本的运行结果有以下规则:   
## 1. 若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10。 
## 2. 若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。   
## 3. 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。 
# sentinel notification-script <master-name> <script-path>   
sentinel notification-script mymaster /var/redis/notify.sh 
 
# 这个脚本应该是通用的,能被多次调用,不是针对性的。 
# sentinel client-reconfig-script <master-name> <script-path> 
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh 

哨兵搭建

这里部署三个哨兵,每台服务器一个哨兵、配置方式都相同、首先同样为了方便管理,首先将redis目录下面的sentinel.conf复制到etc下

[root@mon1-micro2 etc]# ll
总用量 108
drwxr-xr-x 2 root root   214 4月  16 14:07 bin
-rw-r--r-- 1 root root 92572 4月  15 16:01 redis.conf
-rw-r--r-- 1 root root 14135 4月  15 16:08 sentinel.conf

编辑sentinel.conf文件

cd etc
vi sentinel.conf

修改文件配置如下

//端口默认为26379。 
port:26379 
//关闭保护模式,可以外部访问。 
protected-mode:no 
//设置为后台启动。 
daemonize:yes 
//日志文件。 
logfile:./sentinel.log 
//指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。 
sentinel monitor mymaster 10.117.201.80 6379 2 
//当在Redis实例中开启了requirepass,这里就需要提供密码。 
sentinel auth-pass mymaster redis@123 
//这里设置了主机多少秒无响应,则认为挂了。 
sentinel down-after-milliseconds mymaster 3000 
//主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。 
snetinel parallel-syncs mymaster 1 
//故障转移的超时时间,这里设置为三分钟。 
sentinel failover-timeout mymaster 180000

注意:防火墙设置,同样你要保证机器之间的端口可以通啊。

启动哨兵:

[root@mon1 etc]# pwd
/usr/local/redis/etc
[root@mon1 etc]# cd bin
[root@mon1 bin]# ll
总用量 132128
-rw-r--r-- 1 root root      204 4月  16 14:07 dump.rdb
-rwxr-xr-x 1 root root      735 4月  15 10:13 mkreleasehdr.sh
-rwxr-xr-x 1 root root  4833392 4月  15 10:13 redis-benchmark
-rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-check-aof
-rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-check-rdb
-rw-r--r-- 1 root root 92633027 4月  16 14:07 redis.log
-rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-sentinel
-rwxr-xr-x 1 root root  9450264 4月  15 10:13 redis-server
-rwxr-xr-x 1 root root     3600 4月  15 10:13 redis-trib.rb
-rw-r--r-- 1 root root        0 4月  15 15:13 sentinel.log
[root@mon1 bin]# ./redis-sentinel ../sentinel.conf 

之后你会看到bin目前下生成了sentinel.log日志文件。

[root@mon1-micro1 ~]# redis-cli -p 26379
127.0.0.1:26379> auth root redis@23
(error) WRONGPASS invalid username-password pair or user is disabled.
127.0.0.1:26379> auth root redis@123
(error) WRONGPASS invalid username-password pair or user is disabled.
127.0.0.1:26379> auth default redis@123
OK
127.0.0.1:26379> 
127.0.0.1:26379> 
127.0.0.1:26379> 
127.0.0.1:26379> 
127.0.0.1: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=10.117.201.82:6379,slaves=2,sentinels=3  #两个从节点、3个哨兵都启动成功
127.0.0.1:26379> 

容灾切换

现在模拟主机宕机,将主机redis服务关闭,如下:

[root@mon1-micro2 ~]# redis-cli -p 6379
127.0.0.1:6379> auth redis
OK
127.0.0.1:6379> shutdown 
not connected> 

上面我关掉了82master节点。现在看看80、81机器节点。

81机器情况如下、可以看到主节点切换到80了

127.0.0.1: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=10.117.201.80:6379,slaves=2,sentinels=3
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.117.201.80
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:17088095
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:67dcebd0c5d474dcecd8aa542560656fc46fa289
master_replid2:c0a2102172e7881617d30f7138b0d2923f322d98
master_repl_offset:17088095
second_repl_offset:16905585
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16039520
repl_backlog_histlen:1048576
127.0.0.1:6379> 

80机器的情况如下:

[root@mon1 ~]# redis-cli -p 6379
127.0.0.1:6379> auth redis
OK
127.0.0.1:6379> info replication
# Replication
role:master  --主节点
connected_slaves:1
slave0:ip=10.117.201.81,port=6379,state=online,offset=17115813,lag=1 --一个从节点
master_failover_state:no-failover
master_replid:67dcebd0c5d474dcecd8aa542560656fc46fa289
master_replid2:c0a2102172e7881617d30f7138b0d2923f322d98
master_repl_offset:17116091
second_repl_offset:16905585
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16067516
repl_backlog_histlen:1048576

82节点down机了,观察80、81、redis.log,可以看到日志如下

3314646:S 16 Apr 2021 14:56:18.351 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:18.351 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:19.352 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:19.353 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:19.353 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:20.353 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:20.353 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:20.354 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:21.355 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:21.355 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:21.355 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:22.357 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:22.357 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:22.358 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:23.359 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:23.359 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:23.359 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:24.361 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:24.361 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:24.361 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:25.362 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:25.362 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:25.363 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:26.364 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:26.364 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:26.364 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:27.366 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:27.366 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:27.366 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:28.367 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:28.367 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:28.367 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:29.368 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:29.368 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:29.368 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:30.369 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:30.370 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:30.370 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:31.371 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:31.371 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:31.371 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:32.373 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:32.373 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:32.373 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:33.374 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:33.374 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:33.374 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:34.376 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:34.376 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:34.376 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:35.377 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:35.377 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:35.377 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:36.378 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:36.378 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:36.379 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:37.380 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:37.380 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:37.380 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:38.382 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:38.382 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:38.382 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:39.383 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:39.383 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:39.383 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:40.385 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:40.385 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:40.385 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:41.386 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:41.386 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:41.386 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:42.388 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:42.388 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:42.388 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:43.389 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:43.389 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:43.389 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:44.390 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:44.390 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:44.391 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:45.392 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:45.392 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:45.392 # Error condition on socket for SYNC: Connection refused
3314646:S 16 Apr 2021 14:56:46.393 * Connecting to MASTER 10.117.201.82:6379
3314646:S 16 Apr 2021 14:56:46.393 * MASTER <-> REPLICA sync started
3314646:S 16 Apr 2021 14:56:46.394 # Error condition on socket for SYNC: Connection refused

可以看到,当主机挂了的时候,一直连接主机被拒绝,当哨兵选举它为主机后,它成功执行重写的配置文件,并且连接了其他从机

再启动一下我们看看它的日志情况。重新启动之后,发现主节点变成了80.

[root@mon1-micro2 bin]# tail -f redis.log 
1584587:S 16 Apr 2021 15:17:24.058 * Trying a partial resynchronization (request 3722265bd9b9095855aed9e68803fb3f44b28903:1).
1584587:S 16 Apr 2021 15:17:24.059 * Full resync from master: 67dcebd0c5d474dcecd8aa542560656fc46fa289:17160587
1584587:S 16 Apr 2021 15:17:24.059 * Discarding previously cached master state.
1584587:S 16 Apr 2021 15:17:24.141 * MASTER <-> REPLICA sync: receiving 204 bytes from master to disk
1584587:S 16 Apr 2021 15:17:24.141 * MASTER <-> REPLICA sync: Flushing old data
1584587:S 16 Apr 2021 15:17:24.141 * MASTER <-> REPLICA sync: Loading DB in memory
1584587:S 16 Apr 2021 15:17:24.144 * Loading RDB produced by version 6.2.1
1584587:S 16 Apr 2021 15:17:24.144 * RDB age 0 seconds
1584587:S 16 Apr 2021 15:17:24.144 * RDB memory usage when created 2.03 Mb
1584587:S 16 Apr 2021 15:17:24.145 * MASTER <-> REPLICA sync: Finished with success
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.117.201.81,port=6379,state=online,offset=17176151,lag=0
slave1:ip=10.117.201.82,port=6379,state=online,offset=17176151,lag=0
master_failover_state:no-failover
master_replid:67dcebd0c5d474dcecd8aa542560656fc46fa289
master_replid2:c0a2102172e7881617d30f7138b0d2923f322d98
master_repl_offset:17176429
second_repl_offset:16905585
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16127854
repl_backlog_histlen:1048576
127.0.0.1:6379> 

至此哨兵模式安装成功。

Master is currently unable to PSYNC but should be in the future: -NOMASTERLINK Can't SYNC while not connected with my master
slaveof ip port
主服务器设置成了 slave 模式(从服务器),登录客户端,用 slaveof no one 命令改回来
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西门吹雪吹吹风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值