Redis
1、RDB和AOF的优缺点
RDB优点:
-
比如: 可以在最近的24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一个 ROB文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
-
RDB可以最大化Redis的性能,父进程在保存 RDB文件时唯一要做的就是fork出一个子进程,然后 这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘工/0操作。
-
RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快
RDB缺点:
-
如果你需要尽量避免在服务器故障时丢失数据,那么RDB不适合你。虽然Redis允许你设置不同的 保存点(save point)来控制保存RDB文件的频率,但是,因为ROB文件需要保存整个数据集的状态,所以它并不是一个轻松的操作。因此你可能会至少5分钟才保存一次RDB文件。在这种情况 下,一旦发生故障停机,你就可能会丢失好几分钟的数据。 (不能保证数据一点不丢失)
-
当数据量非常大的时候,从父进程fork子进程进行保存至RDB文件时需要一点时间,可能是毫秒或 者秒,取决于磁盘IO性能
-
在数据集比较庞大时,fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端﹔如果数 据集非常巨大,并且CPU时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒或更久。
-
虽然 AOF重写也需要进行fork(),但无论AOF重写的执行间隔有多长,数据的持久性都不会有任何损失。
AOF 优点:
-
-
由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中不需要seek, 即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,可以通过 redis-check-aof 工具来解决数据一致性的问题
-
Redis可以在 AOF文件体积变得过大时,自动地在后台对AOF进行重写:重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停 机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新 AOF文件,并开始对新AOF文件进行追加操作。
-
AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此 AOF文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松。导出(export)AOF文件 也非常简单:举个例子,如果你不小心执行了FLUSHALL.命令,但只要AOF文件未被重写,那么只 要停止服务器,移除 AOF文件末尾的FLUSHAL命令,并重启Redis ,就可以将数据集恢复到 FLUSHALL执行之前的状态。
AOF缺点:
-
-
AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
-
根据fsync策略不同,AOF速度可能会慢于RDB
-
bug 出现的可能性更多
2、master和slave同步过程
环境:
两台机器
10.0.0.8 master
10.0.0.18 slave
[root@centos8 ~]#yum -y install redis
[root@centos8 ~]#systemctl start redis
[root@centos18 ~]#systemctl start redis
[root@centos8 ~]#vim /etc/redis.conf
69 bind 0.0.0.0
88 protected-mode yes
308 replica-serve-stale-data yes
127.0.0.1:6379> CONFIG SET requirepass 123456
OK
#重启服务
[root@centos8 ~]#systemctl restart redis
#从节点进行设置
[root@centos18 ~]#redis-cli -h 10.0.0.8 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.8:6379>
#搭建主从节点
#登录本机,输入主服务器的IP和端口号
#在slave上设置master的IP和端口,4.0版之前的指令为slaveof
127.0.0.1:6379> REPLICAOF 10.0.0.8 6379 #仍可使用SLAVEOF MasterIP Port
OK
#输入主服务器的密码进行同步,进行全量复制
#在slave上设置master的密码,才可以同步
127.0.0.1:6379> CONFIG SET masterauth 123456
OK
127.0.0.1:6379> INFO replication
# Replication #角色变为slave
role:slave
master_host:10.0.0.8 #指向master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b69908f23236fb20b810d198f7f4539f795e0ee5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
[root@centos18 ~]#vim /etc/redis.conf
.......
# replicaof <masterip> <masterport>
replicaof 10.0.0.8 6379 #指定master的IP和端口号
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
# masterauth <master-password>
masterauth 123456 #如果密码需要设置
.......
注:主从搭建完毕,搭建成功,从节点只能读不能写
3、哨兵的使用和实现机制
#前提是已经实现了一主两从的搭建
环境
master 10.0.0.8
slave1 10.0.0.18
slave2 10.0.0.28
#搭建一主两从
#三台机器安装redis服务并启动
[root@centos8 ~]#yum -y install redis
[root@centos8 ~]#systemctl start redis
[root@centos18 ~]#yum -y install redis
[root@centos18 ~]#systemctl start redis
[root@centos28 ~]#yum -y install redis
[root@centos28 ~]#systemctl start redis
#主节点进行配置
[root@centos8 ~]#vim /etc/redis.conf
69 bind 0.0.0.0
88 protected-mode yes
308 replica-serve-stale-data yes
324 replica-read-only yes
355 repl-diskless-sync no
367 repl-diskless-sync-delay 5
#设置连接密码
[root@centos8 ~]#redis-cli
127.0.0.1:6379> CONFIG SET requirepass 123456
OK
#重启服务
[root@centos8 ~]#systemctl restart redis
#从节点进行设置
#查看是否能够远程连接10.0.0.8
[root@centos18 ~]#redis-cli -h 10.0.0.8 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.8:6379>
#搭建主从节点
#登录本机,输入主服务器的IP和端口号
#在slave上设置master的IP和端口,4.0版之前的指令为slaveof
127.0.0.1:6379> REPLICAOF 10.0.0.8 6379 #仍可使用SLAVEOF MasterIP Port
OK
#输入主服务器的密码进行同步,进行全量复制
#在slave上设置master的密码,才可以同步
127.0.0.1:6379> CONFIG SET masterauth 123456
OK
127.0.0.1:6379> INFO replication
# Replication #角色变为slave
role:slave
master_host:10.0.0.8 #指向master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b69908f23236fb20b810d198f7f4539f795e0ee5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
#在所有slave节点保存配置到redis.conf
[root@centos18 ~]#vim /etc/redis.conf
.......
# replicaof <masterip> <masterport>
replicaof 10.0.0.8 6379 #指定master的IP和端口号
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
# masterauth <master-password>
masterauth 123456 #如果密码需要设置
.......
#查看是否能够远程连接10.0.0.8
[root@centos28 ~]#redis-cli -h 10.0.0.8 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.8:6379>
#搭建主从节点
#登录本机,输入主服务器的IP和端口号
#在slave上设置master的IP和端口,4.0版之前的指令为slaveof
127.0.0.1:6379> REPLICAOF 10.0.0.8 6379 #仍可使用SLAVEOF MasterIP Port
OK
#输入主服务器的密码进行同步,进行全量复制
#在slave上设置master的密码,才可以同步
127.0.0.1:6379> CONFIG SET masterauth 123456
OK
127.0.0.1:6379> INFO replication
# Replication #角色变为slave
role:slave
master_host:10.0.0.8 #指向master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b69908f23236fb20b810d198f7f4539f795e0ee5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
#在所有slave节点保存配置到redis.conf
[root@centos28 ~]#vim /etc/redis.conf
.......
# replicaof <masterip> <masterport>
replicaof 10.0.0.8 6379 #指定master的IP和端口号
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
# masterauth <master-password>
masterauth 123456 #如果密码需要设置
.......
#所有主从节点的redis.conf中关键配置
#三台机器全部配置成以下三步
[root@centos8 ~]#vim /etc/redis.conf
bind 0.0.0.0
masterauth "123456"
requirepass "123456"
[root@centos8 ~]#systemctl restart redis
[root@centos18 ~]#vim /etc/redis.conf
bind 0.0.0.0
masterauth "123456"
requirepass "123456"
[root@centos18 ~]#systemctl restart redis
[root@centos28 ~]#vim /etc/redis.conf
bind 0.0.0.0
masterauth "123456"