Redis
redis
一:详解和安装
1.1:详解
mysql 关系型数据库
非关系型数据库 redis mongodb
nosql 不仅仅是sql
数据持久化,可以将数据存储到磁盘上,以文件形式存储
redis是内存性的数据库,读写是非常快的
缺点是:断电释放内存数据,redis数据丢失,redis进程挂掉,数据丢失,redis提供了持久化机制
which是在PATH里找
[root@bogon src]# echo $PATH
/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/node-v8.6.0-linux-x64/bin:/root/bin
[root@bogon ~]# echo $PATH
/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/node-v8.6.0-linux-x64/bin:/root/bin
1.2:安装
redis的安装方式
源码编译(在选择编译的时候,注意删掉之前的yum安装的)
1.yum remove redis -y
2.下载redis的源代码包
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
3.解压缩源码包
编译三部曲:
#(此redis压缩包,已经提供好了makefile,只需要执行,编译的第二,第三曲)
# 因为该文件里有makefile文件 所以不用执行 ./confiure
2.执行gcc的make指令,执行makefile文件
make
3.开始安装
make install
# 重新登陆一下会发现已经加载出来PATH
[root@bogon ~]# which redis-server
/usr/local/bin/redis-server
# which是在PATH里找
[root@bogon src]# echo $PATH
/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/node-v8.6.0-linux-x64/bin:/root/bin
4.会安装在当前的源码包中的src目录,且帮你配置好了PATH变量
通过redis-加上tab补全查看所有命令
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
[root@bogon src]# pwd
/opt/redis-4.0.10/src
[root@bogon src]# redis-
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
5.制定一个安装可靠的redis数据库
如下功能通过配置文件定义
1.更改端口
2.设置密码
3.开启redis的安全启动模式
默认直接输入redis-server可以启动服务端,默认端口6379,且没有密码
redis-cli登录
[root@bogon ~]# redis-cli
127.0.0.1:6379> ping
PONG
[root@bogon redis-4.0.10]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README.md runtest-cluster src
[root@bogon redis-4.0.10]# vim redis.conf
[root@bogon redis-4.0.10]# grep -v "^#" redis.conf | grep -v "^$0" > ./s20redis.conf
# 把redis.conf有用的信息拷贝到新的s20redis.conf里
# 查看新的文件夹是否存在了
[root@bogon redis-4.0.10]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel src
BUGS deps MANIFESTO runtest s20redis.conf tests
CONTRIBUTING INSTALL README.md runtest-cluster sentinel.conf utils
[root@bogon redis-4.0.10]# vim s20redis.conf
[root@bogon ~]# cd /opt/redis-4.0.10/
[root@bogon redis-4.0.10]# vim s20redis.conf
#实际上直接touch一个 s20redis.conf 把配置信息直接复制粘贴过去
# vim s20redis.conf 内容如下
bind 192.168.190.11
protected-mode yes
port 6380
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
requirepass 123
redis.conf 内容如下,有多少参数,就有多少功能,
bind 192.168.16.142 #绑定redis启动的地址
protected-mode yes #开启redis的安全模式,必须输入密码才可以远程登录
port 6380 #指定redis的端口
daemonize yes #让redis以守护进程方式在后台运行,不占用窗口
pidfile /var/run/redis_6379.pid #记录redis的进程id号的文件
loglevel notice #日志运行等级 .严重级别,警告级别,debug调试界别.....logging
requirepass haohaio #设置redis的密码,是 haohaio
# 配置完成以后
指定配置文件的启动方式
redis-server s20redis.conf
[root@bogon redis-4.0.10]# redis-server s20redis.conf
11085:C 04 Jul 15:33:45.087 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11085:C 04 Jul 15:33:45.087 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=11085, just started
11085:C 04 Jul 15:33:45.087 # Configuration loaded
# 显示配置的信息已经加载起来
# 如果没有显示加载 则需要重新退出会话 重新登录 配置一下s20redis.conf 保存退出
# 然后 redis-server s20redis.conf
[root@bogon ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.190.11:6380 0.0.0.0:* LISTEN 11268/redis-server
#此时登录redis必须加上参数了,并且登录了之后,必须输入密码才可以使用
redis-cli -p 6380 -h 192.168.16.142
redis-cli -p 6380 -h 192.168.190.11
# 注意 启动时候在哪个目录都可以
[root@bogon ~]# redis-cli -p 6380 -h 192.168.190.11
192.168.190.11:6380> ping
(error) NOAUTH Authentication required.
# 并且登录了之后,必须输入密码才可以使用
192.168.190.11:6380> auth 123
OK
192.168.190.11:6380> ping
PONG
二:redis的数据类型使用
1.常用redis的公共命令
keys * 查看所有key
type key 查看key类型
expire key seconds 过期时间
ttl key 查看key过期剩余时间 -2表示key已经不存在了
persist 取消key的过期时间 -1表示key存在,没有过期时间
exists key 判断key存在 存在返回1 否则0
del keys 删除key 可以删除多个
dbsize 计算key的数量
192.168.190.11:6380> ping
PONG
192.168.190.11:6380> set name ivan
OK
192.168.190.11:6380> get name
"ivan"
192.168.190.11:6380> EXPIRE name 20
(integer) 1
192.168.190.11:6380> ttl name
(integer) 13
192.168.190.11:6380> ttl name
(integer) 5
192.168.190.11:6380> ttl name
(integer) -2
192.168.190.11:6380> set name xiaobai
OK
192.168.190.11:6380> EXPIRE name 30
(integer) 1
192.168.190.11:6380> ttl name
(integer) 19
192.168.190.11:6380> PERSIST name # 阻止过期
(integer) 1
192.168.190.11:6380> ttl name
(integer) -1 # 回复为-1 是没有过期时间
192.168.190.11:6380> get name
"xiaobai"
192.168.190.11:6380> EXISTS age
(integer) 0
192.168.190.11:6380> set age 18
OK
192.168.190.11:6380> DBSIZE
(integer) 2 #name age 两个key值
192.168.190.11:6380> EXISTS age
(integer) 1
192.168.190.11:6380> EXISTS name
(integer) 1
192.168.190.11:6380> del name age
(integer) 2
192.168.190.11:6380> keys *
(empty list or set)
string
string类型的操作
set 设置key
get 获取key
append 追加string
mset 设置多个键值对
mget 获取多个键值对
del 删除key
incr 递增+1
decr 递减-1
list类型,双向队列
dic1={
'k1':{"k2":"v2"}
}
dic1[k1][k2]
# string
# type name
192.168.190.11:6380> type name
none
# 不存在值为none
# set name
192.168.190.11:6380> set name ivan
OK
192.168.190.11:6380> type name
string
#通过set设置的就是string类型的key -value
# APPEND name
192.168.190.11:6380> APPEND name xiaohai
(integer) 11
192.168.190.11:6380> get name
"ivanxiaohai"
# mset mget
192.168.190.11:6380> mset name2 xiaohei name3 xiaohong
OK
192.168.190.11:6380> DBSIZE
(integer) 3
192.168.190.11:6380> mget name name2 name3
1) "ivanxiaohai"
2) "xiaohei"
3) "xiaohong"
# INCR 用作排行榜
# 每次加1 转为字符串
192.168.190.11:6380> set dizeng 0
OK
192.168.190.11:6380> get dizeng
"0"
192.168.190.11:6380> INCR dizeng
(integer) 1
192.168.190.11:6380> get dizeng
"1"
192.168.190.11:6380> INCR dizeng
(integer) 2
192.168.190.11:6380> get dizeng
"2"
list
# list
# LPUSH
192.168.190.11:6380> LPUSH dizeng xiaohuang xiaowang
(error) WRONGTYPE Operation against a key holding the wrong kind of value
# 列表的名字不能与上面的重复
192.168.190.11:6380> LPUSH paidui xiaohuang xiaobai
(integer) 2
192.168.190.11:6380> keys *
1) "name3"
2) "name2"
3) "paidui"
4) "name"
5) "dizeng"
# LRANGE
192.168.190.11:6380> LRANGE paidui 0 -1
1) "xiaobai"
2) "xiaohuang"
192.168.190.11:6380> LPUSH paidui xiaohei
(integer) 3
192.168.190.11:6380> LPUSH paidui xiaohei
(integer) 4
192.168.190.11:6380> LRANGE paidui 0 -1
1) "xiaohei"
2) "xiaohei"
3) "xiaobai"
4) "xiaohuang"
# LTRIM
192.168.190.11:6380> LTRIM paidui 0 1
OK
192.168.190.11:6380> LRANGE paidui 0 -1
1) "xiaohei"
2) "xiaohei"
# LPOP
192.168.190.11:6380> LPOP paidui
"xiaohei"
192.168.190.11:6380> LRANGE paidui 0 -1
1) "xiaohei"
sets
# sets
#1 sadd/srem 添加/删除 元素
192.168.190.11:6380> SADD home ivan sail
(integer) 2
192.168.190.11:6380> SMEMBERS home
1) "ivan"
2) "sail"
192.168.190.11:6380> SADD home2 xiaohai xiaobai
(integer) 2
192.168.190.11:6380> SMEMBERS home2
1) "xiaohai"
2) "xiaobai"
#2 sismember 判断是否为set的一个元素
# 判断在不在集合里
192.168.190.11:6380> SISMEMBER home xiaohai
(integer) 0
192.168.190.11:6380> SISMEMBER home2 xiaohai
(integer) 1
#3 sdiff 返回一个集合和其他集合的差异
# 查看两个集合的差异
# 显示写在前面的差异
192.168.190.11:6380> SDIFF home home2
1) "ivan"
2) "sail"
192.168.190.11:6380> SDIFF home2 home
1) "xiaohai"
2) "xiaobai"
192.168.190.11:6380> SADD home2 sail
(integer) 1
192.168.190.11:6380> SDIFF home home2
1) "ivan"
# 因为home 比 home2 多一个ivan
#4 sinter 返回几个集合的交集
192.168.190.11:6380> SINTER home home2
1) "sail"
# sunion 返回几个集合的并集
192.168.190.11:6380> SUNION home home2
1) "xiaohai"
2) "ivan"
3) "xiaobai"
4) "sail"
哈希数据结构
# 哈希数据结构
192.168.190.11:6380> HSET stu1 name ivan age 18
(integer) 2
192.168.190.11:6380> HGET stu1 name
"ivan"
192.168.190.11:6380> HGET stu1 age
"18"
192.168.190.11:6380> hmget stu1 name age
1) "ivan"
2) "18"
192.168.190.11:6380> HSETNX stu1 name ivan age 15
(error) ERR wrong number of arguments for 'hsetnx' command
192.168.190.11:6380> HSETNX stu2 name ivan age 15
(error) ERR wrong number of arguments for 'hsetnx' command
192.168.190.11:6380> HSETNX stu2 name ivan
(integer) 1
192.168.190.11:6380> HKEYS stu1
1) "name"
2) "age"
192.168.190.11:6380> HKEYS stu2
1) "name"
三:redis的发布订阅
[root@bogon ~]# redis-cli -p 6380 -h 192.168.190.11
192.168.190.11:6380> auth 123
OK
192.168.190.11:6380> PUBLISH python2 hello
(integer) 2
192.168.190.11:6380> PUBLISH python22 hello
(integer) 1




