redis持久化和哨兵及集群搭建

1、RDB和AOF的优缺点

RDB模式优缺点

优点:

  • RDB快照保存了某个时间点的数据,可以通过脚本执行redis指令bgsave(非阻塞,后台执行)或者 save(会阻塞写操作,不推荐)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不 同时间点的版本,很适合备份,并且此文件格式也支持有不少第三方工具可以进行后续的数据分析,比如: 可以在最近的24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一个 ROB文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
  • RDB可以最大化Redis的性能,父进程在保存 RDB文件时唯一要做的就是fork出一个子进程,然后 这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘工/0操作。
  • RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快

缺点:

  • 不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据
  • 当数据量非常大的时候,从父进程fork子进程进行保存至RDB文件时需要一点时间,可能是毫秒或 者秒,取决于磁盘IO性能

AOF模式优缺点

优点:

  • 数据安全性相对较高,根据所使用的fsync策略(fsync是同步内存中redis所有已经修改的文件到存 储设备),默认是appendfsync everysec,即每秒执行一次 fsync,在这种配置下,Redis 仍然可以 保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync会在后台线程执 行,所以主线程可以继续努力地处理命令请求)
  • 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中不需要seek, 即使出 现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果本次操作只是写入了一半数据就出 现了系统崩溃问题,不用担心,在Redis下一次启动之前,可以通过 redis-check-aof 工具来解决 数据一致性的问题
  • Redis可以在 AOF文件体积变得过大时,自动地在后台对AOF进行重写,重写后的新AOF文件包含了 恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件 的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停 机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新 AOF文件,并开始对新AOF文件进行追加操作。
  • AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文 件完成数据的重建

缺点:

  • 即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件
  • AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
  • 根据fsync策略不同,AOF速度可能会慢于RDB
  • bug 出现的可能性更多

2、master和slave同步过程

1)从服务器连接主服务器,发送PSYNC命令
2)主服务器接收到PSYNC命令后,开始执行BGSAVE命令生成RDB快照文件并使用缓冲区记录此后执行的所有
写命令
3)主服务器BGSAVE执行完后,向所有从服务器发送RDB快照文件,并在发送期间继续记录被执行的写命令
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照至内存
5)主服务器快照发送完毕后,开始向从服务器发送缓冲区中的写命令
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
7)后期同步会先发送自己slave_repl_offset位置,只同步新增加的数据,不再全量同步

3、哨兵的使用和实现机制

  1. 多个sentinel发现并确认master有问题
  2. 选举出一个sentinel作为领导
  3. 选出一个slave作为master
  4. 通知其余slave成为新的master的slave
  5. 通知客户端主从变化
  6. 等待老的master复活成为新的master的slave

哨兵使用范例:

本实验采用的是编译安装的redis5.07版本

选用三台主机模拟哨兵机制,并在每台机器上配置哨兵服务(哨兵和redis服务可以不在同一台机器上,本实验选择在同一台主机上配置)

master:10.0.0.8
slave1:10.0.0.18
slave2:10.0.0.28

每台机器redis配置文件均如下所示

[root@master ~]#grep -e "^[^#]" /apps/redis/etc/redis.conf 
bind  0.0.0.0  #监听所有ip
protected-mode yes 
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes #设为yes为后台启动
supervised no
pidfile /apps/redis/run/redis.pid  #pid文件路径
loglevel notice
logfile /apps/redis/log/redis.log  #日志文件路径
databases 16   
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /apps/redis/data/  #数据文件目录需要用绝对路径,否则主从同步会失败
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

配置哨兵文件如下

