Redis第三讲

news2024/9/29 23:27:22

目录

三、Redis03

3.1 Redis持久化之RDB

3.1.1 什么是RDB

3.1.2 备份是如何执行的

3.1.3 Fork

3.1.4 RDB持久化流程

3.1.5 dump.rdb文件

3.1.6 配置rdb文件生成位置

3.1.7 如何触发RDB快照以及保持策略

3.2 Redis持久化之AOF

3.2.1 什么是AOF

3.2.2 AOF持久化流程

3.2.3 AOF默认不开启

3.2.4 AOF同步频率设置

3.2.5 AOF和RDB优先级

3.2.6 AOF启动/修复/恢复

3.2.7 Rewrite压缩

3.2.8 优势

3.2.9 劣势

3.2.10 AOF对比RDB

3.3 主从复制

3.3.1 什么是主从复制

3.3.2 主从复制的作用

3.3.3 主从复制(一台主机)

3.3.4 主从复制(三台主机)


三、Redis03

3.1 Redis持久化之RDB

Redis 提供了2个不同形式的持久化方式。

RDB(Redis DataBase)

AOF(Append Of File)

3.1.1 什么是RDB

指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里

3.1.2 备份是如何执行的

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件

整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

RDB的缺点是最后一次持久化后的数据可能丢失

3.1.3 Fork

Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术

一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

3.1.4 RDB持久化流程

 

3.1.5 dump.rdb文件

 在redis.conf中配置文件名称,默认为dump.rdb
 配置文件在软件安装目录bin下
 
 252 # The filename where to dump the DB
 253 dbfilename dump.rdb

3.1.6 配置rdb文件生成位置

rdb文件的保存路径,也可以修改。

默认为Redis启动时命令行所在的目录下,也就是软件安装的bin目录下

 #初始的默认安装目录
 262 # Note that you must specify a directory here, not a file name.
 263 dir ./
#修改后默认安装目录
# Note that you must specify a directory here, not a file name.
dir /myredis/

3.1.7 如何触发RDB快照以及保持策略

1、配置文件中默认的快照配置时间间隔

 198 # Save the DB on disk:
 199 #
 200 #   save <seconds> <changes>
 201 #
 202 #   Will save the DB if both the given number of seconds and the given
 203 #   number of write operations against the DB occurred.
 204 #
 205 #   In the example below the behaviour will be to save:
 206 #   after 900 sec (15 min) if at least 1 key changed
 207 #   after 300 sec (5 min) if at least 10 keys changed
 208 #   after 60 sec if at least 10000 keys changed
 209 #
 210 #   Note: you can disable saving completely by commenting out all "save" lines.
 211 #
 212 #   It is also possible to remove all the previously configured save
 213 #   points by adding a save directive with a single empty string argument
 214 #   like in the following example:
 215 #
 216 #   save ""
 217 
 218 save 900 1   #900秒中,至少有一个值发生更改,会将值存入快照
 219 save 300 10  #300秒中,至少有十个值发生更改,会将值存入快照
 220 save 60 10000
 
 格式:save   秒钟   写操作次数
 RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件,
 默认是1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次。

注:如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串参数也可以

2、命令save和bgsave

 214 #   like in the following example:
 215 #
 216 #   save ""

save :save时只管保存,其它不管,全部阻塞。手动保存。不建议。

bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。

注:可以通过lastsave 命令获取最后一次成功执行快照的时间

 

3、flushall命令

 

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

4、rdb的备份过程

1、首先打开一个客户端(a),查询rdb文件的目录,本机目录是在/myredis目录下
[root@localhost myredis]# ls
​
2、再打开另外一个客户端(b)执行一个多次写入的命令
 mset  k1 v1 k2 v2 k3 v3 k4 v34 k5 v5 k6 v6 k7 v7 k8 v8 k9 v9 k10 v10 k11 v11