四:redis的持久化机制
# 问题:
# 断掉进程 查看之前的数据为空
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 12761 1 0 17:33 ? 00:00:00 redis-server 192.168.190.11:6380
root 12775 11284 0 17:33 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# pkill -9 redis
[root@bogon redis-4.0.10]# redis-server s20redis.conf
12777:C 04 Jul 17:34:01.018 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12777:C 04 Jul 17:34:01.018 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=12777, just started
12777:C 04 Jul 17:34:01.018 # Configuration loaded
[root@bogon redis-4.0.10]# redis-cli -p 6380 -h 192.168.190.11 -a 123
Warning: Using a password with '-a' option on the command line interface may not be safe.
192.168.190.11:6380> keys *
(empty list or set)
# 进程断线 数据丢失
解决问题的方式:
#redis的持久化机制
分为aof和rdb两种
一: rdb
环境准备
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 12778 1 0 17:34 ? 00:00:00 redis-server 192.168.190.11:6380
root 12847 11284 0 17:41 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# kill -9 12778
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 12858 11284 0 17:41 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# touch s20rdb.conf
[root@bogon redis-4.0.10]# vim s20rdb.conf
1.配置一个rdb的redis服务端
s20rdb.conf内容如下
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
bind 127.0.0.1
save 900 1
save 300 10
save 60 10000
# 参数详解
"""
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379 #定义持久化文件存储位置
dbfilename dbmp.rdb #rdb持久化文件
bind 10.0.0.10 127.0.0.1 #redis绑定地址
requirepass redhat #redis登录密码
save 900 1 #rdb机制 每900秒 有1个修改记录
save 300 10 #每300秒 10个修改记录
save 60 10000 #每60秒内 10000修改记录
# save 30 1 #每30秒自动save一次
# 这个是可以是自己更改的
# 注意不能改为1秒一次save 太占用资源了
"""
2.基于这个文件启动redis,支持rdb的数据库
redis-server s20rdb.conf
# 1
[root@bogon redis-4.0.10]# redis-server s20rdb.conf
"""
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 4
>>> 'logfile /data/6379/redis.log'
Can't open the log file: No such file or directory
"""
# 2
# 需要创建一个 /data/6379
[root@bogon redis-4.0.10]# mkdir -p /data/6379
[root@bogon redis-4.0.10]# ls
00-RELEASENOTES COPYING INSTALL README.md runtest-cluster s20redis.conf tests
BUGS deps Makefile redis.conf runtest-sentinel sentinel.conf utils
CONTRIBUTING dump.rdb MANIFESTO runtest s20rdb.conf src
[root@bogon redis-4.0.10]# redis-server s20rdb.conf
# 启动成功 现在就不会报错了
# 3
[root@bogon redis-4.0.10]# redis-server s20rdb.conf
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 12932 1 0 17:46 ? 00:00:00 redis-server 127.0.0.1:6379
root 12962 11284 0 17:49 pts/3 00:00:00 grep --color=auto redis
# 此时的进程就是修改文件里的 6379
[root@bogon redis-4.0.10]# cd /data/6379/
[root@bogon 6379]# ls
redis.log
3.登录redis设置key,然后手动触发save,生成rdb数据文件dbmp.rdb
[root@bogon 6379]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name ivan
OK
127.0.0.1:6379>
[root@bogon 6379]# ls
redis.log
[root@bogon 6379]# redis-cli
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379>
[root@bogon 6379]# ls
dbmp.rdb redis.log
# 只有save了 才会生成dbmp.rdb 文件
# 断掉进程 查看数据
[root@bogon 6379]# pkill -9 redis
[root@bogon 6379]# ps -ef | grep redis
root 13149 11284 0 18:03 pts/3 00:00:00 grep --color=auto redis
[root@bogon 6379]# redis-server /opt/redis-4.0.10/s20rdb.conf
[root@bogon 6379]# redis-cli
127.0.0.1:6379> keys *
1) "name"
2) "age"
# 查看 断线了进程 数据也在
# 查看 dbmp.rdb文件里具体内容
127.0.0.1:6379>
[root@bogon 6379]# ls
dbmp.rdb redis.log
[root@bogon 6379]# vim dbmp.rdb
REDIS0008ú redis-ver^F4.0.10ú
redis-bitsÀ@ú^EctimeÂïÎ^]]ú^Hused-memÂ^X^A^L^@ú^Laof-preambleÀ^@þ^@û^B^@^@^CageÀ^R^@^Dname^Divanÿ¡éE^D·¤X
~
二:aof
# 1 准备:
[root@bogon 6379]# cd /opt/redis-4.0.10/
[root@bogon redis-4.0.10]# touch s20aof.conf
[root@bogon redis-4.0.10]# ls
00-RELEASENOTES COPYING INSTALL README.md runtest-cluster s20rdb.conf src
BUGS deps Makefile redis.conf runtest-sentinel s20redis.conf tests
CONTRIBUTING dump.rdb MANIFESTO runtest s20aof.conf sentinel.conf utils
[root@bogon redis-4.0.10]# vim s20aof.conf
# 2 配置s20aof.conf
[root@bogon redis-4.0.10]# vim s20aof.conf
#2 s20aof.conf 配置如下
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
requirepass redhat
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
appendonly yes
appendfsync everysec
# 3
# 为了不影响实践效果 断掉之前的进程和 6379里所有的文件
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 13169 1 0 18:04 ? 00:00:00 redis-server 127.0.0.1:6379
root 13382 11284 0 18:24 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# pkill -9 redis
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 13393 11284 0 18:25 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# cd /data/6379/
[root@bogon 6379]# ls
dbmp.rdb redis.log
[root@bogon 6379]# rm -rf *
[root@bogon 6379]# ls
# 4 启动配置文件
[root@bogon 6379]# cd - # 回到上一次的目录 启动配置文件
/opt/redis-4.0.10
[root@bogon redis-4.0.10]# redis-server s20aof.conf
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 13437 1 0 18:29 ? 00:00:00 redis-server *:6379
root 13442 11284 0 18:29 pts/3 00:00:00 grep --color=auto redis
# 回到6379 查看启动配置文件 自动加载出来的文件
[root@bogon redis-4.0.10]# cd -
/data/6379
[root@bogon 6379]# ls
appendonly.aof redis.log
# 5 实验开始
#
# 窗口1
[root@bogon ~]# redis-cli
127.0.0.1:6379> auth 123
(error) ERR Client sent AUTH, but no password is set
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set age 18
OK
# 窗口2
[root@bogon 6379]# tail -f appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$3
age
$2
18
# 6 查看数据
# 查看到数据还在
[root@bogon 6379]# redis-server /opt/redis-4.0.10/s20aof.conf
[root@bogon 6379]# redis-cli
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379>
[root@bogon 6379]# ls
appendonly.aof redis.log
[root@bogon 6379]# vim appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$3
age
$2
18
~
# 测试优先级
aof 的级别比 rdb高
五:在不重启redis的情况下,切换rdb中的数据,到aof中的操作
#在不重启redis的情况下,切换rdb中的数据,到aof中的操作
环境准备
1.配置一个rdb的redis服务端
s20rdb.conf内容如下
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
bind 127.0.0.1
save 900 1
save 300 10
save 60 10000
[root@bogon 6379]# cd -
/opt/redis-4.0.10
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 13437 1 0 18:29 ? 00:00:02 redis-server *:6379
root 14005 11284 0 19:21 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# kill -9 13437
[root@bogon redis-4.0.10]# !ps
ps -ef | grep redis
root 14015 11284 0 19:22 pts/3 00:00:00 grep --color=auto redis
[root@bogon redis-4.0.10]# ls
00-RELEASENOTES COPYING INSTALL README.md runtest-cluster s20rdb.conf src
BUGS deps Makefile redis.conf runtest-sentinel s20redis.conf tests
CONTRIBUTING dump.rdb MANIFESTO runtest s20aof.conf sentinel.conf utils
[root@bogon redis-4.0.10]# vim s20rdb.conf
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
bind 127.0.0.1
save 900 1
save 300 10
save 60 10000
# 删除6379下的文件
[root@bogon redis-4.0.10]# cd -
/data/6379
[root@bogon 6379]# ls
appendonly.aof redis.log
[root@bogon 6379]# rm -rf *
[root@bogon 6379]# ls
#查看文件已经被删除
2.基于这个文件启动redis,支持rdb的数据库
redis-server s20rdb.conf
[root@bogon 6379]# cd -
/opt/redis-4.0.10
[root@bogon redis-4.0.10]# redis-server s20rdb.conf
[root@bogon redis-4.0.10]# redis-cli
127.0.0.1:6379> set name sail
OK
127.0.0.1:6379> set addr shanghai
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> keys *
1) "addr"
2) "age"
3) "name"
127.0.0.1:6379> save
OK
# 手动保存
# 查看已经有文件
[root@bogon redis-4.0.10]# ls /data/6379/
dbmp.rdb redis.log
3.登录redis设置key,然后手动触发save,生成rdb数据文件
4.通过登录redis,两条命令,切换为aof持久化方式
[root@bogon redis-4.0.10]# redis-cli
127.0.0.1:6379> CONFIG set appendonly yes
OK
127.0.0.1:6379> CONFIG SET save ""
OK
[root@bogon redis-4.0.10]# ls /data/6379/
appendonly.aof dbmp.rdb redis.log
# 出现了appendonly.aof
# 查看数据过来了
[root@bogon redis-4.0.10]# vim /data/6379/appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$4
addr
$8
shanghai
*3
$3
SET
$3
age
$2
18
*3
$3
SET
$4
name
$4
sail
5.第4步的操作,仅仅是临时生效,还得修改配置文件,保证下次重启,也得用aof进行持久化
# 原来的配置文件信息
[root@bogon redis-4.0.10]# vim s20rdb.conf
"""
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
bind 127.0.0.1
save 900 1
save 300 10
save 60 10000
"""
# 修改完的配置文件信息
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
bind 127.0.0.1
appendonly yes
appendfsync always
[root@bogon redis-4.0.10]# vim s20rdb.conf
# 配置完文件信息
# 查看数据信息
[root@bogon redis-4.0.10]# redis-cli
127.0.0.1:6379> keys *
1) "addr"
2) "age"
3) "name"
127.0.0.1:6379>
# 开始 断掉进程 重新启动配置文件
[root@bogon redis-4.0.10]# pkill -9 redis
[root@bogon redis-4.0.10]# redis-server s20rdb.conf
[root@bogon redis-4.0.10]# redis-cli
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "addr"
127.0.0.1:6379>
[root@bogon redis-4.0.10]# cd -
/data/6379
[root@bogon 6379]# ls
appendonly.aof dbmp.rdb redis.log
# 查看appendonly.aof 里的信息
[root@bogon 6379]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$4
addr
$8
shanghai
*3
$3
SET
$3
age
$2
18
*3
$3
SET
$4
name
$4
sail
#在开个窗口 登录redis
[root@bogon ~]# redis-cli
127.0.0.1:6379>
127.0.0.1:6379> set name123 ican
OK
# 动态的查看到 数据 变化了 记录到了appendonly.aof
[root@bogon 6379]# tail -f appendonly.aof
age
$2
18
*3
$3
SET
$4
name
$4
sail
*2
$6
SELECT
$1
0
*3
$3
set
$7
name123
$4
ican
6. 扩展知识 redis事件机制
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
redis是单线程的,由c编写
daemonize yes
port 6379
logfile "/data/6379/redis.log"
dir /data/6379
dbfilename dump.rdb
bind 127.0.0.1
save 30 1
六:redis的主从复制
一: 详情了解
1.redis和mysql都是支持多实例功能,基于配置文件区分,就是一个数据库单独的实例
# 具体操作
# 原本的myredis.conf文件信息
[root@bogon redis-4.0.10]# touch myredis.conf
[root@bogon redis-4.0.10]# vim myredis.conf
daemonize yes
port 6379
logfile "/data/6379/redis.log"
dir /data/6379
dbfilename dump.rdb
bind 127.0.0.1
save 30 1
[root@bogon redis-4.0.10]# sed 's/6379/6380/g' myredis.conf > 6380-redis.conf
# 对myredis.conf文件进行替换 替换的结果写入到 6380-redis.conf 中
# 查看6380-redis.conf的信息
[root@bogon redis-4.0.10]# cat 6380-redis.conf
daemonize yes
port 6380
logfile "/data/6380/redis.log"
dir /data/6380
dbfilename dump.rdb
bind 127.0.0.1
save 30 1
2.分别启动2个redis实例
1061 redis-server redis-6379.conf
1062 redis-server redis-6380.conf
# 创建一个6380的文件夹
[root@bogon redis-4.0.10]# mkdir -p /data/6380
#查看进程信息 现在一个redis进程也没有
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 14796 11284 0 20:22 pts/3 00:00:00 grep --color=auto redis
# 运行 myredis.conf 127.0.0.1:6379
[root@bogon redis-4.0.10]# redis-server myredis.conf
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 14800 1 0 20:22 ? 00:00:00 redis-server 127.0.0.1:6379
root 14805 11284 0 20:22 pts/3 00:00:00 grep --color=auto redis
# 运行 6380-redis.conf 127.0.0.1:6380
[root@bogon redis-4.0.10]# redis-server 6380-redis.conf
[root@bogon redis-4.0.10]# ps -ef | grep redis
root 14800 1 0 20:22 ? 00:00:00 redis-server 127.0.0.1:6379
root 14817 1 0 20:22 ? 00:00:00 redis-server 127.0.0.1:6380
root 14822 11284 0 20:22 pts/3 00:00:00 grep --color=auto redis
# 现在是两个进程 进程之间是隔离的
# 6379的 数据库信息
[root@bogon redis-4.0.10]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name ivan
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set addr shanghai
OK
127.0.0.1:6379> keys *
1) "age"
2) "addr"
3) "name"
127.0.0.1:6379>
# 6380的 数据库信息
[root@bogon ~]# redis-cli -p 6380
127.0.0.1:6380> keys *
(empty list or set)
# 此时 6380 是空的
# 基于配置文集在一台机子上运行多个数据库
# 两个数据库不干扰 可以给不同的项目用
二:开始实践
1 环境准备,一个6379的redis(master),和一个6380的redis(slave)
分别准备2个配置文件,内容如下
redis-6379.conf
port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dbfilename dump.rdb
dir /data/6379
protected-mode no
redis-6380.conf (从)
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
slaveof 127.0.0.1 6379
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
slaveof 127.0.0.1 6379
# 操作详情
# 为了避免干扰 在opt里创建smredis
[root@bogon redis-4.0.10]# cd /opt/
[root@bogon opt]# mkdir smredis
[root@bogon opt]# cd smredis/
[root@bogon smredis]# ls
[root@bogon smredis]# touch redis-6380.conf
[root@bogon smredis]# vim redis-6380.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
# 6380 里有信息了 直接删除
[root@bogon smredis]# ls /data/6380/redis.log
/data/6380/redis.log
[root@bogon smredis]# rm -rf /data/6380/*
# 在 smredis 生成 redis-6379.conf
[root@bogon smredis]# sed 's/6380/6379/g' redis-6380.conf > redis-6379.conf
[root@bogon smredis]# ls
redis-6379.conf redis-6380.conf
# 现在 smredis 生成了 redis-6379.conf redis-6380.conf 两个文件
# 杀死进程
[root@bogon smredis]# ps -ef | grep redis
root 14800 1 0 20:22 ? 00:00:01 redis-server 127.0.0.1:6379
root 14817 1 0 20:22 ? 00:00:01 redis-server 127.0.0.1:6380
root 14958 14901 0 20:31 pts/0 00:00:00 redis-cli -p 6380
root 15197 11284 0 20:55 pts/3 00:00:00 grep --color=auto redis
[root@bogon smredis]# pkill -9 redis
[root@bogon smredis]# ps -ef | grep redis
root 15200 11284 0 20:55 pts/3 00:00:00 grep --color=auto redis
# 查看刚才生成的 redis-6379.conf 信息
[root@bogon smredis]# cat redis-6379.conf
port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dbfilename dump.rdb
dir /data/6379
protected-mode no
# 清空 /data/6379/* 所有的内容
[root@bogon smredis]# rm -rf /data/6379/*
# 在 redis-6380.conf 文件中 加slaveof
[root@bogon smredis]# vim redis-6380.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
slaveof 127.0.0.1 6379
2.分别启动2个redis实例
1061 redis-server redis-6379.conf
1062 redis-server redis-6380.conf
[root@bogon smredis]# redis-server redis-6379.conf
[root@bogon smredis]# redis-server redis-6380.conf
[root@bogon smredis]# ps -ef | grep redis
root 15361 1 0 21:01 ? 00:00:01 redis-server *:6379
root 15795 1 0 21:29 ? 00:00:00 redis-server *:6380
root 15801 15646 0 21:29 pts/0 00:00:00 grep --color=auto redis
3.登录数据库,查看两人之间的关系
登录6379数据库,输入如下命令
127.0.0.1:6379> info replication
[root@bogon smredis]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=196,lag=0
master_replid:bd80df540e6a5e4a235d52db0b36184eb8f93b6f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196
6380数据库查看如下关系
[root@s20 smredis]# redis-cli -p 6380 info replication
[root@bogon ~]# redis-cli -p 6380 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:336
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:bd80df540e6a5e4a235d52db0b36184eb8f93b6f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:336
4.数据读写查看
在6379中是可以读写的
# 窗口1 6379
redis-cli -p 6379 set name5 haoxiangxiake
[root@bogon smredis]# redis-cli -p 6379 set name5 zuoyetaiduo
OK
[root@bogon smredis]# redis-cli
127.0.0.1:6379> keys *
1) "name5"
# 窗口2 6380
redis-cli -p 6380 get name5
[root@bogon ~]# redis-cli -p 6380 get name5
"zuoyetaiduo"
[root@bogon ~]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "name5"
127.0.0.1:6380> set name6 buxiangxiezuoye
(error) READONLY You can't write against a read only slave.
# 只能读 不能写
5.主从复制故障恢复
# 在添加一个6381数据库 也是作为6379 的从数据库
# 在/data里创建一个 6381 文件
[root@bogon ~]# cd /data
[root@bogon data]# ls
6379 6380
[root@bogon data]# mkdir 6381
[root@bogon data]# ls
6379 6380 6381
# 创建一个 redis-6381.conf 文件
[root@bogon smredis]# sed 's/6380/6381/g' redis-6380.conf > redis-6381.conf
[root@bogon smredis]# ls
! redis-6379.conf redis-6380.conf redis-6381.conf
# 配置文件信息
[root@bogon smredis]# vim redis-6381.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
slaveof 127.0.0.1 6379
# 启动 redis-6381.conf
[root@bogon smredis]# redis-server redis-6381.conf
[root@bogon smredis]# redis-cli -p 6381
127.0.0.1:6381> keys *
1) "name1"
2) "name5"
3) "name2"
# 6379是主库 6380 6381 是从库
从库挂了无所谓
主库挂了得立即恢复主库,或者将从库切换为主库,继续工作
-.实验步骤
1.分别启动 6379 6380 6381 三个数据库实例,建立好主从关系
2.杀死6379主库,此时6380 6381 群龙无首
[root@bogon smredis]# ps -ef |grep redis
root 15361 1 0 21:01 ? 00:00:02 redis-server *:6379
root 15795 1 0 21:29 ? 00:00:00 redis-server *:6380
root 16106 1 0 21:45 ? 00:00:00 redis-server *:6381
root 16128 15841 0 21:47 pts/3 00:00:00 redis-cli -p 6381
root 16160 16045 0 21:50 pts/4 00:00:00 redis-cli -p 6380
root 16200 15646 0 21:53 pts/0 00:00:00 grep --color=auto redis
[root@bogon smredis]# kill -9 15361
[root@bogon smredis]# ps -ef |grep redis
root 15795 1 0 21:29 ? 00:00:01 redis-server *:6380
root 16106 1 0 21:45 ? 00:00:00 redis-server *:6381
root 16128 15841 0 21:47 pts/3 00:00:00 redis-cli -p 6381
root 16160 16045 0 21:50 pts/4 00:00:00 redis-cli -p 6380
root 16219 15646 0 21:55 pts/0 00:00:00 grep --color=auto redis
3.选择让6381为新的主库,就要去除6381的从的身份
redis-cli -p 6381 slaveof no one
#查看此时6381的身份
redis-cli -p 6381 info replication
[root@bogon smredis]# redis-cli -p 6381 slaveof no one
OK
[root@bogon smredis]# redis-cli -p 6381 info replication
# Replication
role:master # 此时 6381为主的了
connected_slaves:0
master_replid:5b91f338a06af956a1050ca0deb5e3ba48925849
master_replid2:bd80df540e6a5e4a235d52db0b36184eb8f93b6f
master_repl_offset:2313
second_repl_offset:2314
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1460
repl_backlog_histlen:854
4.此时将6380的主人改为6381
redis-cli -p 6380 slaveof 127.0.0.1 6381
# 先创建一个数据 ,这样好看出数据的变化
[root@bogon smredis]# redis-cli -p 6381
127.0.0.1:6381> set name zuoyexiebuwanle
OK
[root@bogon smredis]# redis-cli -p 6380 slaveof 127.0.0.1 6381
OK
[root@bogon smredis]# redis-cli -p 6380 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381 # 主库为6381了
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:2507
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5b91f338a06af956a1050ca0deb5e3ba48925849
master_replid2:bd80df540e6a5e4a235d52db0b36184eb8f93b6f
master_repl_offset:2507
second_repl_offset:2314
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2507
# 查看到 刚才创建的那一条数据了
[root@bogon smredis]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "name"
2) "name5"
3) "name2"
4) "name1"
七:redis的哨兵
redis的哨兵,自动的主从故障切换
配置步骤
1.环境准备,准备3个redis数据库实例,分别是 6379 6380 6381
redis-6379.conf redis-6380.conf redis-6381.conf
[root@bogon smredis]# cd ..
[root@bogon opt]# mkdir sbredis
[root@bogon opt]# cd sbredis/
[root@bogon sbredis]# vim redis-6379.conf
port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/var/redis/data/6379"
[root@bogon sbredis]# vim redis-6380.conf
port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/6380"
slaveof 127.0.0.1 6379
[root@bogon sbredis]# vim redis-6381.conf
port 6381
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/6381"
slaveof 127.0.0.1 6379
# 创建文件
[root@bogon sbredis]# mkdir -p /var/redis/data/{6379,6380,6381}
# 杀死进程
[root@bogon sbredis]# pkill -9 redis
[root@bogon sbredis]# ps -ef | grep redis
root 16528 15646 0 22:26 pts/0 00:00:00 grep --color=auto redis
2.分别启动三个redis数据库实例
[root@bogon sbredis]# redis-server redis-6379.conf
[root@bogon sbredis]# redis-server redis-6380.conf
[root@bogon sbredis]# redis-server redis-6381.conf
[root@bogon sbredis]# ps -ef | grep redis
root 16538 1 0 22:27 ? 00:00:00 redis-server *:6379
root 16543 1 0 22:27 ? 00:00:00 redis-server *:6380
root 16549 1 0 22:27 ? 00:00:00 redis-server *:6381
root 16555 15646 0 22:27 pts/0 00:00:00 grep --color=auto redis
# 查看三个文件的信息 看是否错误
[root@bogon sbredis]# redis-cli -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=84,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=84,lag=1
master_replid:c2d32464eed5e8e4219067530abe0b5fe69341fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
[root@bogon sbredis]# redis-cli -p 6380 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:98
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c2d32464eed5e8e4219067530abe0b5fe69341fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
[root@bogon sbredis]# redis-cli -p 6381 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:98
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c2d32464eed5e8e4219067530abe0b5fe69341fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:84
# 主从信息 操作完毕
3.准备三个redis-sentinel哨兵的配置文件
redis-sentinel-26379.conf
port 26379
dir /var/redis/data/26379
logfile "26379.log"
// 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
// mymaster是主节点的别名
sentinel monitor s20master 127.0.0.1 6379 2
// 哨兵检测着 s20master
//每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds s20master 30000
//当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs s20master 1
//故障转移超时时间为180000毫秒
sentinel failover-timeout s20master 180000
//让哨兵在后台运行
daemonize yes
[root@bogon sbredis]# ls
6379.log 6380.log redis-6379.conf redis-6380.conf redis-6381.conf
[root@bogon sbredis]# touch redis-26379.conf
[root@bogon sbredis]# vim redis-26379.conf
port 26379
dir /var/redis/data/26379
logfile "26379.log"
sentinel monitor s20master 127.0.0.1 6379 2
sentinel down-after-milliseconds s20master 30000
sentinel parallel-syncs s20master 1
sentinel failover-timeout s20master 180000
daemonize yes
# daemonize yes 一定要加,让哨兵正在后端运行
#如下26380和26381的配置文件,仅仅是端口的不同,可以快速生成
redis-sentinel-26380.conf
redis-sentinel-26381.conf
#生成命令如下
1119 sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
1121 sed "s/26379/26381/g" redis-26379.conf > redis-26381.conf
[root@bogon sbredis]# sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
[root@bogon sbredis]# sed "s/26379/26381/g" redis-26379.conf > redis-26381.conf
[root@bogon sbredis]# ls
6379.log redis-26379.conf redis-26381.conf redis-6380.conf
6380.log redis-26380.conf redis-6379.conf redis-6381.conf
# 查看一下redis-26380.conf 信息
[root@bogon sbredis]# cat redis-26380.conf
port 26380
dir /var/redis/data/26380
logfile "26380.log"
sentinel monitor s20master 127.0.0.1 6379 2
sentinel down-after-milliseconds s20master 30000
sentinel parallel-syncs s20master 1
sentinel failover-timeout s20master 180000
daemonize yes
# daemonize yes 一定要加,让哨兵正在后端运行
# 查看一下redis-26381.conf 信息
[root@bogon sbredis]# cat redis-26381.conf
port 26381
dir /var/redis/data/26381
logfile "26381.log"
sentinel monitor s20master 127.0.0.1 6379 2
sentinel down-after-milliseconds s20master 30000
sentinel parallel-syncs s20master 1
sentinel failover-timeout s20master 180000
daemonize yes
# daemonize yes 一定要加,让哨兵正在后端运行
4.分别运行三个哨兵进程
(保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化,这是个坑!!!!)
#创建哨兵的数据文件夹
[root@bogon sbredis]# mkdir -p /var/redis/data/26379
[root@bogon sbredis]# mkdir -p /var/redis/data/26380
[root@bogon sbredis]# mkdir -p /var/redis/data/26381
(保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化,这是个坑!!!!)
(保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化,这是个坑!!!!)
(保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化,这是个坑!!!!)
# daemonize yes 一定要加,让哨兵正在后端运行
# daemonize yes 一定要加,让哨兵正在后端运行
# daemonize yes 一定要加,让哨兵正在后端运行
#分别启动三个哨兵
1134 redis-sentinel redis-26379.conf
1137 redis-sentinel redis-26380.conf
1138 redis-sentinel redis-26381.conf
[root@bogon sbredis]# ps -ef | grep redis
root 16538 1 0 22:27 ? 00:00:00 redis-server *:6379
root 16543 1 0 22:27 ? 00:00:00 redis-server *:6380
root 16549 1 0 22:27 ? 00:00:00 redis-server *:6381
root 16755 15646 0 22:45 pts/0 00:00:00 grep --color=auto redis
[root@bogon sbredis]# redis-sentinel redis-26379.conf
[root@bogon sbredis]# redis-sentinel redis-26380.conf
[root@bogon sbredis]# redis-sentinel redis-26381.conf
[root@bogon sbredis]# ps -ef | grep redis
root 16538 1 0 22:27 ? 00:00:00 redis-server *:6379
root 16543 1 0 22:27 ? 00:00:00 redis-server *:6380
root 16549 1 0 22:27 ? 00:00:00 redis-server *:6381
root 16765 1 0 22:45 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 16770 1 0 22:46 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 16775 1 0 22:46 ? 00:00:00 redis-sentinel *:26381 [sentinel]
root 16780 15646 0 22:46 pts/0 00:00:00 grep --color=auto redis
# 三个哨兵 和 三个数据库 已经启动
5.检查redis的哨兵状态
redis-cli -p 26379 info sentinel
redis-cli -p 26380 info sentinel
redis-cli -p 26381 info sentinel
[root@bogon sbredis]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
[root@bogon sbredis]# redis-cli -p 26380 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
[root@bogon sbredis]# redis-cli -p 26381 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
#查看到如下参数,哨兵就正确了
master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
6.杀死主库,检查主从状态,是否会切换
[root@bogon sbredis]# ps -ef | grep redis
root 16538 1 0 22:27 ? 00:00:01 redis-server *:6379
root 16543 1 0 22:27 ? 00:00:01 redis-server *:6380
root 16549 1 0 22:27 ? 00:00:00 redis-server *:6381
root 16765 1 0 22:45 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 16770 1 0 22:46 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 16775 1 0 22:46 ? 00:00:00 redis-sentinel *:26381 [sentinel]
root 16832 15646 0 22:51 pts/0 00:00:00 grep --color=auto redis
[root@bogon sbredis]# kill -9 16538
[root@bogon sbredis]# ps -ef | grep redis
root 16543 1 0 22:27 ? 00:00:01 redis-server *:6380
root 16549 1 0 22:27 ? 00:00:01 redis-server *:6381
root 16765 1 0 22:45 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 16770 1 0 22:46 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 16775 1 0 22:46 ? 00:00:00 redis-sentinel *:26381 [sentinel]
root 16843 15646 0 22:52 pts/0 00:00:00 grep --color=auto redis
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication
[root@bogon sbredis]# redis-cli -p 6381 info replication
# Replication
role:master # 变为主的,证明操作成功
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=93350,lag=0
master_replid:a19874bf7196c339ccde64bc1b6825410b9c9450
master_replid2:c2d32464eed5e8e4219067530abe0b5fe69341fd
master_repl_offset:93350
second_repl_offset:78222
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:93336
[root@bogon sbredis]# redis-cli -p 6380 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:98082
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a19874bf7196c339ccde64bc1b6825410b9c9450
master_replid2:c2d32464eed5e8e4219067530abe0b5fe69341fd
master_repl_offset:98082
second_repl_offset:78222
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98082

浙公网安备 33010602011771号