#从解压文件中复制哨兵配置文件模板,修改如下
[root@master ~]#cp redis-5.0.7/sentinel.conf /apps/redis/etc/
[root@master ~]#egrep "^[^#| ]" /apps/redis/etc/sentinel.conf 
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/log/sentinel_26379.log"
dir "/apps/redis/data"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.8 6379 2
sentinel down-after-milliseconds mymaster 3000
#将修改好的配置文件发送到每台哨兵所在机器
[root@master ~]#scp /apps/redis/etc/sentinel.conf 10.0.0.18:/apps/redis/etc/
sentinel.conf                                                             100% 9724    13.6MB/s   00:00    
[root@master ~]#scp /apps/redis/etc/sentinel.conf 10.0.0.28:/apps/redis/etc/
sentinel.conf                                                             100% 9724    13.6MB/s   00:00    

启动redis服务,搭建主从

#启动服务
[root@master ~]#systemctl start redis
[root@master ~]#ss -ntl
State         Recv-Q        Send-Q               Local Address:Port                Peer Address:Port        
LISTEN        0             511                        0.0.0.0:6379                     0.0.0.0:*           
LISTEN        0             128                        0.0.0.0:22                       0.0.0.0:*           
LISTEN        0             128                           [::]:22                          [::]:*           
#在每台从服务器上执行
[root@slave1 ~]#redis-cli
10.0.0.18:6379> REPLICAOF 10.0.0.8 6379
OK
#127.0.0.1:6379> masterauth xxx  #主服务器有密码需要在此输入密码,xxx为主redis密码
10.0.0.18:6379> info replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:80
slave_read_only:1
connected_slaves:0
master_replid:cd512b7401e1a8f1340fa71fd4612495acd63ce0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
#slave2上执行以上同样步骤

#在主服务器上查看状态
[root@master ~]#redis-cli -h 10.0.0.8
10.0.0.8:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.18,port=6379,state=online,offset=588,lag=1
slave1:ip=10.0.0.28,port=6379,state=online,offset=588,lag=1
master_replid:cd512b7401e1a8f1340fa71fd4612495acd63ce0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:588
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:588

每台机器都启动哨兵

[root@master ~]#redis-sentinel /apps/redis/etc/sentinel.conf 
[root@master ~]#ss -ntl
State         Recv-Q        Send-Q               Local Address:Port                Peer Address:Port        
LISTEN        0             511                        0.0.0.0:26379                    0.0.0.0:*           
LISTEN        0             511                        0.0.0.0:6379                     0.0.0.0:*           
LISTEN        0             128                        0.0.0.0:22                       0.0.0.0:*           
LISTEN        0             511                           [::]:26379                       [::]:*           
LISTEN        0             128                           [::]:22                          [::]:*
[root@master ~]#ps -ef | grep redis
redis       1394       1  0 14:36 ?        00:00:00 /apps/redis/bin/redis-server 0.0.0.0:6379
root        1422       1  0 14:55 ?        00:00:00 redis-sentinel *:26379 [sentinel]  
root        1428    1340  0 14:57 pts/0    00:00:00 grep --color=auto redis
#确保每个哨兵启动后的sentinel myid不同
[root@slave2 ~]#grep "sentinel myid" /apps/redis/etc/sentinel.conf 
sentinel myid 718151bc8d782018a86393332ebb1e825af78a40
#查看哨兵启动后的日志文件
[root@slave2 ~]#cat /apps/redis/log/sentinel_26379.log 
1471:X 25 Oct 2020 14:59:13.825 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1471:X 25 Oct 2020 14:59:13.825 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1471, just started
1471:X 25 Oct 2020 14:59:13.825 # Configuration loaded
1472:X 25 Oct 2020 14:59:13.826 * Increased maximum number of open files to 10032 (it was originally set to 1024).
1472:X 25 Oct 2020 14:59:13.827 * Running mode=sentinel, port=26379.
1472:X 25 Oct 2020 14:59:13.828 # Sentinel ID is 718151bc8d782018a86393332ebb1e825af78a40
1472:X 25 Oct 2020 14:59:13.828 # +monitor master mymaster 10.0.0.8 6379 quorum 2
1472:X 25 Oct 2020 14:59:13.828 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379
1472:X 25 Oct 2020 14:59:13.829 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
1472:X 25 Oct 2020 14:59:13.849 * +sentinel sentinel 9c0142a4d29bcd7b7c9dd7fb890c4f28544b4809 10.0.0.18 26379 @ mymaster 10.0.0.8 6379
1472:X 25 Oct 2020 14:59:14.250 * +sentinel sentinel 8ea91d6e2a2c27155d3fdb7e8e147dab48dd7975 10.0.0.8 26379 @ mymaster 10.0.0.8 6379