​
3、在save设置的时间内,再次查看rdb文件目录,看是否生成了rdb文件,
[root@localhost myredis]# ls
dump.rdb
​
4、生成了文件之后,复制一份文件(使用不同名字)
[root@localhost myredis]# cp dump.rdb dump.rdb1
​
5、使用客户端b,清空数据库,并关闭redis
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> 
[root@localhost bin]# systemctl stop redis
​
​
6、使用客户端a,删除rdb目录下已经为空的dump.rdb文件
再将dump.rdb1文件更名为dump.rdb文件
[root@localhost myredis]# rm -rf dump.rdb
[root@localhost myredis]# mv dump.rdb1 dump.rdb
​
7、再次开启redis,连接redis,发现之前存起来的数据还在
[root@localhost bin]# systemctl start redis
[root@localhost bin]# ./redis-cli -a lwl
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys *
 1) "k2"
 2) "k8"
 3) "k10"
 4) "k1"
 5) "k6"
 6) "k9"
 7) "k11"
 8) "k7"
 9) "k3"
10) "k5"
11) "k4"

5、stop-writes-on-bgsave-error

出现错误停止写
 231 # However if you have setup your proper monitoring of the Redis server
 232 # and persistence, you may want to disable this feature so that Redis will
 233 # continue to work as usual even if there are problems with disk,
 234 # permissions, and so forth.
 235 stop-writes-on-bgsave-error yes
​
当Redis无法写入磁盘的话(磁盘已满),直接关掉Redis的写操作。推荐yes.

6、rdbcompression 压缩文件

如果多个命令可以压缩的话,在快照中,会进行压缩
 237 # Compress string objects using LZF when dump .rdb databases?
 238 # For default that's set to 'yes' as it's almost always a win.
 239 # If you want to save some CPU in the saving child set it to 'no' but
 240 # the dataset will likely be bigger if you have compressible values or keys.
 241 rdbcompression yes
​
​
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会进行压缩。
如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。推荐yes.

7、 rdbchecksum 检查数据的完整性

如果是损坏的数据就不再添加到rdb文件中
 248 # RDB files created with checksum disabled have a checksum of zero that will
 249 # tell the loading code to skip the check.
 250 rdbchecksum yes
​
在存储快照后,还可以让redis来进行数据校验,如果数据已经损坏就不需要再进行持久化的操作,这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。推荐yes.

8、优势

1、适合大规模的数据恢复
2、对数据完整性和一致性要求不高更适合使用(可以丢失部分数据)
3、节省磁盘空间
4、恢复速度快

 

9、劣势

 Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
  在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

3.2 Redis持久化之AOF

3.2.1 什么是AOF

AOF(Append Only File)以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,

换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

3.2.2 AOF持久化流程

(1)客户端的请求写命令会被append追加到AOF缓冲区内;
(2)AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;
(3)AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;
(4)Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

 

3.2.3 AOF默认不开启

修改之前
因为AOF的工作机制,决定了是比较消耗性能的,所以默认不开启
 693 # AOF and RDB persistence can be enabled at the same time without problems.
 694 # If the AOF is enabled on startup Redis will load the AOF, that is the file
 695 # with the better durability guarantees.
 696 #
 697 # Please check http://redis.io/topics/persistence for more information.
 698 
 699 appendonly no
 700 
 701 # The name of the append only file (default: "appendonly.aof")
 702 
 703 appendfilename "appendonly.aof"
​
可以在redis.conf中配置文件名称,默认为 appendonly.aof
AOF文件的保存路径,同RDB的路径一致。
修改后
 693 # AOF and RDB persistence can be enabled at the same time without problems.
 694 # If the AOF is enabled on startup Redis will load the AOF, that is the file
 695 # with the better durability guarantees.
 696 #
 697 # Please check http://redis.io/topics/persistence for more information.
 698 
 699 appendonly yes
 700 
 701 # The name of the append only file (default: "appendonly.aof")
 702 
 703 appendfilename "appendonly.aof"
 因为aof文件默认路径是和rdb文件一致的,这里即使不修改文件,文件也会存到/myredis下面

3.2.4 AOF同步频率设置

appendfsync always    始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec  每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
appendfsync no        redis不主动进行同步,把同步时机交给操作系统。

3.2.5 AOF和RDB优先级

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

3.2.6 AOF启动/修复/恢复

AOF的备份机制和性能虽然和RDB不同, 但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载。
​
正常恢复
  ①修改默认的appendonly no,改为yes
  ②将有数据的aof文件复制一份保存到对应目录
  ③恢复:重启redis然后重新加载
  
