redis

10/27 07:35
阅读数 23

  RDB和AOF的优缺点

RDB优点:

      (1)RDB会生成多个数据文件,每个数据文件都代表了某个时刻中redis的数据,这种多个数据

               文件方式,非常适合冷备份。

      (2)RBD可以最小化redis的性能,父进程在保存RBD文件时唯一要做的就是fork出一个子进程,

               让子进程对磁盘IO进行RDB持久化。

      (3)RDB在恢复大数据集时的速度比AOF的恢复速度要快

RDB缺点:

      (1)不能实时保存数据,可能会丢失上一次执行RDB备份到当前的内存数据

      (2)当数据量非常大的时候,从父进程fork子进程进行保存RDB文件需要一段时间,可能是毫秒或者秒,取决于

               磁盘IO性能。而且可能会造成服务器在一定时间内停止处理客户端,如果数据非常庞大并且CPU利用率高

               那么这种时间可能会长达一秒或更久。

AOF优点:

      (1)更好的保护数据不丢失,一般AOF每隔一秒,通过后台线程执行一次fsync操作,最多丢失一秒数据。

      (2)日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,

               即使文件尾部破损,也很容易修复。

      (3) AOF文件体积变得过大时,自动地在后台对AOF进行重写:重写后的新AOF文件包含了

恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件

的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停

机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新