测试主从同步效果

[root@master ~]#redis-cli set name xxx
OK
[root@slave1 ~]#redis-cli get name
"xxx"
#从节点为只读
[root@slave1 ~]#redis-cli set age 100
(error) READONLY You can't write against a read only replica.

测试哨兵功能

模拟主服务器宕机

#停止redis主节点
[root@master ~]#systemctl stop redis
#查看哨兵日志,发现slave1(10.0.0.18)被提升为新master
[root@master ~]#tail /apps/redis/log/sentinel_26379.log 
1422:X 25 Oct 2020 15:09:12.610 # +failover-state-reconf-slaves master mymaster 10.0.0.8 6379
1422:X 25 Oct 2020 15:09:12.681 * +slave-reconf-sent slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
1422:X 25 Oct 2020 15:09:13.684 * +slave-reconf-inprog slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
1422:X 25 Oct 2020 15:09:13.684 * +slave-reconf-done slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
1422:X 25 Oct 2020 15:09:13.784 # -odown master mymaster 10.0.0.8 6379
1422:X 25 Oct 2020 15:09:13.784 # +failover-end master mymaster 10.0.0.8 6379
1422:X 25 Oct 2020 15:09:13.784 # +switch-master mymaster 10.0.0.8 6379 10.0.0.18 6379  #新主即位
1422:X 25 Oct 2020 15:09:13.784 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.18 6379
1422:X 25 Oct 2020 15:09:13.784 * +slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
1422:X 25 Oct 2020 15:09:16.845 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
[root@slave1 ~]#redis-cli -h 10.0.0.18 info replication
# Replication
role:master  #成为新主
connected_slaves:1
slave0:ip=10.0.0.28,port=6379,state=online,offset=185750,lag=0
master_replid:635d039846fc86578128b891fe98949a45ae8e8d
master_replid2:cd512b7401e1a8f1340fa71fd4612495acd63ce0
master_repl_offset:185883
second_repl_offset:131355
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:185883
#查看slave2
[root@slave2 ~]#redis-cli -h 10.0.0.28 info replication
# Replication
role:slave
master_host:10.0.0.18  #主节点指向slave1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:202180
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:635d039846fc86578128b891fe98949a45ae8e8d
master_replid2:cd512b7401e1a8f1340fa71fd4612495acd63ce0
master_repl_offset:202180
second_repl_offset:131355
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:202124
#重新启动旧master,并查看信息
[root@master ~]#redis-cli -h 10.0.0.8 info replication
# Replication
role:slave  #旧主变为从节点
master_host:10.0.0.18  #主节点指向slave1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:225588
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:635d039846fc86578128b891fe98949a45ae8e8d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:225588
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:224505
repl_backlog_histlen:1084
#再次查看日志
[root@slave1 ~]#tail /apps/redis/log/sentinel_26379.log 
1467:X 25 Oct 2020 15:09:11.609 # +vote-for-leader 8ea91d6e2a2c27155d3fdb7e8e147dab48dd7975 1
1467:X 25 Oct 2020 15:09:12.662 # +odown master mymaster 10.0.0.8 6379 #quorum 3/2
1467:X 25 Oct 2020 15:09:12.662 # Next failover delay: I will not start a failover before Sun Oct 25 15:15:11 2020
1467:X 25 Oct 2020 15:09:12.681 # +config-update-from sentinel 8ea91d6e2a2c27155d3fdb7e8e147dab48dd7975 10.0.0.8 26379 @ mymaster 10.0.0.8 6379
1467:X 25 Oct 2020 15:09:12.681 # +switch-master mymaster 10.0.0.8 6379 10.0.0.18 6379
1467:X 25 Oct 2020 15:09:12.681 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.18 6379
1467:X 25 Oct 2020 15:09:12.681 * +slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
1467:X 25 Oct 2020 15:09:15.732 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
1467:X 25 Oct 2020 15:16:55.219 # -sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
1467:X 25 Oct 2020 15:17:05.186 * +convert-to-slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379  #10.0.0.8已成为10.0.0.18的从节点