异常恢复
   ①修改默认的appendonly no,改为yes
   ②如遇到AOF文件损坏,通过命令
   安装redis的目录/redis-check-aof  --fix  文件的位置/appendonly.aof
   
   对于本机,命令如下:/usr/lwl/soft/redis/bin/redis-check-aof --fix /myredis/appendonly.aof
   ③备份被写坏的AOF文件
   ④恢复:重启redis,然后重新加载
   
   
异常恢复案例:
    修改默认的appendonly no,改为yes
    执行两条写命令,等待写入aof中之后,手动破坏appendonly.aof文件,可以随便加上两行
    关闭redis
    执行修复命令./redis-check-aof --fix /myredis/appendonly.aof
    开启redis,查看数据

3.2.7 Rewrite压缩

1、什么是Rewrite

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof

2、如何实现重写

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。

对于 no-appendfsync-on-rewrite:
​
    如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)
    如果 no-appendfsync-on-rewrite=no,  还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)

3、重写的触发机制

重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
​
auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发)
auto-aof-rewrite-min-size:设置重写的基准值,最小文件64MB。达到这个值开始重写。
​
在配置文件中也可以进行配置:第770和771行
 770 auto-aof-rewrite-percentage 100
 771 auto-aof-rewrite-min-size 64mb

举例:

例如:文件达到70MB开始重写,降到50MB,下次什么时候开始重写?100MB
​
    系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size,如果Redis的AOF当前大小>= base_size + base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。 

4、重写流程

(1)bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。

(2)主进程fork出子进程执行重写操作,保证主进程不会阻塞。

(3)子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。

(4)1).子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。2).主进程把aof_rewrite_buf中的数据写入到新的AOF文件。

(5)使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

 

3.2.8 优势

备份机制更稳健,丢失数据概率更低。

可读的日志文本,通过操作AOF稳健,可以处理误操作。

 

3.2.9 劣势

  • 比起RDB占用更多的磁盘空间。

  • 恢复备份速度要慢。

  • 每次读写都同步的话,有一定的性能压力。

  • 存在个别Bug,造成恢复不能。

3.2.10 AOF对比RDB

1、AOF和RDB用哪个好?

官方推荐两个都启用。
如果对数据不敏感,可以选单独用RDB。
不建议单独用 AOF,因为可能会出现Bug。
如果只是做纯内存缓存,可以都不用。

2、官方建议

•   RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
•   AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾. 
•  Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大
 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
同时开启两种持久化方式
•   在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
•   RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢? 
•   建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份), 快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。
•   性能建议
推荐使用:
因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。
 
如果使用AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。
代价,一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
只要硬盘许可,应该尽量减少AOF  rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。
默认超过原大小100%大小时重写可以改到适当的数值。

3.3 主从复制

3.3.1 什么是主从复制

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

3.3.2 主从复制的作用

读写分离,性能扩展(主机主要负责写操作,从机负责读操作)

容灾快速恢复(主机坏掉,从机可以变成主机)

 

3.3.3 主从复制(一台主机)

1、在一台电脑上配置主从复制

配置第一个文件(主机6379的配置文件)
注意:不能设置密码
① Appendonly 改为no
② 开启daemonize       yes
③ Pid文件名字pidfile  /var/run/redis_6379.pid
④指定端口port
⑤Log文件名字
⑥dump.rdb名字dbfilename
​
注如果要在多台电脑上配置主从复制,那么还有两个配置一定要配置
protected-mode  改为no
bind            0.0.0.0
​
​
修改前
  66 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
  67 # JUST COMMENT THE FOLLOWING LINE.
  68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  69 # bind 127.0.0.1
​
  84 # By default protected mode is enabled. You should disable it only if
  85 # you are sure you want clients from other hosts to connect to Redis
  86 # even if no authentication is configured, nor a specific set of interfaces
  87 # are explicitly listed using the "bind" directive.
  88 protected-mode yes
配置从机6380的配置文件
include      /usr/lwl/soft/redis/bin/redis6379.conf  #提取的公共文件
pidfile      /var/run/redis_6380.pid  #设置pidfile
port         6380          #设置端口号
dbfilename   dump6380.rdb    #设置dbfilename
配置从机6381的配置文件
include      /usr/lwl/soft/redis/bin/redis6379.conf  #提取的公共文件
pidfile      /var/run/redis_6381.pid  #设置pidfile
port         6381        #设置端口号
dbfilename   dump6381.rdb    #设置dbfilename