AOF文件,并开始对新AOF文件进行追加操作。

       (4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。

               比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,

               将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据          

AOF缺点: 

       (1)即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件

       (2)AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢

       (3)根据fsync策略不同,AOF速度可能会慢于RDB

       (4)bug 出现的可能性更多


master和slave同步过程


image.png

master:

[root@master ~]#yum -y install redis
[root@master ~]#vim /etc/redis.conf
required 123456  #设置redis密码123456
[root@master ~]# systemctl start redis

slave1

image.png

slave2

[root@centos8-2 ~]#vim /etc/redis.conf
 replicaof 192.168.80.120 6379
 masterauth 123456
 
[root@centos8-2 ~]#systemctl restart redis 
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.80.120
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:966
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e37df82f14b86bb7223a9c7f31674a6ff7cd2aed
master_replid2:000000000000000000000000000000000000000000
master_repl_offset:966
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:897
repl_backlog_histlen:70

同步日志

image.png

测试同步

image.png


哨兵的使用和实现机制

image.png

bind 0.0.0.0

masterauth  123456

requirepass 123456

#以上三个配置选项必须一致


master服务器状态

[root@master ~]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0
requirepass 123456

[root@master ~]#systemctp start redis

[root@master ~]#redis-cli  
127.0.0.1:6379> INFO replication  #建立完主从复制后查完
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.80.122,port=6379,state=online,offset=154,lag=1
slave1:ip=192.168.80.121,port=6379,state=online,offset=154,lag=0
master_replid:0126bea2673f06bf462aa39fc08796fa1b8f7048
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154

配置slave1

[root@slave ~]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0
replicaof 192.168.80.120 6379
masterauth  123456
requirepass 123456

[root@slave ~]#systemctp start redis

[root@slave1 ~]#redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.80.120
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:126
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:0126bea2673f06bf462aa39fc08796fa1b8f7048
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:112

配置slave2

[root@slave2 ~]# vim /apps/redis/etc/redis.conf  
bind 0.0.0.0
replicaof 192.168.80.120 6379
masterauth  123456
requirepass 123456

[root@slave2 ~]#systemctp start redis

[root@slave2 ~]#redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:192.168.80.120
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:140
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:0126bea2673f06bf462aa39fc08796fa1b8f7048
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140

编辑哨兵的配置文件

sentinel配置Sentinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在26379/tcp端口.

哨兵可以不和Redis服务器部署在一起,但一般部署在一起,所有redis节点使用相同的以下示例的配置文件

#如果是编译安装,在源码目录有sentinel.conf,复制到安装目录即可,
bind 0.0.0.0  

port 26379

daemonize yes

pidfile "redis-sentinel.pid"

logfile "sentinel_26379.log"

dir "/tmp" #工作目录

sentinel myid 50547f34ed71fd48c197924969937e738a39975b

sentinel monitor mymaster 192.168.80.120 6379 2 #指定当前mymaster集群中master服务器地址和端口
#2为法定人数限制(quorum),即有几个sentinel认为master down了就进行故障转移,一般此值是所有sentinel节点(一般总数是>=3的 奇数,如:3,5,7等)的一半以上的整数值,比如,总数是3,即3/2=1.5,取整为2,是master的ODOWN客观下线的依据

setinel auth-pass mymaster 123456 #mymaster集群的密码

sentinel down-after-milliseconds mymaster 30000 #(SDOWN)判断所有节点的主观下线的时间,单位:毫秒,建议3000

sentinel parallel-syncs mymaster 1 #发生故障转移后,同时向新master同步数据的slave数量,数字越小总同步时间越长,但可以减轻新master的负载压力

sentinel failover-timeout mymaster 180000 #所有slaves指向新的master所需的超时时间,单位:毫秒

sentinel deny-scripts-reconfig yes #禁止修改脚本

logfile /var/log/redis/sentinel.log

三个哨兵服务器的配置都如下

#master
[root@master etc]#grep -vE "^#|^$" sentinel.conf
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/redis-sentinel.log"
dir /apps/redis/data
sentinel monitor mymaster 192.168.80.120 6379 2
sentinel auth-pass mymaster  123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

[root@slave1 etc]#grep -vE "^#|^$" sentinel.conf
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/redis-setinel.log"
dir /apps/redis/data
sentinel monitor mymaster 192.168.80.120 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

[root@slave2 etc]#grep -vE "^#|^$" sentinel.conf
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/redis-setinel.log"
dir /apps/redis/data
sentinel monitor mymaster 192.168.80.120 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

启动哨兵

三台哨兵服务器都要启动

#如果是编译安装,在所有哨兵服务器执行下面操作启动哨兵
/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
#正常启动
systemctl enable --now redis-sentinel.service

验证哨兵端口

[root@master ~]#ss -ntl
State           Recv-Q           Send-Q                     Local Address:Port                      Peer Address:Port
LISTEN          0                128                              0.0.0.0:22                             0.0.0.0:*
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                                 [::]:22                                [::]:*
LISTEN          0                511                                 [::]:26379                             [::]:*
LISTEN          0                128                                    *:80                                   *:*


查看哨兵日志

image.png

当前sentinel状态

在sentinel状态中尤其是最后一行,涉及到masterIP是多少,有几个slave,有几个sentinels,必须是符合全部服务器数量

[root@master ~]#redis-cli  -p 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=192.168.80.120:6379,slaves=2,sentinels=3
#两个slave,三个sentinel服务器

停止Redis Master测试故障转移

[root@master ~]#killall redis-server

故障转移时sentinel的信息:

image.png


故障转移后的redis配置文件会被自动修改

故障转移后slave节点redis.conf中的replicaof行会自动指向新的master IP地址

image.png

哨兵配置文件的sentinel monitor IP 同样也会被修改

image.png


当前 redis状态

[root@slave2 ~]#redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.80.121,port=6379,state=online,offset=168606,lag=1
master_replid:dd08d904612b254ad4b6ecb0520dbe540ddb0dea
master_replid2:0126bea2673f06bf462aa39fc08796fa1b8f7048
master_repl_offset:168606
second_repl_offset:138944
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168606

#192.168.80.122提升为新主


[root@slave1 ~]#redis-clis
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> info replication
# Replication
role:slave 
master_host:192.168.80.122  #指定新主
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:153507
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:dd08d904612b254ad4b6ecb0520dbe540ddb0dea
master_replid2:0126bea2673f06bf462aa39fc08796fa1b8f7048
master_repl_offset:153507
second_repl_offset:138944
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:153493

恢复故障的原master重新加入redis集群

[root@redis-master ~]#systemctl start redis

在原 master上观察状态

[root@master etc]#redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:192.168.80.122
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:301606
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:dd08d904612b254ad4b6ecb0520dbe540ddb0dea
master_replid2:0126bea2673f06bf462aa39fc08796fa1b8f7048
master_repl_offset:301606
second_repl_offset:138944
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:138944
repl_backlog_histlen:162663

有新的slave加入

image.png



redis cluster 集群创建和使用


基于Redis 5 的 redis cluster 部署

创建 redis cluster集群的环境准备

  1. 每个redis 节点采用相同的硬件配置、相同的密码、相同的redis版本

  2. 所有redis服务器必须没有任何数据

  3. 准备六台主机,地址如下:

192.168.80.125

192.168.80.126

192.168.80.127

192.168.80.128

192.168.80.129

192.168.80.130

启用 redis cluster 配置

所有6台主机都执行以下配置

[root@centos8 ~]#dnf -y install redis


每个节点修改redis配置,必须开启cluster功能的参数

[root@centos8 ~]# vim /etc/redis.conf
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不可用

创建集群

# redis-cli --cluster-replicas 1 表示每个master对应一个slave节点
[root@centos8 ~]#redis-cli -a 123456 --cluster create 192.168.80.125:6379 192.168.80.126:6379 192.168.80.127:6379 192.168.80.128:6379 192.168.80.129:6379 192.168.80.130:6379 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.80.129:6379 to 192.168.80.125:6379
Adding replica 192.168.80.130:6379 to 192.168.80.126:6379
Adding replica 192.168.80.128:6379 to 192.168.80.127:6379
M: d9877d6ce6031711c0f9e21cad2b6a290c1d165f 192.168.80.125:6379  #M为master 
   slots:[0-5460] (5461 slots) master
M: 2cd4e5661a34ef8db17b54a3fbb1f4a50a584698 192.168.80.126:6379
   slots:[5461-10922] (5462 slots) master
M: fac54bc8e22a640c4b6788f23c2370ea6f67198b 192.168.80.127:6379
   slots:[10923-16383] (5461 slots) master
S: f06d0b26acfbf88d8fcc6e6c6dea8fefa87990fd 192.168.80.128:6379  #S为slave
   replicates fac54bc8e22a640c4b6788f23c2370ea6f67198b
S: 1db24f6a91497767f9a3d72aef142eb14bd3143d 192.168.80.129:6379
   replicates d9877d6ce6031711c0f9e21cad2b6a290c1d165f
S: b8985b85a4697daf0c713dc5cfb94e5b5fc69d3c 192.168.80.130:6379
   replicates 2cd4e5661a34ef8db17b54a3fbb1f4a50a584698
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 192.168.80.125:6379)
M: d9877d6ce6031711c0f9e21cad2b6a290c1d165f 192.168.80.125:6379
   slots:[0-5460] (5461 slots) master  #自动分配槽位
   1 additional replica(s)