到此,哨兵的功能已经实现

4、redis cluster集群创建和使用

1.环境准备

  1. 每个redis 节点采用相同的硬件配置、相同的密码、相同的redis版本
  2. 所有redis服务器必须没有任何数据
  3. 准备六台主机,地址如下:
10.0.0.8
10.0.0.18
10.0.0.28
10.0.0.38
10.0.0.48
10.0.0.58

2.每台机器修改配置文件

#手动修改配置文件
[root@master1 ~]vim /apps/redis/
bind 0.0.0.0
masterauth 123456   #建议配置,否则后期的master和slave主从复制无法成功,还需再配置
requirepass 123456
cluster-enabled yes #取消此行注释,必须开启集群,开启后redis 进程会有cluster显示
cluster-config-file nodes-6379.conf #取消此行注释,此为集群状态文件,记录主从关系及slot范围信息,由redis cluster 集群自动创建和维护
cluster-require-full-coverage no   #默认值为yes,设为no可以防止一个节点不可用导致整个cluster不可能
#或者执行下面命令,批量修改
[root@master1 ~]#sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e
'/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file
nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-requirefull-coverage yes/c cluster-require-full-coverage no' /etc/redis.conf

验证当前redis服务状态

#开启了16379的cluster的端口,实际的端口=redis port + 10000
[root@master1 ~]#ss -ntl
State      Recv-Q      Send-Q           Local Address:Port            Peer Address:Port  
LISTEN     0           128                    0.0.0.0:6379                 0.0.0.0:*     
LISTEN     0           128                    0.0.0.0:22                   0.0.0.0:*     
LISTEN     0           128                    0.0.0.0:16379                0.0.0.0:*     
LISTEN     0           128                       [::]:22                      [::]:*   
#进程中有[cluster]状态
[root@master1 ~]#ps -ef | grep redis
redis      11393       1  0 14:49 ?        00:00:01 /apps/redis/bin/redis-server 0.0.0.0:6379 [cluster]
root       11445   11333  0 15:13 pts/1    00:00:00 grep --color=auto redis

3.创建集群

# redis-cli --cluster-replicas 1 表示每个master对应一个slave节点
[root@master1 ~]#redis-cli --cluster create 10.0.0.8:6379 10.0.0.18:6379 10.0.0.28:6379 10.0.0.38:6379 10.0.0.48:6379 10.0.0.58:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.0.0.48:6379 to 10.0.0.8:6379
Adding replica 10.0.0.58:6379 to 10.0.0.18:6379
Adding replica 10.0.0.38:6379 to 10.0.0.28:6379
M: 0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379   #M为master
   slots:[0-5460] (5461 slots) master  #当前master的槽位起始和结束位
M: 610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
M: 2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
S: 56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379 #S为slave
   replicates 2101512ec6b87606864ff6ca708f6726030e444a
S: 35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379
   replicates 0f7a268965b3b597b0411e36ccc739fd88061b3c
S: 6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379
   replicates 610c017f375595a7189f743400464e880f81a7e4
Can I set the above configuration? (type 'yes' to accept): yes  #输入yes自动创建集群
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: 0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master  #已经分配的槽位
   1 additional replica(s)  #分配了一个slave
M: 610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379
   slots: (0 slots) slave #slave没有分配槽位
   replicates 2101512ec6b87606864ff6ca708f6726030e444a  #对应master的id
