The Road of DBA 15_NoSQL_Redis&Sentinel

在mysql中数据的保存形式:

name    age  job 
zhangya 28   it

在redis中数据的保存形式::

name:zhangya
age:28
job:it
id:1
session:xxxxxxx 24小时过期
money:48小时

redis特点:

1.支持6种数据类型,字符串,哈希,列表,集合,有序集合
2.速度非常快,所有数据存放在内存中
3.持久化存储,快照或日志

安装完成后的可执行文件

redis-benchmark  
redis-check-aof  
redis-check-rdb  
redis-cli           客户端连接工具
redis-sentinel      哨兵服务端
redis-server        服务端

利用官方脚本生成配置文件

/opt/redis_cluster/redis/utils/install_server.sh

安装:

配置文件:

cat > /opt/redis_cluster/redis_6379/conf/redis_6379.conf <

启动:

redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
关闭:
redis-cli shutdown

类型1:字符串

适用场景:优惠券 文本  
set 
get
mset
mget
incr key
decr key
incrby  key num
decrby  key num 
EXISTS key
DEl key
TTL k1 
EXPIRE k1 10
PERSIST k1 
-1  永不过期    
-2  键不存在

类型2:列表

适用场景:排行榜
rpush
lpush
lrange
rpop
lpop

类型3:哈希

适用场景:mysql的缓存层
HMSET   key  field value  
HMGET   key  field 
HGETALL key
HMSET user:1000 username zhangya age 28 job it
HMGET user:1000 
HMGET us
er:1000 username
HMGET user:1000 username age
HMGET user:1000 username age job
HMGET user:1000 all
HGETALL user:1000
HMSET user:1000 email [email protected]
HGETALL user:1000

类型4:集合

适用场景:推荐系统 兴趣标签 广告精确投放
SADD set1 1 2 3 5 7 
SMEMBERS set1
SADD set2  3 6 8 5 7 
SMEMBERS set2
SADD set1 1 
SADD set1 1 11
SMEMBERS set1
SMEMBERS set2
SDIFF set1 set2
SDIFF set2 set1
SADD set3 1 5 12 9
SDIFF set1 set2 set3
SDIFF set3 set1 set2
SINTER set1 set2
sunion set1 set2 set3

持久化

rdb 
优点:恢复速度快,空间小
缺点:可能会丢失

aof 
优点:数据安全,不容易丢失
缺点:恢复速度慢,空间大

热更新
CONFIG GET *

rdb持久化方式的配置

config gat * 获取所有配置信息
命令行中为临时生效:
127.0.0.1:6379> CONFIG GET save
1) "save"
2) ""
127.0.0.1:6379> CONFIG SET save "60 100 300 10 600 1"
OK
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "60 100 300 10 600 1"

永久生效:
写入配置文件,格式如下
SAVE  60 100
SAVE 300 10
SAVE 600 1
隐藏条件:
1.如果同时有AOF和RDB存在,重启的时候,载入的是AOF文件
2.shutdown   shutdown的过程是执行了save和shutdown两个操作 
  - bgsave保存,落地
  - shutdown结束
注意:此数据支持热更新
查看端口配置:
127.0.0.1:6379> CONFIG set port "7000"
(error) ERR Unsupported CONFIG parameter: port  
注意:此数据不支持热更新

架构:

主从复制
哨兵
集群 

mysql开启主从复制步骤

大致流程如下:
1.打开binlog,建立复制授权用户
2.server id不同
3.主库数据导出 mysqldump xtrabackup
--master-data=2 
--singxZxdasd-xasd=1
4.从库数据导入
5.配置主从参数
6.yes 延迟

主从复制

1.从库向主库发起同步请求
2.主库接收到从库的同步请求
3.主库开始bgsave生成rdb文件
4.主库生成完之后,保存到磁盘成功
5.主库将RDB文件发送给从库
6.从库接收主库的RDB文件
7.从库清空自己所有的数据
8.从库将接受的RDB文件载入到内存中

危险操作:
1.如果主库不小心同步了空的从库,会导致主库数据全部丢失

谨慎的操作流程:
1.在配置文件里配置slaveof参数,不要热更新配置
2.主库主动执行bgsave保存rdb文件,然后备份一份rdb文件

恢复操作:
1.主库停止复制关系,注释掉aof相关参数
2.停止主库
3.删除原有的rdb数据,重命名备份的rdb文件
4.重新启动主库,将rdb文件导入到内存里

模拟的场景:

1.备份了数据
2.但是主库不小心同步了空的从库
3.主库恢复数据

所有节点都操作

