Day65
主从复制
主从复制概述
主从复制结构模式
一主一从、一主多从、主从从
主从复制工作原理
工作原理:
1. slave向master发送sync命令
2. master启动后台存盘进程,并收集修改数据命令
3. master完成后台存盘后,传送整个数据文件到slave
4. slave接收数据文件,加载到内存中完成首次完全同步
5. 后续有新数据产生时,master继续收集数据修改命令依次传给salve,完成同步
配置主从复制
拓扑结构
配置从库
redis服务运行后,默认都是master服务器
[root@redisA ~]# redis-cli -h 192.168.4.51 –p 6351
192.168.4.51:6351> info replication //查看复制信息
# Replication
role:master //是master 服务器
connected_slaves:0 //从服务器个数零台
master_replid:eaa14478158a71c41f947eaea036658c2087e8f2
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
192.168.4.51:6351>
将主机192.168.4.52配置为192.168.4.51的从服务器
1)命令行配置(马上生效)
[root@redisB ~]# redis-cli -h 192.168.4.52 –p 6352
192.168.4.52:6352> slaveof 192.168.4.51 6351 //指定主服务器ip地址与端口
OK
192.168.4.52:6352> info replication //查看复制信息
# Replication
role:slave //从服务器
master_host:192.168.4.51 //主服务器ip地址
master_port:6351 //主服务器端口
master_link_status:up //连接状态开启
master_last_io_seconds_ago:3
master_sync_in_progress:0
2)永久配置(重新redis服务后,依然有效)
[root@redisB ~]# vim /etc/redis/6379.conf
slaveof 192.168.4.51 6351 //在文件末尾添加或在原有配置项上修改都可以
3)在主服务器查看复制信息
[root@redisA ~]# redis-cli -h 192.168.4.51 –p 6351
192.168.4.51:6351> info replication //查看复制信息
# Replication
role:master
connected_slaves:1 //从服务器个数 1台
slave0:ip=192.168.4.52,port=6352,state=online,offset=14,lag=1 //从服务器信息
master_replid:db7932eb0ea4302bddbebd395efa174fb079319f
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
192.168.4.51:6351>
测试配置
1)客户端连接主服务器存储数据
[root@client50 ~]# redis-cli -h 192.168.4.51 –p 6351
192.168.4.51:6351> set x 9
OK
192.168.4.51:6351> set y 8
OK
192.168.4.51:6351> set z 7
OK
2)在从服务器本机登录,查看数据(与主服务器数据一致)
[root@redisB ~]# redis-cli -h 192.168.4.52 –p 6352
192.168.4.52:6352> keys *
1)“x”
2)“y”
3)“z”
配置带验证的主从复制
设置主服务器192.168.4.51 设置连接密码123456
1) 修改主服务器的配置文件,设置密码。
[root@redisA ~]# vim +501 /etc/redis/6379.conf
requirepass 123456 //设置密码
:wq
[root@redisA ~]# vim +43 /etc/init.d/redis_6379 //修改脚本
$CLIEXEC -h 192.168.4.51 -p 6351 -a 123456 shutdown //添加密码
:wq
[root@redisA ~]# /etc/init.d/redis_6379 stop //停止服务
[root@redisA ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@redisA ~]#
[root@redisA ~]# netstat -utnlp | grep :6351 //查看端口
tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 11523/redis-server
配置从服务器192.168.4.52
1) 修改配置文件,设置主服务器连接密码。
[root@redisB ~]# /etc/init.d/redis_6379 stop //停止服务
[root@redisB ~]# vim +289 /etc/redis/6379.conf
masterauth 123456 //设置密码
:wq
[root@redisA ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@redisA ~]#
[root@redisA ~]# netstat -utnlp | grep :6351 //查看端口
tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 11523/redis-server
2) 在从服务器本机连接服务,查看复制信息
[root@redisB ~]# redis-cli -h 192.168.4.52 –p 6352 192.168.4.52:6352> info replication //查看复制信息
# Replication
role:slave //从服务器
master_host:192.168.4.51 //主服务器ip地址
master_port:6351 //主服务器端口
master_link_status:up //连接状态开启
master_last_io_seconds_ago:3
master_sync_in_progress:0
……
……
192.168.4.52:6352>
哨兵服务
简介:
作用:监视master服务器,当发现master宕机,将从服务器升级为主服务器。
主配置文件:sentinel.conf
模板文件:redis-4.0.8/sentinel.conf
配置哨兵服务流程
1. 安装redis软件
2. 创建主配置文件
3. 启动哨兵服务
拓扑环境
1) 安装源码软件redis ,无需做初始化配置。
[root@redis57 redis]# yum -y install gcc
[root@redis57 redis]# tar -zxf redis-4.0.8.tar.gz
[root@redis57 redis]# cd redis-4.0.8/
[root@redis1 redis-4.0.8]# make
[root@redis1 redis-4.0.8]# make install
2)编辑主配置文件
[root@redis57 redis]# vim /etc/sentinel.conf //创建主配置文件
sentinel monitor server51 192.168.4.51 6351 1 //监视主服务器
bind 0.0.0.0 //哨兵服务地址(表示本机所有网络接口)
sentinel auth-pass server51 123456 //主服务器密码
3)启动哨兵服务
[root@redis57 redis]# redis-sentinel /etc/sentinel.conf //启动哨兵服务
25371:X 28 Sep 11:16:54.993 # +sdown master redis51 192.168.4.51 6351
25371:X 28 Sep 11:16:54.993 # +odown master redis51 192.168.4.51 6351 #quorum 1/1
25371:X 28 Sep 11:16:54.993 # +new-epoch 3
25371:X 28 Sep 11:16:54.993 # +try-failover master redis51 192.168.4.51 6351
25371:X 28 Sep 11:16:54.994 # +vote-for-leader be035801d4d48eb63d8420a72796f52fc5cec047 3
...
25371:X 28 Sep 11:16:55.287 * +slave slave 192.168.4.51:6351 192.168.4.51 6351 @ redis51 192.168.4.52 6351
25371:X 28 Sep 11:17:25.316 # +sdown slave 192.168.4.51:6379 192.168.4.51 6379 @ redis51 192.168.4.52 6352
测试配置
1)停止主服务器51的redis服务
[root@redisA ~]# /etc/init.d/redis_6379 stop
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@redisA ~]#
2)在服务器52主机,查看复制信息
[root@redisB ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication
# Replication
role:master //角色是master
connected_slaves:0
……
……
持久化
RDB
RDB简介
Redis数据库文件
是数据库持久化方式之一
是持久化默认方式
按照指定时间间隔,将内存中的数据集快照写入硬盘
在指定时间间隔内,将内存中的数据集快照写入硬盘
术语叫Snapshot快照
恢复时,将快照文件直接读到内存里
相关配置参数
文件名
dbfilename “dump.rdb” 文件名
数据从内存保存到硬盘的频率
save 900 1 900秒内且有1个key改变
save 300 10 300秒内且有10个key改变
save 60 10000 60秒内且有10000个key改变
[root@redisA ~]# vim /etc/redis/6379.conf
dbfilename dump.rdb
save 900 1
#save 300 10 //注释原有设置
save 120 10 //时间修改为 120秒
save 60 10000
:wq
[root@redisA ~]# /etc/init.d/redis_6379 stop //停止服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@redisA ~]#
[root@redisA ~]# rm –rf /var/lib/redis/6379/* //清空数据库目录
[root@redisA ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@redisA ~]#
[root@redisA ~]# ls /var/lib/redis/6379 //此时,查看数据库目录下没有dump.rdb文件
[root@redisA ~]#
[root@redisA ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456 //连接服务,在200秒内存储10个变量,就会自动在数据库目录下创建dump.rdb 文件
192.168.4.51:6351> set v1 k1
OK
192.168.4.51:6351> set v2 k1
OK
192.168.4.51:6351> set v3 k1
OK
192.168.4.51:6351> set v4 k1
OK
192.168.4.51:6351> set v45 k1
OK
192.168.4.51:6351> set v46 k1
OK
192.168.4.51:6351> set v7 k1
OK
192.168.4.51:6351> set v8 k1
OK
192.168.4.51:6351> set v9 k1
OK
192.168.4.51:6351> set v10 k1
OK
192.168.4.51:6351> keys *
1) "v2"
2) "v9"
3) "v10"
4) "v45"
5) "v4"
6) "v1"
7) "v46"
8) "v8"
9) "v7"
10) "v3"
192.168.4.51:6351>exit
[root@redisA ~]# ls /var/lib/redis/6379 //此时,查看数据库目录下有dump.rdb文件
dump.rdb
[root@redisA ~]#
备份数据
[root@redisA ~]# cd /var/lib/redis/6379/
[root@redisA 6379]# ls
dump.rdb
[root@redisA 6379]# cp dump.rdb /tmp/dump.rdb //备份dump.rdb文件
[root@redisA 6379]# scp /tmp/dump.rdb root@192.168.4.56:/root/ //传递备份文件给目标主机
删除数据 (56主机模拟误删除数据)
[root@redis56 ~]# redis-cli -h 192.168.4.56 –p 6356 //连接服务
192.168.4.56:6356> flushall
OK
192.168.4.51:6379> keys * //已经没有数据
(empty list or set)
192.168.4.56:6356> exit
恢复数据(56主机使用备份文件恢复数据)
[root@redis56 ~]# /etc/init.d/redis_6379 stop //停止服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@redis56 ~]#
[root@redis56 ~]# rm -rf /var/lib/redis/6379/* //清空数据库目录
[root@redis56 ~]# cp /tmp/dump.rdb /var/lib/redis/6379/ //拷贝备份文件到数据库目录下
[root@redis56 ~]# /etc/init.d/redis_6379 start // 启动服务
Starting Redis server...
[root@redis56 ~]# redis-cli -h 192.168.4.56 –p 6356 //访问服务
192.168.4.56:6356> keys * //查看数据
1) "v7"
2) "v46"
3) "v45"
4) "v8"
5) "v4"
6) "v2"
7) "v1"
8) "v3"
9) "v9"
10) "v10"
192.168.4.56:6356>
RDB优点与缺点
优点:
高性能的持久化实现——创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;过程中对数据完整性要求不是非常高。
比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合。
缺点:
意外宕机时,丢失最后一次持久化的所有数据。
AOF
AOF介绍
追加方式记录写操作的文件,记录redis服务所有写操作,追加到文件末尾,默认没有启用,使用cat命令可以查看文件内容。
启用AOF
>config set appendonly yes
>config rewrite
使用AOF文件恢复数据
1)修改配置文件
[root@redisA ~]# redis-cli -h 192.168.4.51 –p 6351 -a 123456 //连接服务
192.168.4.51:6351>config set appendonly yes //启用aof,默认no
192.168.4.51:6351> config rewrite //写进配置文件
192.168.4.51:6351> save
192.168.4.51:6351> exit
[root@redisA ~]# ls /var/lib/redis/6379/ //会出现appendonly.aof文件
appendonly.aof dump.rdb
2)备份AOF文件
[root@redisA ~]# cd /var/lib/redis/6379/
[root@redisA 6379]# cp appendonly.aof /tmp/appendonly.aof
[root@redisA 6379]# scp /tmp/appendonly.aof root@192.168.4.57:/root/ //传递备份文件给目标主机
3)删除数据(在57主机 默认数据误删除)
[root@redis57 ~]# redis-cli -h 192.168.4.57 -p 6357 //连接服务
192.168.4.57:6357> flushall //清除数据
OK
192.168.4.57:6357> keys * //查看数据
(empty list or set)
192.168.4.57:6357> exit
- 使用AOF文件恢复数据
[root@redis57 ~]# vim +673 /etc/redis/6379.conf
appendonly yes //启用AOF
:wq
[root@redis57 ~]#
[root@redis57 ~]# /etc/init.d/redis_6379 stop //停止服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@redis57 ~]#
[root@redis57 ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@redis57 ~]#
[root@redis57 ~]# rm -rf /var/lib/redis/6379/* //删除没有数据的文件
[root@redis57 ~]# cp /root/appendolny.aof /var/lib/redis/6379/ //拷贝文件
[root@redis57 ~]# /etc/init.d/redis_6379 start //启动服务
Starting Redis server...
[root@redis57 ~]# redis-cli -h 192.168.4.57 -p 6357 //连接服务
192.168.4.57:6357> keys * //查看数据
1) "v9"
2) "v5"
3) "v8"
4) "v2"
5) "v1"
6) "v4"
7) "v10"
8) "v6"
9) "v7"
10) "v3"
192.168.4.57:6357>
优化配置
定义文件名
appendonly yes //启用aof
appendfilename ”文件名“ //指定文件名
AOF文件记录写操作的方式
appendfsync always //时时记录,并完成磁盘同步
appendfsync everysec //每秒记录一次,并完成磁盘同步
appendfsync no //写入aof,不执行磁盘同步
日志重写
auto-aof-rewrite-min-size 64mb //首次重写触发值
auto-aof-rewrite-percentage 100 //再次重写,增长百分比
修复AOF文件
把文件恢复到最后一次操作
redis-check-aof --fix appendonly.aof
AOF优点与缺点
AOF优点
可以灵活设置持久化方式
出现意外宕机时,仅可能丢失1秒数据
AOF缺点
持久化文件的体积通常会大于RDB方式
执行fsync策略时速度可能回避RDB方式慢
数据类型
String字符串
字符串操作
set key value [ex seconds] [px milliseconds] [nx|xx]
——设置key及值,过期时间可以使用秒或者毫秒
setrange key offset value
——从偏移量开始复写key的特定位的值
strlen key,统计字串长度
append key value
——存在则追加,不存在则创建key及value,返回key长度
setbit key offset value
——对key所存储字串,设置或清除特定偏移量上的位
——value值可以为1或0,offset为0232之间
——key不存在,则创建新的key
bitcount key
——统计字串中被设置为1的比特位数量
decr key
将key中的值减少1,key不存在则先初始化
decrby key decrement
将key中的值减去decrement
get key
返回key存储字符串值,若key不存在则返回null
若key的值不是字串,则返回错误,get只能处理字串
getrange key start end
返回字串值中的字串,截取范围为start和end
负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符
incr key
将key的值加1,如果key不存在,则初始为0后再加1
主要应用为计数器
incr key
将key的值加1,如果key不存在,则初始为0后再加1
主要应用为计数器
incrby key increment
将key的值增加incremaent
mget key [key]
获取一个或多个key的值,空格分隔,具有原子性
mset key value [key value ……]
设置多个key和值,空格分隔,具有原子性
List列表
简介
list是个字符队列,先进后出,一个key可以有多个值
List列表操作
lpush key value [value……]
将一个或多个值value插入到列表key的表头
key不存在,则创建key
lrange key start stop
从开始位置读取key的值到stop结束
lpop key
移除并返回列表头元素数据,key不存在则返回nil
llen key
返回列表key的长度
lindex key index
返回列表中第index个值
lset key index value
将key中的index位置的值修改为value
rpush key value [value……]
将value插入到key的末尾
rpop key
删除并返回key末尾的值
Hash表
Hash简介
Redis hash是一个string类型的field和value的映射表
一个key能对应多个field,一个field对应一个value
将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存
Hash表操作
hset key field value
将hash表中field值设置为value
hget key filed
获取hash表filed的值
hmset key field value [field value……]
同时给hash表中的多个field赋值
hmget key field [field ……]
返回hash表的多个field的值
hkeys key
返回hash表中所有的field名称
hgetall key
返回hash表中所有field和value
hvals key
返回hash 表中的所有field的值
hdel key field [field]
删除hash表中多个列的值,不存在则忽略。
返回列表中第index个值
lset key index value
将key中的index位置的值修改为value
rpush key value [value……]
将value插入到key的末尾
rpop key
删除并返回key末尾的值
Hash表
Hash简介
Redis hash是一个string类型的field和value的映射表
一个key能对应多个field,一个field对应一个value
将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存
Hash表操作
hset key field value
将hash表中field值设置为value
hget key filed
获取hash表filed的值
hmset key field value [field value……]
同时给hash表中的多个field赋值
hmget key field [field ……]
返回hash表的多个field的值
hkeys key
返回hash表中所有的field名称
hgetall key
返回hash表中所有field和value
hvals key
返回hash 表中的所有field的值
hdel key field [field]
删除hash表中多个列的值,不存在则忽略。