M: 2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379
   slots: (0 slots) slave
   replicates 610c017f375595a7189f743400464e880f81a7e4
S: 35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379
   slots: (0 slots) slave
   replicates 0f7a268965b3b597b0411e36ccc739fd88061b3c
[OK] All nodes agree about slots configuration. #所有节点槽位分配完成
>>> Check for open slots...  #检查打开的槽位
>>> Check slots coverage...  #检查插槽覆盖范围
[OK] All 16384 slots covered.   #所有槽位(16384)分配完成

#观察以上结果,可以看到3组master/slave
master:10.0.0.28-----slave:10.0.0.38
master:10.0.0.18-----slave:10.0.0.58
master:10.0.0.8-----slave:10.0.0.48

4.查看主从状态

[root@master1 ~]#redis-cli -c info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.48,port=6379,state=online,offset=3892,lag=0
master_replid:72fef5d870e8cc47a6456569a671fb431179c18c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3892
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3892
[root@master1 ~]#redis-cli -c  -h 10.0.0.48 info replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:3934
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:72fef5d870e8cc47a6456569a671fb431179c18c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3934
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3934

各节点信息

[root@master1 ~]#redis-cli -c  cluster nodes
610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379@16379 master - 0 1603526983000 2 connected 5461-10922
56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379@16379 slave 2101512ec6b87606864ff6ca708f6726030e444a 0 1603526982000 4 connected
2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379@16379 master - 0 1603526984233 3 connected 10923-16383
6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379@16379 slave 610c017f375595a7189f743400464e880f81a7e4 0 1603526983223 6 connected
35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379@16379 slave 0f7a268965b3b597b0411e36ccc739fd88061b3c 0 1603526982213 5 connected
0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379@16379 myself,master - 0 1603526981000 1 connected 0-5460
#输入以下命令和master id 可以获取相应从slave节点信息
[root@master1 ~]#redis-cli -c cluster slaves 0f7a268965b3b597b0411e36ccc739fd88061b3c
1) "35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379@16379 slave 0f7a268965b3b597b0411e36ccc739fd88061b3c 0 1603527264828 5 connected"

5.验证集群状态

