目录
三、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