2、启动三台redis服务器

开启6379:/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis6379.conf
开启6380:/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis6380.conf 
开启6381:/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis6381.conf

因为当前处于/usr/lwl/soft/redis/bin

所以可以直接执行

[root@localhost bin]# ./redis-server ./redis6379.conf
7505:C 16 Feb 2023 21:12:25.333 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7505:C 16 Feb 2023 21:12:25.333 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7505, just started
7505:C 16 Feb 2023 21:12:25.333 # Configuration loaded
[root@localhost bin]# ./redis-server ./redis6380.conf
7510:C 16 Feb 2023 21:12:32.324 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7510:C 16 Feb 2023 21:12:32.324 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7510, just started
7510:C 16 Feb 2023 21:12:32.324 # Configuration loaded
[root@localhost bin]# ./redis-server ./redis6381.conf
7515:C 16 Feb 2023 21:12:37.860 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7515:C 16 Feb 2023 21:12:37.860 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7515, just started
7515:C 16 Feb 2023 21:12:37.860 # Configuration loaded
[root@localhost bin]# ps -ef|grep redis
root       7506      1  0 21:12 ?        00:00:00 ./redis-server *:6379
root       7511      1  0 21:12 ?        00:00:00 ./redis-server *:6380
root       7516      1  0 21:12 ?        00:00:00 ./redis-server *:6381
root       7522   7046  0 21:12 pts/0    00:00:00 grep --color=auto redis

3、查看运行状态

[root@localhost bin]# ./redis-cli -p 6379  #连接端口号为6379的redis
127.0.0.1:6379> info replication  #查看运行状态
# Replication
role:master          #代表主机
connected_slaves:0   #连接的从机数
master_replid:714f8d4a5145aa3363c7abde64c643a47863847a
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@localhost bin]# ./redis-cli -p 6380 #连接端口号为6381的redis
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:f7076668ac261799ef9c836b752c964d94c5a15a
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@localhost bin]# ./redis-cli -p 6381  #连接端口号为6381的redis
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_replid:86ecc02f0bcff05c1cd0233ff369088ea75751fe
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

目前三台机器都是主机

4、配置从机

配置从机需要在要当从机的连接时中执行命令
slaveof  <ip>  <port>  成为某个实例的从服务器
​
比如:6380要作为6379的从机
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave      #从机
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4170da4a1e6e9c098a641d94689da65e7fa63fd6
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
​
将6381设置为从机也是相同的操作
2.在主机上写,在从机上可以读取数据
127.0.0.1:6379> set name lwl
OK
127.0.0.1:6380> get name
"lwl"
127.0.0.1:6381> get name
"lwl"
​
3.主机挂掉(shutdown),重启就行,一切如初
主从关系不变
​
4.从机如果重启需要重新配置为从机:slaveof 127.0.0.1 6379

5、复制原理

•  Slave启动成功连接到master后会发送一个sync命令
•  Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
•  全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
•   增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
•  但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

 

6、薪火相传 从这里开始就是使用的三台主机

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。

用 slaveof  <ip><port>
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave都没法备份
主机挂了,从机还是从机,无法写数据了

 

ip地址为192.168.111.127的主机:
127.0.0.1:6379> info replication
# Replication
role:master                #主机
connected_slaves:1         #连接的从机数
slave0:ip=192.168.111.128,port=6379,state=online,offset=2548,lag=0 #从机信息
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2548
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2548
​
ip地址为192.168.111.128的主机:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.111.127       #主机的ip地址
master_port:6379
master_link_status:up              #主机状态,up代表正在运行
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:2632
slave_priority:100
slave_read_only:1
connected_slaves:1                  #从机连接数
slave0:ip=192.168.111.129,port=6379,state=online,offset=2632,lag=1
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2632
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2632
​
ip地址为192.168.111.129的主机:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.111.128         #主机ip地址
master_port:6379
master_link_status:up               #主机连接状态
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:2506
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2506
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2493
repl_backlog_histlen:14

7、反客为主(手动版选择主机)

当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
用 slaveof  no one  将从机变为主机。

 

8、哨兵模式(自动版选择主机)

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

 

配置哨兵文件

