2019-07-03 NoSQL产品之Redis主从复制-哨兵


课程介绍

Redis

1-2

Mongodb

1-2

Elasticsearch

1

EFRLK

1-2

中小型互联网企业架构演变


Redis环境准备

介绍

redis:缓存
NoSQL    非关系型数据库
key-valus   键 值 对  k1:v1

特点:
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

一、环境准备

1.1 操作系统说明
操作系统    Centos7
数量       3台机器 主机名:db01 db02 db03  IP地址:51,52,53
CPU        无要求
内存       内存1G
硬盘       无要求,不能太小

1.2 关闭防火墙和selinux
#停止防火墙并禁止自启动
systemctl stop firewalld.service
systemctl disable firewalld.service

# 关闭selinux
sed -i.bak 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
setenforce 0

1.3 db01配置hosts和ssh

配置hosts和密钥认证

[root@db01 ~]# cat > /etc/hosts << EOF
10.0.0.51 db01    
10.0.0.52 db02    
10.0.0.53 db03
EOF
[root@db01 ~]# ssh-keygen
[root@db01 ~]# ssh-copy-id db02
[root@db01 ~]# ssh-copy-id db03
1.4 所有节点安装redis

注意:所有节点都需要安装

mkdir -p /data/soft

mkdir -p /data/redis_cluster/redis_6379

mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}

cd /data/soft/

wget http://download.redis.io/releases/redis-3.2.9.tar.gz

tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/

ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis

cd /opt/redis_cluster/redis

make && make install
1.5 db01配置rudy环境
yum makecache fast

yum install rubygems

gem sources --remove [https://rubygems.org/](https://rubygems.org/)

gem sources -a http://mirrors.aliyun.com/rubygems/

gem update –system

gem install redis -v 3.3.5

ruby -v

gem -v

1.6 db01安装键值分析工具
yum install python-pip gcc
pip install --upgrade pip
pip install rdbtools
1.7 所有节点部署redis管理脚本
[root@db01 ~]# cat redis_shell.sh 
#!/bin/bash
USAG(){
    echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
}

if [ "$#" = 1 ]
then
    REDIS_PORT='6379'
elif 
    [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
then
    REDIS_PORT="$2"
else
    USAG
    exit 0
fi

REDIS_IP=$(hostname -I|awk '{print $1}')
PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log

CMD_START(){
    redis-server ${PATH_CONF}
}

CMD_SHUTDOWN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
}

CMD_LOGIN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
}

CMD_PS(){
    ps -ef|grep redis
}

CMD_TAIL(){
    tail -f ${PATH_LOG}
}

case $1 in
    start)
        CMD_START
        CMD_PS
        ;;
    stop)
        CMD_SHUTDOWN
        CMD_PS
        ;;
    restart)
        CMD_START
        CMD_SHUTDOWN
        CMD_PS
        ;;
    login)
        CMD_LOGIN
        ;;
    ps)
        CMD_PS
        ;;
    tail)
        CMD_TAIL
        ;;
    *)
        USAG
esac

1.8安装配置文件:
cat > /opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51 127.0.0.1
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
EOF
1.9 启动和关闭
启动:
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

关闭:
redis-cli shutdown

1.10 相关命令
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  键不存在
列表   排行榜
rpush
lpush
lrange
rpop
lpop
哈希 mysql的缓存层
HMSET   key  field value  
HMGET   key  field 
HGETALL key
HMSET user:1000 username zhangya age 28 job it
HMGET user:1000 
HMGET user:1000 username
HMGET user:1000 username age
HMGET user:1000 username age job
HMGET user:1000 all
HGETALL user:1000
HMSET user:1000 email 52615417@qq.com
HGETALL user:1000
集合 推荐系统 兴趣标签 广告精确投放
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
1.11 rdb和aof 持久化对比
持久化
rdb 
优点:恢复速度快,空间小
缺点:可能会丢失

aof 
优点:数据安全,不容易丢失
缺点:恢复速度慢,空间大
热更新
CONFIG GET *
隐藏条件:

1.如果同时有AOF和RDB存在,重启的时候,载入的是AOF文件
2.shutdown 
  - bgsave
  - shutdown
1.12 redis主从复制
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.13模拟故障
模拟的场景:
1.备份了数据
2.但是主库不小心同步了空的从库
3.主库恢复数据

所有节点都操作
#杀掉redis
pkill redis

#清空数据
rm -rf /data/redis_cluster/redis_6379/*

#配置文件
cat >/opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51 127.0.0.1
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
#### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
#### 本地数据库的目录
dir /data/redis_cluster/redis_6379
save 60 100 
save 300 10 
save 600 1
EOF

#所有节点启动服务
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

#主库生成rdb数据
进入到redis里
redis-cli 
bgsave

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

#模拟操作失误,同步了从库
###注意:
[root@db01 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 10.0.0.52 6379


模拟恢复

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

##从库如何接管
从库db02  slaveof 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 

##确认数据同步正常
redis-cli
keys *

2、redis 哨兵

2.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<<EOF
bind $(hostname -i)
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
EOF

2.2 主从关系
从库执行:
SLAVEOF 10.0.0.51 6379 
2.3 启动哨兵
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 

2.4 检查服务
ps -ef|grep redis
2.5 查看哨兵配置文件
cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf

注意:
不要自己去改动哨兵的配置文件
2.6 原始配置文件和启动redis后的对比
[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

2.7 故障模拟
0.杀掉redis
pkill redis

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容