S: 1db24f6a91497767f9a3d72aef142eb14bd3143d 192.168.80.129:6379
   slots: (0 slots) slave
   replicates d9877d6ce6031711c0f9e21cad2b6a290c1d165f #slave对应的masterI D
M: 2cd4e5661a34ef8db17b54a3fbb1f4a50a584698 192.168.80.126:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: f06d0b26acfbf88d8fcc6e6c6dea8fefa87990fd 192.168.80.128:6379
   slots: (0 slots) slave
   replicates fac54bc8e22a640c4b6788f23c2370ea6f67198b
S: b8985b85a4697daf0c713dc5cfb94e5b5fc69d3c 192.168.80.130:6379
   slots: (0 slots) slave
   replicates 2cd4e5661a34ef8db17b54a3fbb1f4a50a584698
M: fac54bc8e22a640c4b6788f23c2370ea6f67198b 192.168.80.127:6379
   slots:[10923-16383] (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.  #所有槽位(16384个)分配完成


查看主从状态

[root@centos8 ~]#redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:0
master_replid:64b6d91142f9bb0836f982ad6e6c8e166ea22197
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0


[root@centos8-2 ~]#redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:0
master_replid:9c93108e9832bb5d1172f5bd939af0b8be949262
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0


[root@centos8-3 ~]#redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:0
master_replid:203a896fe4c08934fa1bd03dc4a8b091e0d66165
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0



验证集群状态

[root@centos7 ~]#redis-cli -a 123456 CLUSTER INFO
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
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:433
cluster_stats_messages_pong_sent:409
cluster_stats_messages_sent:842
cluster_stats_messages_ping_received:404
cluster_stats_messages_pong_received:433
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:842

#查看任意节点的集群状态
[root@centos7 ~]#redis-cli -a 123456 --cluster info 192.168.80.126:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.80.126:6379 (2cd4e566...) -> 0 keys | 5462 slots | 1 slaves.
192.168.80.127:6379 (fac54bc8...) -> 0 keys | 5461 slots | 1 slaves.
192.168.80.125:6379 (d9877d6c...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.



查看集群node对应关系

[root@centos7 ~]#redis-cli -a 123456 CLUSTER NODES
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1db24f6a91497767f9a3d72aef142eb14bd3143d 192.168.80.129:6379@16379 slave d9877d6ce6031711c0f9e21cad2b6a290c1d165f 0 1603522022127 5 connected
2cd4e5661a34ef8db17b54a3fbb1f4a50a584698 192.168.80.126:6379@16379 master - 0 1603522020111 2 connected 5461-10922
f06d0b26acfbf88d8fcc6e6c6dea8fefa87990fd 192.168.80.128:6379@16379 slave fac54bc8e22a640c4b6788f23c2370ea6f67198b 0 1603522021119 4 connected
b8985b85a4697daf0c713dc5cfb94e5b5fc69d3c 192.168.80.130:6379@16379 slave 2cd4e5661a34ef8db17b54a3fbb1f4a50a584698 0 1603522018095 6 connected
d9877d6ce6031711c0f9e21cad2b6a290c1d165f 192.168.80.125:6379@16379 myself,master - 0 1603522018000 1 connected 0-5460
fac54bc8e22a640c4b6788f23c2370ea6f67198b 192.168.80.127:6379@16379 master - 0 1603522019103 3 connected 10923-16383

验证集群写入key

#经过算法计算,当前key的槽位需要写入指定的node
127.0.0.1:6379> set name wang 
(error) MOVED 5798 192.168.80.126:6379  #槽位不在当前node所以无法写入




展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部