1.创建文件
    在/usr/lwl/soft/redis/bin/myredis目录下创建这个文件
​
2、配置文件内容
    sentinel monitor mymaster 127.0.0.1 6379 1
    其中mymaster为监控对象起的服务器名称,
    127.0.0.1 代表监视的ip地址
    1 为至少有多少个哨兵同意迁移的数量。
    
[root@localhost ~]# cd /myredis/
[root@localhost myredis]# ls
appendonly.aof  dump6380.rdb  dump6381.rdb  dump.rdb
[root@localhost myredis]# touch sentinel.conf
[root@localhost myredis]# vim sentinel.conf
​
3、执行哨兵文件
[root@localhost myredis]# cd /usr/lwl/soft/redis/bin
[root@localhost bin]# ls
redis6379.conf  redis6380.conf  redis6381.conf  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server
[root@localhost bin]# ./redis-sentinel /myredis/sentinel.conf 
7171:X 17 Feb 2023 16:17:04.583 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7171:X 17 Feb 2023 16:17:04.583 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7171, just started
7171:X 17 Feb 2023 16:17:04.583 # Configuration loaded
7171:X 17 Feb 2023 16:17:04.584 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.14 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 7171
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               
​
7171:X 17 Feb 2023 16:17:04.585 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7171:X 17 Feb 2023 16:17:04.586 # Sentinel ID is 0b54be235fccf50143826a827059ff0fd775db96
7171:X 17 Feb 2023 16:17:04.586 # +monitor master mymaster 127.0.0.1 6379 quorum 1
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
​
让主机127shutdown之后
稍等一会
7171:X 17 Feb 2023 16:17:04.586 # +monitor master mymaster 127.0.0.1 6379 quorum 1
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +sdown master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
7171:X 17 Feb 2023 16:18:41.204 # +new-epoch 1
7171:X 17 Feb 2023 16:18:41.204 # +try-failover master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +vote-for-leader 0b54be235fccf50143826a827059ff0fd775db96 1
7171:X 17 Feb 2023 16:18:41.204 # +elected-leader master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +failover-state-select-slave master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.308 # +selected-slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.308 * +failover-state-send-slaveof-noone slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.408 * +failover-state-wait-promotion slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:42.086 # +promoted-slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:42.086 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:42.152 * +slave-reconf-sent slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.122 * +slave-reconf-inprog slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.122 * +slave-reconf-done slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.176 # +failover-end master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.176 # +switch-master mymaster 127.0.0.1 6379 192.168.111.129 6379
7171:X 17 Feb 2023 16:18:43.177 * +slave slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 192.168.111.129 6379
7171:X 17 Feb 2023 16:18:43.177 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 192.168.111.129 6379
7171:X 17 Feb 2023 16:19:13.239 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 192.168.111.129 6379
最后选举出来129为主机

可以让主机6379 shutdown,然后观察哨兵选举

当主机挂掉,从机选举中产生新的主机
(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)
哪个从机会被选举为主机呢?根据优先级别:replica-priority 
原主机重启后会变为从机。
​
选举主机时,考虑的因素有以下几个
优先级在redis.conf中默认:replica-priority  100,值越小优先级越高
偏移量是指获得原主机数据最全的
每个redis实例启动后都会随机生成一个40位的runid

 

3.3.4 主从复制(三台主机)

先使用VMware进行克隆三台虚拟机

ip地址
  192.168.111.127
  192.168.111.128
  192.168.111.129
​
2、配置对应redis.conf文件
① requirepass要注释掉,不能设置密码
② Appendonly=no
③ daemonize=yes
④ pidfile  /var/run/redis_6379.pid  #指定Pid文件名字
⑤ 指定端口port
⑥ Log文件名字
⑦ dump.rdb名字dbfilename
​
注如果要在多台电脑上配置主从复制,那么还有两个配置一定要配置
⑧ protected-mode  no
⑨ bind 0.0.0.0
​
​
修改前
  66 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
  67 # JUST COMMENT THE FOLLOWING LINE.
  68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  69 # bind 127.0.0.1
​
  84 # By default protected mode is enabled. You should disable it only if
  85 # you are sure you want clients from other hosts to connect to Redis
  86 # even if no authentication is configured, nor a specific set of interfaces
  87 # are explicitly listed using the "bind" directive.
  88 protected-mode yes
