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
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值