建设网站公司 优帮云,福永外贸网站建设公司,seo网站优化推广教程,律师网站模板目录
三、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持久化流程 …目录
三、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个不同形式的持久化方式。
RDBRedis DataBase
AOFAppend 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 DB253 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 changes201 #202 # Will save the DB if both the given number of seconds and the given203 # 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 changed207 # after 300 sec (5 min) if at least 10 keys changed208 # after 60 sec if at least 10000 keys changed209 #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 save213 # points by adding a save directive with a single empty string argument214 # 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是整个内存的压缩过的SnapshotRDB的数据结构可以配置复合的快照触发条件默认是1分钟内改了1万次或5分钟内改了10次或15分钟内改了1次。
注如果想禁用RDB持久化的策略只要不设置任何save指令或者给save传入一个空字符串参数也可以
2、命令save和bgsave 214 # like in the following example:215 #216 # save
save save时只管保存其它不管全部阻塞。手动保存。不建议。
bgsaveRedis会在后台异步进行快照操作快照同时还可以响应客户端请求。
注可以通过lastsave 命令获取最后一次成功执行快照的时间 3、flushall命令 执行flushall命令也会产生dump.rdb文件但里面是空的无意义
4、rdb的备份过程
1、首先打开一个客户端(a)查询rdb文件的目录本机目录是在/myredis目录下
[rootlocalhost 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文件
[rootlocalhost myredis]# ls
dump.rdb
4、生成了文件之后复制一份文件使用不同名字
[rootlocalhost myredis]# cp dump.rdb dump.rdb1
5、使用客户端b清空数据库并关闭redis
127.0.0.1:6379 flushdb
OK
127.0.0.1:6379
[rootlocalhost bin]# systemctl stop redis
6、使用客户端a删除rdb目录下已经为空的dump.rdb文件
再将dump.rdb1文件更名为dump.rdb文件
[rootlocalhost myredis]# rm -rf dump.rdb
[rootlocalhost myredis]# mv dump.rdb1 dump.rdb
7、再次开启redis连接redis发现之前存起来的数据还在
[rootlocalhost bin]# systemctl start redis
[rootlocalhost 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) k22) k83) k104) k15) k66) k97) k118) k79) k3
10) k5
11) k4
5、stop-writes-on-bgsave-error
出现错误停止写231 # However if you have setup your proper monitoring of the Redis server232 # and persistence, you may want to disable this feature so that Redis will233 # 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 thats set to yes as its almost always a win.239 # If you want to save some CPU in the saving child set it to no but240 # 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 will249 # 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
AOFAppend Only File以日志的形式来记录每个写操作增量保存将Redis执行过的所有写指令记录下来(读操作不记录) 只许追加文件但不可以改写文件redis启动之初会读取该文件重新构建数据
换言之redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
3.2.2 AOF持久化流程
1客户端的请求写命令会被append追加到AOF缓冲区内
2AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
3AOF文件大小超过重写策略或手动重写时会对AOF文件rewrite重写压缩AOF文件容量
4Redis服务重启时会重新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 file695 # with the better durability guarantees.696 #697 # Please check http://redis.io/topics/persistence for more information.698 699 appendonly no700 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 file695 # with the better durability guarantees.696 #697 # Please check http://redis.io/topics/persistence for more information.698 699 appendonly yes700 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-rewriteyes ,不写入aof文件只写入缓存用户请求不会阻塞但是在这段时间如果宕机会丢失这段时间的缓存数据。降低数据安全性提高性能如果 no-appendfsync-on-rewriteno, 还是会把数据往磁盘里刷但是遇到重写操作可能会发生阻塞。数据安全但是性能降低
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 100771 auto-aof-rewrite-min-size 64mb
举例
例如文件达到70MB开始重写降到50MB下次什么时候开始重写100MB
系统载入时或者上次重写完毕时Redis会记录此时AOF大小设为base_size,如果Redis的AOF当前大小 base_size base_size*100% (默认)且当前大小64mb(默认)的情况下Redis会对AOF进行重写。
4、重写流程
1bgrewriteaof触发重写判断是否当前有bgsave或bgrewriteaof在运行如果有则等待该命令结束后再继续执行。
2主进程fork出子进程执行重写操作保证主进程不会阻塞。
3子进程遍历redis内存中数据到临时文件客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。
41).子进程写完新的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 INTERFACES67 # JUST COMMENT THE FOLLOWING LINE.68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~69 # bind 127.0.0.1
84 # By default protected mode is enabled. You should disable it only if85 # you are sure you want clients from other hosts to connect to Redis86 # even if no authentication is configured, nor a specific set of interfaces87 # 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
所以可以直接执行
[rootlocalhost 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 version5.0.14, bits64, commit00000000, modified0, pid7505, just started
7505:C 16 Feb 2023 21:12:25.333 # Configuration loaded
[rootlocalhost 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 version5.0.14, bits64, commit00000000, modified0, pid7510, just started
7510:C 16 Feb 2023 21:12:32.324 # Configuration loaded
[rootlocalhost 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 version5.0.14, bits64, commit00000000, modified0, pid7515, just started
7515:C 16 Feb 2023 21:12:37.860 # Configuration loaded
[rootlocalhost 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 --colorauto redis
3、查看运行状态
[rootlocalhost 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
[rootlocalhost 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
[rootlocalhost 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的MasterSlave同样可以接收其他 slaves的连接和同步请求那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。
用 slaveof ipport
中途变更转向:会清除之前的数据重新建立拷贝最新的
风险是一旦某个slave宕机后面的slave都没法备份
主机挂了从机还是从机无法写数据了 ip地址为192.168.111.127的主机
127.0.0.1:6379 info replication
# Replication
role:master #主机
connected_slaves:1 #连接的从机数
slave0:ip192.168.111.128,port6379,stateonline,offset2548,lag0 #从机信息
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:ip192.168.111.129,port6379,stateonline,offset2632,lag1
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 为至少有多少个哨兵同意迁移的数量。[rootlocalhost ~]# cd /myredis/
[rootlocalhost myredis]# ls
appendonly.aof dump6380.rdb dump6381.rdb dump.rdb
[rootlocalhost myredis]# touch sentinel.conf
[rootlocalhost myredis]# vim sentinel.conf
3、执行哨兵文件
[rootlocalhost myredis]# cd /usr/lwl/soft/redis/bin
[rootlocalhost bin]# ls
redis6379.conf redis6380.conf redis6381.conf redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server
[rootlocalhost 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 version5.0.14, bits64, commit00000000, modified0, pid7171, 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.127192.168.111.128192.168.111.129
2、配置对应redis.conf文件
① requirepass要注释掉不能设置密码
② Appendonlyno
③ daemonizeyes
④ 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 INTERFACES67 # JUST COMMENT THE FOLLOWING LINE.68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~69 # bind 127.0.0.1
84 # By default protected mode is enabled. You should disable it only if85 # you are sure you want clients from other hosts to connect to Redis86 # even if no authentication is configured, nor a specific set of interfaces87 # are explicitly listed using the bind directive.88 protected-mode yes
3、三台主机都启动redis并进行连接可以是同一个端口号
[rootlocalhost 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:ip192.168.111.128,port6379,stateonline,offset1078,lag0
slave1:ip192.168.111.129,port6379,stateonline,offset1078,lag0
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