<1>杀掉redis
pkill redis
<2>清空数据
rm -rf /data/redis_cluster/redis_6379/*
<3>配置文件

cat >/opt/redis_cluster/redis_6379/conf/redis_6379.conf <所有节点启动服务
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

db01主库上执行

for i in {0..2000};do redis-cli set k_${i} v_${i}; echo "${i} is ok";done

<1>主库生成rdb数据
进入到redis里
redis-cli 
bgsave

<2>备份数据
cd /data/redis_cluster/redis_6379/
cp redis_6379.rdb redis_6379.rdb.bak

<3>模拟操作失误,同步了从库
注意:不要复制提示符
[root@db01 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 10.0.0.52 6379
OK

<4>模拟恢复
1.停掉db01的redis服务
redis-cli shutdown
2.检查redis是否真的停止了
ps -ef|grep redis
3.注释掉配置文件里的slaveof
4.恢复备份的数据
cd /data/redis_cluster/redis_6379
cp redis_6379.rdb.bak redis_6379.rdb
5.启动服务
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
6.检查数据是否恢复了
redis-cli
keys *

模拟主库故障

db02上操作:
redis-cli
SLAVEOF 10.0.0.51 6379

##查看db02日志
[root@db02 ~]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log 

##关闭db01
redis-cli shutdown

##从库如何接管
从库db02slaveof no one取消复制关系
redis-cli -h db02 -p 6379 slaveof no one

##db02备份从库数据
cd /data/redis_cluster/redis_6379
cp redis_6379.rdb redis_6379.rdb.bak

##db01旧主库修复上线
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
SLAVEOF 10.0.0.52 6379 
keys *

##负载均衡关闭后端负载,防止数据写入

##修复后的db01从库重新升级为主库
SLAVEOF no one

##代码修改为主库db01的IP,负载均衡重新挂载后端服务

##db02重新生成主从关系
SLAVEOF 10.0.0.51 6379 

##确认数据同步正常

哨兵

<1>安装步骤:
mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf<

主从关系:

从库执行:
SLAVEOF 10.0.0.51 6379 

启动哨兵:
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 

检查服务
ps -ef|grep redis

查看哨兵配置文件
cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf

注意:
不要自己去改动哨兵的配置文件

Sentinel原始配置文件

[root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
bind 10.0.0.51
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000

当哨兵全部节点开启后配置文件的变化

[root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
bind 10.0.0.51
port 26379
daemonize yes
logfile "/opt/redis_cluster/redis_26379/logs/redis_26379.log"
dir "/data/redis_cluster/redis_26379"
sentinel myid d38f0c394afaf5fd462de16ff56be9f72f2f91d5
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 18000
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 10.0.0.52 6379
sentinel known-slave mymaster 10.0.0.53 6379
sentinel known-sentinel mymaster 10.0.0.53 26379 eb103c3bc5bc99997091273d95827006a0f9af9e
sentinel known-sentinel mymaster 10.0.0.52 26379 f1c1b37cfe230d656345a26f26e97e96b706fb90
sentinel current-epoch 0

0.杀掉哨兵
1.主从复制先做好
db02和db03复制db01

哨兵故障恢复:

1.先启动db01
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

2.启动哨兵
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 

3.设置权重
db02和db03调大权重
CONFIG SET slave-priority 0

4.重新发起选举
在db01上的26379节点执行
redis-cli -h 10.0.0.51 -p 26379 Sentinel failover mymaster

5.观察主从复制是否正常
redis-cli 
CONFIG GET slaveof

6.db01恢复权重
CONFIG SET slave-priority 100


问题总结:
1.比较天真的复制粘贴,没有修改成自己IP地址
2.主从没做好,哨兵一定不好使
3.先启动单节点的redis,再启动哨兵

回顾总结:

1.redis五种数据结构和应用场景

- 字符串  优惠券过期 帖子浏览数计数 
- 哈希    mysql缓存,对应表关系 
- 集合    兴趣爱好标签  共同好友 共同爱好 精确广告投放
- 列表    排行榜 

2.持久化

         优点              缺点
rdb  恢复快,占用空间小   可能会丢数据
aof  安全性高            恢复速度慢,占用空间大

3.安全性

- 绑定内网IP
- 修改默认端口
- 增加密码认证
- 定时备份RDB文件

4.主从复制

- 防火墙放开端口
- slaveof MASTER_IP PORT
- slaveof no one 
- config get slaveof 
- 同步过程看日志
- 谨慎操作,先备份,不要热更新slaveof,不要同步反了

5.哨兵

- 防火墙放开端口
- 解决主从复制需要人工介入的问题
- 先做好主从架构
- 在配置哨兵并启动
- 哨兵有自己专用的命令
- 哨兵也是一个redis节点
- 哨兵的配置文件不要手动去修改
- 修复上线步骤:先调低其他节点的权重为0,执行重新选举,修改会默认的权重

你可能感兴趣的:(The Road of DBA 15_NoSQL_Redis&Sentinel)