​
3、三台主机都启动redis,并进行连接,可以是同一个端口号
[root@localhost bin]# ./redis-cli 
127.0.0.1:6379> ping
PONG
​
4、让128和129都成为127的从机
127.0.0.1:6379> slaveof 192.168.111.127 6379
OK
​
5、查看127的运行状态信息
127.0.0.1:6379> info replication
# Replication
role:master                     #主机
connected_slaves:2              #两台从机
slave0:ip=192.168.111.128,port=6379,state=online,offset=1078,lag=0
slave1:ip=192.168.111.129,port=6379,state=online,offset=1078,lag=0
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1078
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1078

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java反序列化漏洞——CommonsCollections3链分析

一、原理CC1链中我们是通过调用Runtime.getRuntime.exec()来执行系统命令&#xff0c;而另一个方向我们可以通过TemplatesImpl加载字节码的类&#xff0c;通过调⽤其newTransformer() 方法&#xff0c;即可执⾏这段字节码的类构造器&#xff0c;我们在类构造器中加入恶意代码&a…

【Seata】_01 分布式事务基础知识和常见的解决方案

本地事务 单一的数据库事务&#xff0c;ACID由数据库直接提供 分布式事务 一个服务调用操作两个数据库&#xff1b; 多个服务操作同一个数据库&#xff1b; 多个服务操作多个数据库&#xff1b; 分布式事务无法由数据库保证 Seata 分布式事务解决方案 Seata提供AT/TCC/SAG…

HDMI Audio InfoFrame

Audio InfoFrame 是HDMI Source向Sink传递当前音频流特性的一种InfoFrame。要求是至少每两帧图像就要传输一次Audio InfoFrame。Audio InfoFrame的传输可以是Data Island周期的任何时刻。 HDMI在音频的传输上&#xff0c;packet包的标准是按照IEC60958或者IEC61938来的。 Aud…

使用契约测试得不偿失?试试契约先行开发

契约维护的难题 如今微服务凭借其灵活、易开发、易扩展等优势深入人心&#xff0c;不同服务之间的集成和交互日渐繁多且复杂。这些服务之间交互的方式是多样的&#xff0c;常见的有 HTTP 请求和消息队列。在它们交互的过程中&#xff0c;会有服务的版本演进&#xff0c;交互信…

算法的时间复杂度与空间复杂度

…………………………………………………………………………………………………………………… ………………………………………………………………………加油…………………………………………………………………………. 如何衡量一个算法的好与坏呢&#xff1f;这是本篇的重点…

财报解读:硬件支撑思科增长,云平台何时能突围?

北京时间2023年2月16日&#xff0c;美国网络设备老牌巨头思科公布了其2023财年第二季度财报&#xff0c;业绩超预期。 据思科财报显示&#xff0c;其2023财年Q2实现营收136亿美元&#xff0c;分析师预期为134.3亿美元&#xff1b;同时给出大超预期的业绩指引&#xff0c;思科预…

jetson nano(ubuntu)编译Qt creator

文章目录一.apt安装二.源码编译安装1.Qt Creator源码下载2.相关软件安装cmakeninjallvm/clang3.Qt Creator源码编译一.apt安装 sudo apt-get install qtcreatorapt安装的版本只有4的&#xff0c;版本较低&#xff0c;只有qmake进行项目配置&#xff0c;6版本以上可以使用cmake…

7大体系防作弊,牛客放大招了!严肃笔试客户端上线!

如果问起学生对在线笔试的印象&#xff0c;“不公平”和“不服气”占了半壁江山。学生认为很多企业的在线笔试系统并不完善。原因一&#xff0c;不能有效地规避部分学生的作弊行为&#xff1b;原因二&#xff0c;在线考试系统不稳定&#xff0c;bug频出&#xff0c;导致笔试发挥…

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口&#xff0c;报错&#xff1a;certificate has expired 因为在linux centos环境与window环境有所不同&#xff0c;在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…

RadZen运行和部署,生成业务web应用程序

RadZen运行和部署,生成业务web应用程序 快速简单地生成业务web应用程序&#xff0c;可视化地构建和启动web程序&#xff0c;而我们为您创建新代码。 从信息开始 连接到数据库。Radzen推断您的信息并生成一个功能完备的web应用程序。支持MSSQL REST服务。 微调 添加页面或编辑生…

