redis

1、RDB和AOF的优缺点?
RDB 模式优点 :
1、RDB快照保存了某个时间点的数据,可以通过脚本执行redis指令bgsave(非阻塞,后台执行)或者 save(会阻塞写操作,不推荐)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不 同时间点的版本,很适合备份,并且此文件格式也支持有不少第三方工具可以进行后续的数据分析 。
2、RDB可以大化Redis的性能,父进程在保存 RDB文件时唯一要做的就是fork出一个子进程,然后 这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘工/0操作。
3、RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快
RDB模式缺点:
1、不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据。
2、当数据量非常大的时候,从父进程fork子进程进行保存至RDB文件时需要一点时间,可能是毫秒或 者秒,取决于磁盘IO性能。

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

2、master和slave同步过程?
本题有两台主机:10.0.0.8和10.0.0.18,现在将10.0.0.8作为master,10.0.0.18作为slave,操作过程如下:
#在slave上做如下操作:

127.0.0.1:6379> replicaof 10.0.0.8 6379
OK
127.0.0.1:6379> config set masterauth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:606
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f8ebfed3594ff7cbd26ea5a6ca7cc8f57cad992c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:606
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:565
repl_backlog_histlen:42

#在master上做如下操作:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.18,port=6379,state=online,offset=1255,lag=0
master_replid:f8ebfed3594ff7cbd26ea5a6ca7cc8f57cad992c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1255
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1255
127.0.0.1:6379> set key1 best
OK
127.0.0.1:6379> get key1
"best"

#在slave上做如下操作:

127.0.0.1:6379> get key1
"best"

3、哨兵的使用和实现机制?
哨兵的前提是已经实现了redis的主从复制环境,本题以10.0.0.8作为master,10.0.0.18作为slave1,10.0.0.28作为slave2。
#三台主机状态:


```bash
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.18,port=6379,state=online,offset=3724,lag=1
slave1:ip=10.0.0.28,port=6379,state=online,offset=3724,lag=1
master_replid:f8ebfed3594ff7cbd26ea5a6ca7cc8f57cad992c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3724
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3724

127.0.0.1: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:4004
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f8ebfed3594ff7cbd26ea5a6ca7cc8f57cad992c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4004
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3095
repl_backlog_histlen:910

127.0.0.1:6379> 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:3612
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f8ebfed3594ff7cbd26ea5a6ca7cc8f57cad992c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3612
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3179
repl_backlog_histlen:434

#修改sentinel配置文件如下:

[root@master ~]# grep -vE "^#|^$" /etc/redis-sentinel.conf
port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.8 6379 2
sentinel auth-pass mymaster 123456

[root@master ~]# scp /etc/redis-sentinel.conf 10.0.0.18:/etc/
[root@master ~]# scp /etc/redis-sentinel.conf 10.0.0.28:/etc/

#启动sentinel

[root@master ~]# grep "myid" /etc/redis-sentinel.conf
sentinel myid 01b78c3e9f2538568852929eeeba20a2df8f8732
[root@slave1 ~]# grep "myid" /etc/redis-sentinel.conf
sentinel myid 1817128c2a6975d04b4406d2ad07152dcfe588fb`在这里插入代码片`
[root@slave2 ~]# grep "myid" /etc/redis-sentinel.conf
sentinel myid e23ecd57a8e50b607b37012bdd4fca5ecc326a06

[root@master ~]# systemctl enable --now redis-sentinel.service
[root@slave1 ~]# systemctl enable --now redis-sentinel.service
[root@slave2 ~]# systemctl enable --now redis-sentinel.service

#验证sentinel端口:


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

#sentinel状态:

[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=10.0.0.8:6379,slaves=2,sentinels=3



4、redis cluster集群创建和使用?
#准备6台服务器:
10.0.0.8(master)—>10.0.0.38(slave)
10.0.0.18(master)—>10.0.0.48(slave)
10.0.0.28(master)—>10.0.0.58(slave)
#在所有节点上执行如下操作:

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

[root@centos8 ~]#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 nodes6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-fullcoverage yes/c cluster-require-full-coverage no' /etc/redis.conf

[root@centos8 ~]#systemctl enable --now redis

#执行meet操作实现相互通信:

[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456  --no-auth-warning cluster meet 10.0.0.18 6379 
[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456  --no-auth-warning cluster meet 10.0.0.28 6379 
[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456  --no-auth-warning cluster meet 10.0.0.38 6379 
[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456  --no-auth-warning cluster meet 10.0.0.48 6379 
[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456  --no-auth-warning cluster meet 10.0.0.58 6379

[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456 --no-auth-warning  cluster nodes a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 10.0.0.8:6379@16379 myself,master - 0 1602515365000 3 connected 
97c5dcc3f33c2fc75c7fdded25d05d2930a312c0 10.0.0.18:6379@16379 master - 0 1602515367093 1 connected 
cb20d58870fe05de8462787cf9947239f4bc5629 10.0.0.38:6379@16379 master - 0 1602515365057 0 connected 
779a24884dbe1ceb848a685c669ec5326e6c8944 10.0.0.48:6379@16379 master - 0 1602515365000 4 connected 
07231a50043d010426c83f3b0788e6b92e62050f 10.0.0.58:6379@16379 master - 0 1602515365000 5 connected 
4f146b1ac51549469036a272c60ea97f065ef832 10.0.0.28:6379@16379 master - 0 1602515366074 2 connected

#查看当前状态:

[root@centos8 ~]#redis-cli  -h 10.0.0.8 -a 123456  --no-auth-warning cluster info cluster_state:fail 
cluster_slots_assigned:0 
cluster_slots_ok:0 
cluster_slots_pfail:0 
cluster_slots_fail:0 
cluster_known_nodes:6 
cluster_size:0 
cluster_current_epoch:5 
cluster_my_epoch:3 
cluster_stats_messages_ping_sent:584 
cluster_stats_messages_pong_sent:145 
cluster_stats_messages_meet_sent:8 
cluster_stats_messages_sent:737 
cluster_stats_messages_ping_received:145 
cluster_stats_messages_pong_received:151 
cluster_stats_messages_received:296

#为各个master节点指派槽位范围:

[root@centos8 ~]#cat addslot.sh 
#!/bin/bash 
host=$1 
port=$2 
start=$3 
end=$4 
pass=123456
for slot in `seq ${start} ${end}`;do    
    echo slot:$slot    
    redis-cli -h ${host} -p $port -a ${pass} --no-auth-warning  cluster addslots ${slot} 
done


[root@centos8 ~]#bash addslot.sh  10.0.0.8 6379  0 5461 
[root@centos8 ~]#bash addslot.sh  10.0.0.18 6379 5462 10922 
[root@centos8 ~]#bash addslot.sh  10.0.0.28 6379 10923  16383

[root@centos8 ~]#redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning  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:5 
cluster_my_epoch:3 
cluster_stats_messages_ping_sent:1832 
cluster_stats_messages_pong_sent:1375 
cluster_stats_messages_meet_sent:8 
cluster_stats_messages_sent:3215 
cluster_stats_messages_ping_received:1375 
cluster_stats_messages_pong_received:1399 
cluster_stats_messages_received:2774

#指定各个节点的主从关系:

[root@centos8 ~]#redis-cli -h 10.0.0.38 -a 123456 --no-auth-warning  cluster replicate a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 
OK 
[root@centos8 ~]#redis-cli -h 10.0.0.48 -a 123456 --no-auth-warning cluster replicate  97c5dcc3f33c2fc75c7fdded25d05d2930a312c0 
OK 
[root@centos8 ~]#redis-cli -h 10.0.0.58 -a 123456 --no-auth-warning cluster replicate  4f146b1ac51549469036a272c60ea97f065ef832 
OK

[root@centos8 ~]#redis-cli -h 10.0.0.8  -a 123456 --no-auth-warning  info replication 
# Replication 
role:master 
connected_slaves:1 
slave0:ip=10.0.0.38,port=6379,state=online,offset=1022,lag=1 master_replid:7af8303230e2939cc22943e991f06c6409356c6e master_replid2:0000000000000000000000000000000000000000 
master_repl_offset:1022 
second_repl_offset:-1 
repl_backlog_active:1 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:1 
repl_backlog_histlen:1022

[root@centos8 ~]#redis-cli -h 10.0.0.18  -a 123456 --no-auth-warning  info replication # Replication 
role:master 
connected_slaves:1 slave0:ip=10.0.0.48,port=6379,state=online,offset=182,lag=1 master_replid:e4a8394213bd865a800c9326224584f8cb52f169 master_replid2:0000000000000000000000000000000000000000 
master_repl_offset:182 
second_repl_offset:-1 
repl_backlog_active:1 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:1 
repl_backlog_histlen:182

[root@centos8 ~]#redis-cli -h 10.0.0.28  -a 123456 --no-auth-warning  info replication # Replication 
role:master 
connected_slaves:1 slave0:ip=10.0.0.58,port=6379,state=online,offset=252,lag=0 master_replid:6d5e8f898e9023cfa0b7fe006ce42142175895e7 master_replid2:0000000000000000000000000000000000000000 
master_repl_offset:252 
second_repl_offset:-1 
repl_backlog_active:1 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:1 
repl_backlog_histlen:252

#查看主从关系及槽位信息:

[root@centos8 ~]#redis-cli -h 10.0.0.28  -a 123456 --no-auth-warning  cluster slots

1) 1) (integer) 10923   
    2) (integer) 16383   
    3) 1) "10.0.0.28"      
        2) (integer) 6379      
        3) "4f146b1ac51549469036a272c60ea97f065ef832"   
    4) 1) "10.0.0.58"       
        2) (integer) 6379      
        3) "07231a50043d010426c83f3b0788e6b92e62050f" 
2) 1) (integer) 0   
    2) (integer) 5461   
    3) 1) "10.0.0.8"      
        2) (integer) 6379       
        3) "a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab"   
    4) 1) "10.0.0.38"      
        2) (integer) 6379      
        3) "cb20d58870fe05de8462787cf9947239f4bc5629" 
3) 1) (integer) 5462   
    2) (integer) 10922   
    3) 1) "10.0.0.18"      
        2) (integer) 6379      
        3) "97c5dcc3f33c2fc75c7fdded25d05d2930a312c0"   
        4) 1) "10.0.0.48"      
            2) (integer) 6379      
            3) "779a24884dbe1ceb848a685c669ec5326e6c8944"

#验证redis cluster访问:

[root@centos8 ~]#redis-cli  -c  -h 10.0.0.8  -a 123456 --no-auth-warning set name wang 
OK 
[root@centos8 ~]#redis-cli  -c  -h 10.0.0.8  -a 123456 --no-auth-warning get name "wang"

[root@centos8 ~]#redis-cli    -h 10.0.0.8  -a 123456 --no-auth-warning get name 
(error) MOVED 5798 10.0.0.18:6379 
[root@centos8 ~]#redis-cli    -h 10.0.0.18  -a 123456 --no-auth-warning get name "wang" 
[root@centos8 ~]#redis-cli    -h 10.0.0.28  -a 123456 --no-auth-warning get name (error) MOVED 5798 10.0.0.18:6379

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值