一、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 命令改回来