人工智能、机器学习和深度学习有哪些区别?

人工智能在如今越来越火&#xff0c;诸多词汇时刻萦绕在我们耳边&#xff1a;人工智能、机器学习、深度学习等。不少人对这些高频词汇的含义及其背后的关系总是似懂非懂、一知半解。为了帮助大家更好地理解人工智能&#xff0c;这篇文章用最简单的语言解释了这些词汇的含义&…

tomcat-container 源码分析

说明 本文基于 tomcat 8.5.x 编写。author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 tomcat 的 container 容器 tomcat 由 connector 和 container 两部分组成&#xff0c;connector 接收到请求后&#xff0c;先将请求包装为 request&#xff0c;然后…

六、H5新特性

文章目录一、H5的兼容二、H5新增特性2.1 语义化标签2.2 增强表单2.3 音频、视频一、H5的兼容 支持 HTML5的浏览器包括Firefox(火狐浏览器)&#xff0c;IE9及其更高版本&#xff0c;Chrome(谷歌浏览器)&#xff0c;Safari,Opera等&#xff0c;国内的遨游浏览器&#xff0c;以及…

【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(上)

目录 一、Istio 介绍 1.1 什么是 service mesh 1.2 什么是 Istio 1.2.1 服务注册和发现 1.2.2 服务度量 1.2.3 灰度发布 1.3 Istio 核心特性 1.3.1 断路器 1.3.2 超时 1.3.3 重试 1.3.4 多路由规则 二、架构和原理 2.1 Istio 架构 2.1.1 数据平面由一组以 Sideca…

【Spring】手动实现简易AOP和IOC

前言 XML&#xff1a;通过Dom4j对XML进行解析和验证。 IOC&#xff1a;通过获取要创建对象的Class类型、构造函数后&#xff0c;通过反射来实现。 AOP&#xff1a;通过使用JDK动态代理和Cglib动态代理实现。 一、解析XML 1.1、解析bean标签 /*** 解析bean标签* param xmlBean…

前端面试当中CDN会问啥------CDN详细教程来啦

⼀、CDN 1. CDN的概念 CDN&#xff08;Content Delivery Network&#xff0c;内容分发⽹络&#xff09;是指⼀种通过互联⽹互相连接的电脑⽹络系统&#xff0c;利 ⽤最靠近每位⽤户的服务器&#xff0c;更快、更可靠地将⾳乐、图⽚、视频、应⽤程序及其他⽂件发送给⽤户&…

代谢组学资讯,全球爆火的ChatGPT,是如何看待三阴性乳腺癌的?

领导说 今天下午6点前必须发出一篇推文 我表面毫无波澜实则内心风起云涌 那么问题来了 我如何才能在下班前发送推文准时下班呢 我要怎么写才能获得趣粉们的认可呢 全球爆火的ChatGPT&#xff0c;让我的格局一下打开~&#xff0c;它能不能成为我的“得力助手”&#xff1f;…

跳空缺口指标公式,主图显示向上向下跳空缺口

跳空缺口包含两种类型&#xff0c;向上跳空缺口和向下跳空缺口。向上跳空缺口是指当天最低价高于昨天的最高价&#xff0c;K线图出现缺口。向下跳空缺口是指当天最高价低于昨天的最低价&#xff0c;K线图出现缺口。 注意一下&#xff0c;上面的缺口定义与百科上有区别&#xf…

授权验证方式有很多、但AOP最为优雅。

前言 有时候项目中需要对接口进行校验&#xff0c;增加鉴权&#xff0c;确保 API 不被恶意调用。 项目中都是这样 这样&#xff0c;部分需要查询一些信息&#xff0c;下文需要使用 这样的代码很多&#xff0c;重复率太高。看着我蛋疼&#xff0c;对此优化一下。 方案 1 …

剑指offer 7 数组中和为0的三个数

此问题属于nsum问题&#xff0c;题目链接&#xff1a;力扣 要求在数组中找到不重复的三元组&#xff0c;三个数加起来为0&#xff0c;且每个下标只能用一次。而且需要返回所有这样的不重复数组。 1. 排序 双指针 1. 「不重复」的本质是什么&#xff1f;我们保持三重循环的大…