[root@master1 ~]#redis-cli -c cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6  #节点数
cluster_size:3  #三个集群
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3476
cluster_stats_messages_pong_sent:3449
cluster_stats_messages_sent:6925
cluster_stats_messages_ping_received:3444
cluster_stats_messages_pong_received:3476
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:6925
#查看任意节点集群状态
[root@master1 ~]#redis-cli --cluster info 10.0.0.28:6379
10.0.0.28:6379 (2101512e...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.18:6379 (610c017f...) -> 0 keys | 5462 slots | 1 slaves.
10.0.0.8:6379 (0f7a2689...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

6.查看集群node对应关系

[root@master1 ~]#redis-cli cluster nodes
610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379@16379 master - 0 1603527910792 2 connected 5461-10922
56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379@16379 slave 2101512ec6b87606864ff6ca708f6726030e444a 0 1603527909784 4 connected
2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379@16379 master - 0 1603527908000 3 connected 10923-16383
6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379@16379 slave 610c017f375595a7189f743400464e880f81a7e4 0 1603527909000 6 connected
35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379@16379 slave 0f7a268965b3b597b0411e36ccc739fd88061b3c 0 1603527909000 5 connected
0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379@16379 myself,master - 0 1603527910000 1 connected 0-5460

[root@master1 ~]#redis-cli --cluster check 10.0.0.28:6379
10.0.0.28:6379 (2101512e...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.18:6379 (610c017f...) -> 0 keys | 5462 slots | 1 slaves.
10.0.0.8:6379 (0f7a2689...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.28:6379)
M: 2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379
   slots: (0 slots) slave
   replicates 0f7a268965b3b597b0411e36ccc739fd88061b3c
M: 610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379
   slots: (0 slots) slave
   replicates 2101512ec6b87606864ff6ca708f6726030e444a
S: 6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379
   slots: (0 slots) slave
   replicates 610c017f375595a7189f743400464e880f81a7e4
M: 0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

7.验证集群写入key

#经过算法计算,当前key的槽位需要写入指定的node
[root@master1 ~]#redis-cli -h 10.0.0.8 set key1 value1
(error) MOVED 9189 10.0.0.18:6379   #槽位不在当前node所以无法写入
#指定的node可写入
[root@master1 ~]#redis-cli -h 10.0.0.18 set key1 value1
OK
[root@master1 ~]#redis-cli -h 10.0.0.18 get key1 
"value1"
[root@master1 ~]#redis-cli -h 10.0.0.8 get key1 
(error) MOVED 9189 10.0.0.18:6379
#对应的slave节点可以KEYS *,但GET key1失败,可以到master上执行GET key1
[root@master1 ~]#redis-cli -h 10.0.0.58 get key1 
(error) MOVED 9189 10.0.0.18:6379
[root@master1 ~]#redis-cli -h 10.0.0.58 keys '*'
1) "key1"

#cluster计算得到key的槽位,在普通环境下(非集群环境)只有在对应槽位的机器上才可以创建和查看该key的值
[root@master1 ~]#redis-cli -h 10.0.0.8 cluster keyslot good
(integer) 2195   #2195在5460以内,对应10.0.0.8所在机器
[root@master1 ~]#redis-cli -h 10.0.0.8 set good xxx
OK
[root@master1 ~]#redis-cli -h 10.0.0.8 get good
"xxx"
[root@master1 ~]#redis-cli -h 10.0.0.18 get good
(error) MOVED 2195 10.0.0.8:6379
#在集群环境下 (-c 选项进入集群环境)在任意节点可以查看到key的值
[root@master1 ~]#redis-cli -h 10.0.0.18 -c get good
"xxx"

8.模拟master故障,对应slave节点自动提升为新master

#停止master(10.0.0.18),其对应的从节点(10.0.0.58)自动提升为master
[root@master2 ~]#systemctl stop redis
[root@master1 ~]#redis-cli -c cluster nodes
610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379@16379 master,fail - 1603531355527 1603531353000 2 disconnected  #旧主宕机
56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379@16379 master - 0 1603531653740 9 connected 10923-16383
2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379@16379 slave 56327070195c6bf1366011f57de9ed5b02be435b 0 1603531653000 9 connected
6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379@16379 master - 0 1603531654750 8 connected 5461-10922  #自动提升为主
35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379@16379 slave 0f7a268965b3b597b0411e36ccc739fd88061b3c 0 1603531653000 5 connected
0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379@16379 myself,master - 0 1603531654000 1 connected 0-5460
#在此启动,原master成为新master的从节点
[root@master1 ~]#redis-cli -c cluster nodes
610c017f375595a7189f743400464e880f81a7e4 10.0.0.18:6379@16379 slave 6b5ab04b226fecaddffef6603d15e9cd417ccbe8 0 1603531674941 8 connected
56327070195c6bf1366011f57de9ed5b02be435b 10.0.0.38:6379@16379 master - 0 1603531674000 9 connected 10923-16383
2101512ec6b87606864ff6ca708f6726030e444a 10.0.0.28:6379@16379 slave 56327070195c6bf1366011f57de9ed5b02be435b 0 1603531673930 9 connected
6b5ab04b226fecaddffef6603d15e9cd417ccbe8 10.0.0.58:6379@16379 master - 0 1603531674000 8 connected 5461-10922
35d67af201377156b8a6839ab2b2c763d345d03b 10.0.0.48:6379@16379 slave 0f7a268965b3b597b0411e36ccc739fd88061b3c 0 1603531675949 5 connected
0f7a268965b3b597b0411e36ccc739fd88061b3c 10.0.0.8:6379@16379 myself,master - 0 1603531675000 1 connected 0-5460
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值