NoSQL03 - 主从复制、RDB/AOF持久化 数据类型
一、Redis 主从复制
1.1 主从复制概述
1.1.1 主从复制结构模式
• 结构模式
– 一主一从
– 一主多从
– 主从从
1.1.2 主从复制工作原理
工作原理
–Slave向master发送sync命令
–Master启动后台存盘进程,同时收集所有修改数据命令
–Master执行完后台存盘进程后,传送整个数据文件到slave
–Slave接收数据文件后,将这个文件存盘并加载到内存中完成首次完全同步
–后续有新数据产生时,master继续将新的所有收集到的修改命令依次传给Slave,完成同步。
1.1.3 主从复制缺点
• 缺点
– 网络繁忙,会产生数据同步延时问题
– 系统繁忙,会产生数据同步延时问题
1.2 配置主从复制
1.2.1 拓扑结构
- 主服务器数据自动同步到从服务器
1.2.2 配置主从复制(一主一从、一主多从、主从从)
1.一主一从:(把52配置为51的从库,51主库的数据会立马给52从库)
默认服务启动后,角色默认为主库;
52]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys *
192.168.4.52:6352> slaveof 192.168.4.51 6351
OK
192.168.4.52:6352> info replication
# Replication
role:slave
192.168.4.52:6352> keys *
2.一主多从:(在一主一从的基础上,把53也配置为51主库的从库)
192.168.4.53:6353> slaveof 192.168.4.51 6351 //指定51主库的ip和端口
OK
192.168.4.53:6353> info replication
# Replication
role:slave
3. 主从从:(把53切换成主库,又成为从库的从库)
192.168.4.53:6353> slaveof no one //手动将从库切换成主库
OK
192.168.4.53:6353> info replication
# Replication
role:master
192.168.4.53:6353> flushall //不是必须清空数据
192.168.4.52:6353> slaveof 192.168.4.52 6352 //指定52从库的ip和端口,让53成为52的从库
OK
192.168.4.52:6352> info replication
# Replication
role:slave
- 配置命令行配置:马上生效 不需要重启服务(一旦重启服务失效)
53 ~]# /etc/init.d/redis_6379 stop
53 ~]# /etc/init.d/redis_6379 start
- 修改配置文件,永久有效,但需要重起服务才能生效
53 ~]# vim /etc/redis/6379.conf //修改配置文件
282 slaveof 192.168.4.52 6352 //在配置文件中指定上游服务器的IP和端口,成为上游服务器的从库
53 ~]# /etc/init.d/redis_6379 start //启动服务,该配置就永久生效
1.3 配置带验证的主从复制
主库设置连接密码时,从库的配置:
51 ~]# vim /etc/redis/6379.conf
501 requirepass 123456 //启动密码功能
51 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
52 ~]# vim /etc/redis/6379.conf
282 slaveof 192.168.4.51 6351 //在配置文件中指定上游服务器的IP和端口,成为上游服务器的从库
289 masterauth 123456 //指定主库51的密码
1.4 主从复制的哨兵模式
Sentinel(哨兵)是Redis 的高可用性解决方案
由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
redis-sentinel命令是redis自带的哨兵程序
例如:
在Server1 掉线后:
升级Server2 为新的主服务器:
52 ~]# redis-sentinel //命令,启动服务后自带哨兵程序
52 ~]# vim /etc/sentinel.conf //手动创建配置文件并添加内容,必须是这个格式
sentinel monitor host51 192.168.4.51 6351 1 //host51自定义 1表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的)
sentinel auth-pass host51 123456 //host51必须与上条定义的一致
:wq
52 ~]# /etc/init.d/redis_6379 stop
52 ~]# /etc/init.d/redis_6379 start
52 ~]# redis-sentinel /etc/sentinel.conf //启用哨兵模式监控
51 ~]# /etc/init.d/redis_6379 stop //模拟51主库挂掉
52 ~]# redis-cli -h 192.168.4.52 -p 6352 //此时查看52的redis角色,就自动切换成主库角色了
192.168.4.52:6352> info replication
# Replication
role:master
connected_slaves:1
52 ]# sentinel monitor mymaster 192.168.4.51 6351 1 //原配置
52 ]# sentinel monitor mymaster 192.168.4.51 6351 1 //切换角色后,监视的主机和端口号也会改变
52 ~]# grep “slaveof 192.168.4.51 6351” /etc/redis/6379.conf //原配置
52 ~]# grep “slaveof 192.168.4.51 6351” /etc/redis/6379.conf //切换角色后,redis主配置文件中282行的内容会自动删除
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51 ~]# /etc/init.d/redis_6379 start //模拟51主库恢复
51 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
192.168.4.51:6351> info replication //恢复后会自动永久成为新主库的从库(哨兵监控不关闭,后续关闭没影响)
# Replication
role:slave
master_host:192.168.4.52
master_port:6352
master_link_status:up
51 ~]# grep “192.168.4.52” /etc/redis/6379.conf //切换角色后,redis主配置文件中会追加一行内容:”slaveof 192.168.4.52 6352”
slaveof 192.168.4.52 6352
########################################################################################
二、Redis 持久化RDB/AOF
2.1 数据持久化RDB
2.1.1 RDB 介绍
• 全称 Reids DataBase
– 数据持久化方式之一
– 在指定时间间隔内,将内存中的数据集快照写入硬盘。
– 术语叫 Snapshot 快照。
– 恢复时,将快照文件直接读到内存里。
2.1.2 相关配置参数
• 文件名
– dbfilename “dump.rdb” // 文件名
– save “” // 禁用 RDB
• 数据从内存保存到硬盘的频率
– save 900 1 // 900 秒内且有 1 次修改存盘
– save 300 10 //300 秒内且有 10 次修改存盘
– save 60 10000 //60 秒内且有 10000 修改存盘
• 手动立刻存盘
– > save // 阻塞写存盘
– > bgsave // 不阻塞写存盘
• 压缩
– rdbcompression yes | no
• 在存储快照后,使用 crc16 算法做数据校验
– rdbchecksum yes|no
• bgsave 出错停止写操作 , 对数据一致性要求不高设置为 no,默认为yes
– stop-writes-on-bgsave-error yes|no
2.1.3 使用 RDB 文件恢复数据
• 备份数据
– 备份 dump.rdb 文件到其他位置
– ~]# cp 数据库目录 /dump.rdb 备份目录
• 恢复数据
– 把备份的 dump.rdb 文件拷贝回数据库目录 , 重启 red
is 服务
– cp 备份目录 /dump.rdb 数据库目录 /
– /etc/redid/redis_ 端口 start
2.1.4 RDB 优点 / 缺点
• RDB 优点
– 持久化时, Redis 服务会创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件;整个过程中主进程不做任何 IO 操作,这就确保了极高的性能。
– 如果要进程大规模数据恢复,且对数据完整行要求不是非常高,使用 RDB 比 AOF 更高效。
• RDB 的缺点
– 意外宕机,最后一次持久化的数据会丢失
redis
254 dbfilename “dump.rdb”
217 # save “” //save “” 禁用RDB,默认注释掉
219 save 900 1 //15分钟修改1次执行一次存盘
220 save 300 10 //10分钟修改10次就执行一次存盘
221 save 60 10000 //1分钟修改10000次就执行一次存盘
如果要清除Redis里面的数据,可以用flushall。它会将内存里面的数据和RDB文件的数据都删除
先删文件,再停服务,自动把内存的数据写入硬盘并创建dump.rdb文件(启动服务,则会加载dump.rdb的数据到内存中)
2.2 持久化 AOF
2.2.1 AOF介绍
只做追加操作的文件,Append Only File
1)记录redis服务所有写操作
2)不断的将新的写操作,追加到文件的末尾
3)使用cat命令可以查看文件内容
2.2.2 相关配置参数
• 文件名
– appendfilename “appendonly.aof” // 文件名
– appendonly yes // 启用 aof ,默认 no
• AOF 文件记录,写操作的三种方式
– appendfsync always // 有新的写操作立即记录,性能差,完整性好。
– appendfsync everysec // 每秒记录一次,宕机时会丢失 1 秒的数据
– appendfsync no // 从不记录
• 日志重写 ( 日志文件会不断增大 ) ,何时会触发日志重写?
– redis 会记录上次重写时 AOF 文件的大小,默认配置
是当 aof 文件是上次 rewrite 后大小的 1 倍且文件大于64M 时触发。
– auto-aof-rewrite-percentage 100
– auto-aof-rewrite-min-size 64mb
• 修复 AOF 文件
– 把文件恢复到最后一次的正确操作
把文件恢复到最后一次正确操作
]# redis-check-aof –fix appendonly.aof
2.2.3 使用 AOF 文件恢复数据
• 备份数据
– 备份 dump.rdb 文件到其他位置
– ~]# cp 数据库目录 /appendonly.aof 备份目录
• 恢复数据
– 把备份的 dump.rdb 文件拷贝回数据库目录 , 重启 redis 服务
– cp 备份目录 /appendonly.aof
– /etc/redid/redis_ 端口 start
2.2.4 AOF优点/缺点
AOF优点
1) 可以灵活设置持久化方式,同步持久化apependfsync; alwayls或异步持久化appendfsync verysec
2) 出现意外宕机时,仅可能丢失一秒的数据
AOF缺点
1)持久化文件的体积通常会大于RDB方式
2)执行fsync策率的速度可能会比RDB方式慢
三、数据类型
string字符串:
192.168.4.51:6351> set tel 13755727149
OK
192.168.4.51:6351> get tel
13755727149
1. setrange key offset value //从偏移量开始复写key的特定位的值
192.168.4.51:6351> setrange tel 4 ****
(integer) 11
192.168.4.51:6351> get tel
“1375****149”
a. 获取
192.168.4.51:6351> get tel
“1375****149”
192.168.4.51:6351> getrange tel 1 2 //getrange截取变量部分的值 适合数值类型的值
“37”
192.168.4.51:6351> getrange tel 0 3
“1375”
192.168.4.51:6351> getrange tel -3 -1
“149”
192.168.4.51:6351> getrange tel -4 -1
“*149”
2. 192.168.4.51:6351> strlen fan //统计字串长度
(integer) 9
192.168.4.51:6351> strlen tel
(integer) 11
3. 192.168.4.51:6351> exists name2 //测试变量是否存在
(integer) 0
4. append key value //存在则追加,不存在则创建key及value,返回长度
192.168.4.51:6351> append name2 qin
(integer) 3
192.168.4.51:6351> append name2 qinqin
(integer) 9
192.168.4.51:6351> get name2
“qinqinqin”
5.setbit key offset value
对key所存储的字符串,设置或清除特定偏移量上的位(bit)
value值可以是1或0, offset为0~2^32之间
key不存在,则创建新key
192.168.4.51:6351> setbit qinbaobao 0 1
(integer) 0
192.168.4.51:6351> setbit qinbaobao 1 1
(integer) 0
192.168.4.51:6351> setbit qinbaobao 2 0
(integer) 0
192.168.4.51:6351> setbit qinbaobao 2 0
(integer) 0
192.168.4.51:6351> setbit qinbaobao 2 1
(integer) 0
192.168.4.51:6351> bitcount qinbaobao //统计字符串中被设置为1的比特位数量
(integer) 3
应用场景:淘宝对用户每天登陆的次数的统计
优点:节省物理内存
6. 自减
192.168.4.51:6351> exists Y
(integer) 0
192.168.4.51:6351> decr y //变量y不存在,则定义初始值为0 然后调用decr一次就自减1 适用于数值型
(integer) -1
192.168.4.51:6351> get y
“-1”
192.168.4.51:6351> set x 5
OK
192.168.4.51:6351> decr x //变量x存在 调用一次就自减1
(integer) 4
192.168.4.51:6351> decrby x 2 //调用decrby自定义自减数”2”
(integer) 2
7. 自加
192.168.4.51:6351> get x
“2”
192.168.4.51:6351> incr x
(integer) 3
192.168.4.51:6351> incr x
(integer) 4
192.168.4.51:6351> incr x //变量x存在 调用一次就自加1,变量x不存在,则定义初始值为0 然后调用incr一次就自加1 适用于数值型
(integer) 5
192.168.4.51:6351> incrby x 5 //调用incrby自定义自加数”2”,变量x不存在,则定义初始值为0 然后调用incrby一次就自定义自加数”2”
(integer) 10
192.168.4.51:6351> incrbyfloat x 0.5 //支持小数
(integer) 10.5
8). 批量定义和获取变量
192.168.4.51:6351> mset j 10 k 20 //mset 一次定义多个变量
OK
192.168.4.51:6351> mget j k //mget 一次取多个变量
1) “10”
2) “20”
192.168.4.51:6351> get tel x //get只能取一个变量的值,取多个会报错
(error) ERR wrong number of arguments for ‘get’ command
192.168.4.51:6351> mget tel x //mget可以一次取多个变量的值
1) “1375****149”
2) “2”
LIST列表
1)Reis的list是一个字符队列
2)先进后出 //先存进去的后显示出来
3)一个key可以有多个值
LIST列表操作
1. lpush key value[value…] 将一个或多个value插入到列表key的表头;key的值不存在则创建key
192.168.4.51:6351> lpush web a b c d e f
(integer) 6
2. lrange key start stop 从开始位置读取key的值到stop位置结束
192.168.4.51:6351> lrange web 0 -1 //显示全部
1) “f”
2) “e”
3) “d”
4) “c”
5) “b”
6) “a”
192.168.4.51:6351> lrange web -2 -1 //显示最后两个(遵循先进后出的原则)
1) “b”
2) “a”
3. lop key //移除并返回列表的头元素数据,可以不存在则返回nil
192.168.4.51:6351> lpop web //移除表头元素,可以多次执行
“f”
4. llen key 返回列表的长度
192.168.4.51:6351> llen web
(integer) 5
5.lindex key index //返回列表的第几个index的值
192.168.4.51:6351> lindex web 0
“d”
6.lset key index value //将key中index位置修改为value
192.168.4.51:6351> lset web 0 N
OK
192.168.4.51:6351> lindex web 0
“N”
7. rpush key value [value…] //将value插入到key的末尾
8. rpop key //删除并返回key末尾的值
Hash表
*Redis Hash 介绍
1)是一个string类型的filed和value的映射表
2)一个key可以对应多个的filed,一个filed对应一个value
3)将一个对象存储为hash类型,较于每一个字段都存储成string类型更能节省内存
1.将hash表中的发iled值设置为value
a. 单条设置
192.168.4.51:6351> hset ywzd author majiang
(integer) 1
192.168.4.51:6351> hset ywzd money 88
(integer) 1
192.168.4.51:6351> hget ywzd version v7
(integer) 1
b. 批量设置
192.168.4.51:6351> hmset ywzd sale jd geshu 1000
OK
2. 返回hash表中的filed的值
a.单条获取
192.168.4.51:6351> hget ywzd version
v7
b.批量获取
192.168.4.51:6351> hmget ywzd sale geshu
1) “jd”
2) “1000”
3.返回hash表中所有filed名称
192.168.4.51:6351> hkeys ywzd
1) “author”
2) “money”
3) “version”
4) “sale”
5) “geshu”
4. 返回hash表中所有的filed的名称和值
192.168.4.51:6351> hgetall ywzd
1) “author”
2) “majiang”
3) “money”
4) “88”
5) “version”
6) “v7”
7) “sale”
8) “jd”
9) “geshu”
10) “1000”
5. 返回hash表中所有filed的值
192.168.4.51:6351> hvals ywzd
1) “majiang”
2) “88”
3) “v7”
4) “jd”
5) “1000”
6.删除hash表中的多个filed的值,不存在则忽略
192.168.4.51:6351> hdel ywzd author money
(integer) 2