NOSQL——Redis
什么是NOSQL
NOSQL(Not Only SQL):非关系型数据库;
包括:
Redis:基于内存的KV结构的数据;
MongoDB:文档型数据库,擅长存储JSON(BSON)数据;
HBase:列存储数据库,大数据存储;
特点:
存储半结构化、非结构化数据;
海量存储(通过分布式);
高并发场景;
Redis
Redis(Remote Dictionary Server)远程字典服务。
内存型数据库:数据存储到内存中的,读写速快(GB级);
支持高并发,查询11万次/秒,写入8万次/秒;
支持持久化(将数据定期存储到磁盘中);
常用于缓存,存储热点数据、临时数据;通过加缓存,可以提高并发,减少成本。
Redis常用数据类型
字符串
哈希(hash)
集合
列表
有序集合
缓存失败问题
缓存击穿:一个热点的key失效,直接访问到数据库,导致数据访问量激增。
加锁,从数据库中读取写入缓存后,返回给用户;
通过异步不断刷新过期时间;
缓存穿透:大量用户访问不存在的数据,导致请求直接访问数据库,占用数据库大量的资源;
缓存空值/默认值
布隆过滤器做一层过滤
缓存雪崩:最严重的缓存问题,缓存自身崩溃或者有大量的key都过去,后端数据库压力剧增,或直接崩溃。
缓存增加备份、高可用;
缓存集群;
过期时间设置均匀一些;
多级缓存;
配置项名称 | 配置项值范围 | 说明 |
daemonize | yes、no | yes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行 |
port | 指定 Redis 监听端口,默认端口为 6379 | |
bind | 绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 | |
protected-mode | yes、no | 保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no |
loglevel | debug、verbose、notice、warning | 日志级别,默认为 notice |
databases | 16 | 设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到 |
rdbcompression | yes、no | 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变得巨大 |
dbfilename | dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
dir | 指定本地数据库存放目录 | |
requirepass | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH命令提供密码,默认关闭 | |
maxclients | 0 | 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息 |
maxmemory | xxx | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。配置项值范围列里XXX为数值 |
安装Redis操作步骤
手动安装Redis
1.指定Redis存放位置
cd /usr/local/src/
wget http://download.redis.io/releases/redis-6.2.14.tar.gz
wget https://download.redis.io/releases/redis-6.2.14.tar.gz
2.解压
tar -xvf redis-6.2.14.tar.gz
3.安装依赖
(centos7)
yum clean all
yum makecache fast
yum -y install gcc gcc-c++ make tcl
(可选安装) 安装新版本gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
source /opt/rh/devtoolset-9/enable
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
(ubuntu)
sudo apt install build-essential gcc g++ make tcl -y
4.查看GCC版本
gcc --version
5. Redis的编译安装和配置文件处理
cd /usr/local/src/redis-6.2.14
make && make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/{etc,logs,data}
egrep -v "^$|^#" redis.conf > /usr/local/redis/etc/redis.conf
6.启动服务
cd /usr/local/redis/bin
./redis-server
7.进入Redis
不要关,在xshell中再开一个,连接登录
cd /usr/local/redis/bin
./redis-cli
快速安装Redis
1.提前配好yum源或apt源
cd /etc/yum.repos.d/
2.编辑安装脚本
vim redis_install.sh
#!/bin/bash
# 检查系统类型
if [ -f /etc/os-release ]; then
. /etc/os-release
OS_NAME=$NAME
OS_VERSION=$VERSION_ID
else
echo "无法识别操作系统"
exit 1
fi
echo "当前操作系统: $OS_NAME $OS_VERSION"
# 根据操作系统选择安装命令
if [[ "$OS_NAME" == "Ubuntu" ]]; then
# 更新包列表并安装依赖
apt update
apt -y install build-essential tcl wget
elif [[ "$OS_NAME" == "CentOS Linux" ]] || [[ "$OS_NAME" == "Red Hat" ]]; then
yum -y install gcc gcc-c++ make tcl wget
else
echo "不支持的操作系统"
exit 1
fi
cd /usr/local/src
# 下载Redis源码包
if [ -f redis-6.2.14.tar.gz ]; then
echo "redis-6.2.14.tar.gz已存在不需要下载!"
else
# wget http://download.redis.io/releases/redis-6.2.14.tar.gz
wget http://192.168.56.200/Software/redis-6.2.14.tar.gz
fi
# 解压源码包
tar -xvf redis-6.2.14.tar.gz
# 进入解压后的目录
cd redis-6.2.14
# Redis编译安装
make
make PREFIX=/usr/local/redis install
# Redis基础配置
mkdir -p /usr/local/redis/{etc,logs,data}
egrep -v "^$|^#" redis.conf > /usr/local/redis/etc/redis.conf
sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /usr/local/redis/etc/redis.conf
sed -i "s/protected-mode yes/protected-mode no/g" /usr/local/redis/etc/redis.conf
sed -i "s/daemonize no/daemonize yes/g" /usr/local/redis/etc/redis.conf
sed -i "s/pidfile \/var\/run\/redis_6379.pid/pidfile \/usr\/local\/redis\/redis.pid/g" /usr/local/redis/etc/redis.conf
sed -i "s/dir \.\//dir \/usr\/local\/redis\/data/g" /usr/local/redis/etc/redis.conf
sed -i "s/logfile \"\"/logfile \"\/usr\/local\/redis\/logs\/redis.log\"/g" /usr/local/redis/etc/redis.conf
# 将配置文件复制到/etc下
mkdir -p /etc/redis/
cp /usr/local/redis/etc/redis.conf /etc/redis/
# 启动redis
/usr/local/redis/bin/redis-server /etc/redis/redis.conf
# 更新PATH环境变量
echo 'export PATH=$PATH:/usr/local/redis/bin/' >> /etc/profile
. /etc/profile
# 查看redis监听端口
echo "查看redis监听端口:"
netstat -tanp | grep redis
3.执行脚本
bash redis_install.sh
4.编辑Redis启动、关机、重启的脚步
vim redis.sh
#!/bin/bash
REDIS_PATH="/usr/local/redis"
REDIS_CONF="/etc/redis/redis.conf"
PID_FILE="$REDIS_PATH/redis.pid"
start() {
if [ -f $PID_FILE ]; then
echo "Redis is already running."
exit 1
fi
echo "Starting Redis..."
$REDIS_PATH/bin/redis-server $REDIS_CONF &
echo $! > $PID_FILE
echo "Redis started."
}
stop() {
if [ ! -f $PID_FILE ]; then
echo "Redis is not running."
exit 1
fi
echo "Stopping Redis..."
kill $(cat $PID_FILE)
rm $PID_FILE
echo "Redis stopped."
}
restart() {
stop
sleep 1
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
5.赋予可执行权限
chmod +x redis.sh
习惯上会把启动脚本放置在/etc/init.d/目录下,方便使用
cp redis.sh /etc/init.d/redis
6.启动Redis
./redis.sh start # 启动Redis服务器
./redis.sh stop # 停止Redis服务器
./redis.sh restart # 重启Redis服务器
7.进入Redis
cd /usr/local/redis/bin
./redis-cli
#若不能再任意位置进入Redis
把 redis-cli 所在目录添加到 PATH(替换成你的实际路径!)
export PATH=$PATH:/usr/local/redis/bin
验证是否添加成功(会输出包含 /root/redis/bin 的路径)
echo $PATH
此时在任意目录执行 redis-cli 即可
redis-cli
若ubuntu安装有问题
显示问题:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 13996(unattended-upgr)持有
1.终止 unattended-upgr 进程
sudo kill 13996
2.确认进程已结束
ps -ef | grep unattended-upgr
3.移除锁定文件(如果仍有问题)
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
4.重新配置 dpkg
sudo dpkg --configure -a
8.其余命令
(1)查看端口(Redis默认端口6379)
netstat -lnutp|grep 6379
(2)查看是否启动
ps -ef|grep redis或./bin/redis-cli ping
前台启动
./bin/redis-server
后台启动
vim /usr/local/redis/etc/redis.conf
daemonize yes #前台启动,改后台启动
指定配置文件启动
./bin/redis-server ./etc/redis.conf
(3)关闭
./bin/redis-cli shutdown
返回一主两从三哨兵:实验:一主两从三哨兵
返回Redis集群:Redis集群操作步骤
Redis基础命令
keys * #查看key
keys *ng* #查看带有“ng”的key
keys zhang?? #查看前面为“zahng”的key
keys zhan[ng]si #查看为zhangsi或zhansi的key
get keyi #查看i号库的内容
1.连接命令
ping #测试连接是否生效
echo m #打印特定信息m
select i #切换到i号数据库,默认是0号数据库
config set requirepass 密码 #设置密码
config set requirepass “” #清空密码
2.键命令(i指库号)
set keyi value #将字符串值value关联到key
get keyi #关联字符串值,如果key不存在那么返回特殊值nil
del keyi[keyi1 keyi2… keyi3] #删除一个或多个key,返回删除key 的数量
exists keyi #检查key是否存在,存在返回1,不存在返回0
type keyi #返回 key 所储存的值的类型。none (key不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)
expire keyi seconds #设置key的生存时间,单位为秒。设置成功返回1,其他返回0
pexpire keyi mseconds #以毫秒设置生存时间。成功返回1,其他返回0
ttl keyi #查看有效时间(单位:秒)。key不存在返回-2,key存在但没有设置剩余生存时间返回-1
pttl keyi #查看有效时间(单位:毫秒)。key不存在返回-2,key存在但没有设置剩余生存时间返回-1
exists keyi #验证是否存在
3.通配符
* 表示多个字符
? 表示一个字符
[] 表示只能是[]里面的字符
\ 表示指定特殊字符
#将当前数据库的key移动到给定的数据库db当中
move key db 例如:move zhangsan 1
移动成功返回1,失败则返回0
key不存在时,移动失败
key移动到1库时,1库中出现同名的key,移动失败
#从当前数据库中随机返回(不删除)一个 key
random key
当数据库不为空时,返回一个 key
当数据库为空时,返回 nil
#将key改名为newkey
rename key newkey
改名成功时提示 OK,失败时候返回一个错误
当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
当 newkey 已经存在时, RENAME 命令将覆盖旧值
#当且仅当 newkey 不存在时,将 key 改名为 newkey
renamenx key newkey 例如:renamenx zhangsi zhangwu
修改成功时,返回 1 。如果 newkey 已经存在,返回 0
Redis数据类型
Redis常用数据类型.xmind
字符串命令:set key value [EX seconds] [PX milliseconds] [NX|XX]
EX:设置键的过期时间为 second秒 例如:set key1 hello EX 1000
PX:设置键的过期时间为 millisecond毫秒 例如:set key2 hello PX 100000
NX:只在键不存在时,才对键进行设置操作 例如:set key3 hello NX
XX:只在键已经存在时,才对键进行设置操作 例如: set key4 helloworld XX
数据结构 | 特点 | 典型使用场景 | 示例 |
String(字符串) | 存储文本或二进制数据,最大512MB;支持自增/自减、拼接等操作 | 1.缓存简单键值对(如用户信息、商品详情) 2.计数器(如文章阅读量、接口调用次数) 3.分布式锁(通过SET NX实现) | SET user:1001 "name:张三,age:25" INCR article:views:2001 |
Hash(哈希) | 存储字段-值对的集合,适合表示对象;可单独操作字段,节省空间 | 1.缓存对象型数据(如用户资料、商品属性) 2.存储结构化数据(如订单详情中的多个字段) | HSET user:1001 name 张三 age 25 HGET user:1001 name |
List(列表) | 有序字符串集合,支持两端插入/删除,可按索引访问;底层是双向链表或压缩列表 | 1.消息队列(如异步任务队列、实时通知) 2.最新列表(如朋友圈动态、新闻Feed流) 3.排行榜(临时排序场景) | LPUSH news:feed "新闻A" LRANGE news:feed 0 9(获取前10条) |
Set(集合) | 无序、唯一字符串集合,支持交集、并集、差集等集合运算 | 1.去重场景(如用户标签去重、投票防重复) 2.社交关系(如共同好友、关注列表) 3.筛选数据(如交集找共同兴趣) | SADD user:tags:1001 "音乐" "运动" SINTER user:1001:friends user:1002:friends(共同好友) |
Sorted Set(有序集合) | 有序、唯一字符串集合,每个元素关联分数,按分数排序;支持范围查询 | 1.排行榜(如游戏积分排名、视频播放量排序) 2.带权重的消息队列 3.时间轴数据(如按时间排序的日志) | ZADD rank:game 950 "用户A" 880 "用户B" ZRANGE rank:game 0 4 WITHSCORES(前5名及分数) |
Bitmap(位图) | 二进制位的集合,通过位操作高效存储和计算;节省空间(1MB可存800多万位) | 1.签到记录(如用户每月签到情况,1位表示1天) 2.状态标记(如用户在线状态、功能开关) 3.基数统计(如独立访客UV计数)。 | SETBIT sign:user:1001 5 1(第5天签到) BITCOUNT sign:user:1001(签到总天数) |
HyperLogLog | 用于基数估算(统计不重复元素数量),占用空间极小(约12KB),有一定误差 | 1.大规模数据基数统计(如网站UV、页面访问独立用户数) 2.快速估算集合大小(无需存储全部元素) | PFADD uv:20240821 "user1" "user2" PFCOUNT uv:20240821(估算当天UV) |
Geospatial(地理空间) | 存储经纬度信息,支持距离计算、范围查询(如附近的人/地点)。 | 1.LBS服务(如外卖配送范围、附近的商家) 2.地理位置排序(如按距离展示周边设施) | GEOADD shops:beijing 116.40 39.90 "商场A" GEORADIUS shops:beijing 116.40 39.90 5000 m(5公里内的商场) |
Redis数据持久化
数据持久化:将内存中的数据保存到磁盘中。
作用:让redis服务重启后可以恢复之前的数据。
Redis数据持久化的方式
RDB(快照):将内存中Redis缓存的所有数据,都以二进制字符串的方式保存为一个.rdb文件。
特点:占用存储小,当恢复所有数据时,速度快。不建议频繁生成快照。每次重启自动加载快照。
AOF(日志追加):将每次增、删、改的操作添加到.aof日志中,默认明文存储(可压缩),占据更大的存储空间,保存数据时,运行资源占用小。追加日志可以实时添加。
AOF默认是不开启的
RDB触发方式
手动触发:save与bgsave(save阻塞Redis主线程的执行,vgsave不阻塞)
自动触发:Redis通过判断,满足设置触发条件时自动执行bgsave命令
RDB优缺点
优点:1.RDB是一个紧凑的单一文件,方便传送,适用于灾难恢复。
2.与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。
缺点:1Redis意外宕机,可能会丢失几分钟的数据(取决于配置的save时间点)。RDB方式需要保存整个数据集,是一个比较繁重的工作,通常需要设置5分钟或者更久做一次完整的保存。
AOF优缺点
优点:1.AOF只是追加日志文件,因此对服务器性能影响较小,速度比RDB要快,消耗的内存较少。
缺点:1.AOF方式生成的日志文件太大,即使通过AOF重写,文件体积仍然很大。
2.恢复数据的速度比RDB慢。
对比维度 | RDB | AOF |
数据格式 | 二进制文件(紧凑,体积小) | 文本日志(记录命令,体积较大) |
持久化粒度 | 全量数据快照(间隔性保存) | 每条写命令(实时或近实时保存) |
恢复速度 | 快(直接加载二进制文件) | 慢(需重新执行所有命令) |
文件体积 | 小(二进制压缩) | 大(文本命令,可能包含冗余) |
性能影响 | 持久化时(fork 子进程)可能短暂阻塞 | 频繁写入时(如always模式)性能损耗较大 |
数据安全性 | 可能丢失最后一次快照后的所有数据 | 丢失数据量少(最多丢失 1 秒数据,取决于配置) |
兼容性 | 旧版本 Redis 可能不兼容新版本 RDB 文件 | 兼容性更好,命令格式相对稳定 |
适用场景 | 备份、灾难恢复(文件小,传输快) | 对数据安全性要求高的场景 |
Redis集群
redis主从模式:一主一从或一主多从,自带读写分离,负载均衡。
redis哨兵集群:高可用,主服务宕机,从服务变成主服务。
redis集群模式(分片):将数据拆分存储到多个Redis主从集群中;从而实现高扩展;
Redis主从模式
原理:第一次同步时,使用RDB(快照),在同步时,主服务器产生的数据,会记录偏移量,在同步完成后,进行偏移量的同步。
之后的同步的数据是通过AOF日志方式同步的。
具体的原理
1.当slave启动后,主动向master发送SYNC(同步)命令;
2.master接受到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令;
3.将保存的快照文件和缓存的命令发送给slave;
4.slave收到快照文件和命令后加载快照文件和缓存的执行命令;
5.复制初始化后,master每次收到的写命令都会同步发送给slave,保证主从数据一致性。
缺点:只有主服务器能写入,从服务器只能读。主服务器一旦宕机,导致无法写入数据。
Redis哨兵模式
功能:
1.监控所有Redis服务器,重点监控主服务器,1秒ping一次主
2.主服务器宕机主观下线,10秒后未恢复,客观下线,选举新的主服务器,根据条件(数据完整性、服务器性能);
3.通知其他从服务器,主从变更,让其他服务器连接新的主服务。
多哨兵模式
哨兵监控主从的同时,也监控其他哨兵。
当主宕机,哨兵中选出一个哨兵,这个哨兵再从其他从中选出新的主。
Cluster模式
优点:
1.多个redis节点网络互联,数据共享
2.所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
3.支持在线增加、删除节点
4.客户端可以连接任何一个主节点进行读写
缺点:
1.不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,
2.并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
代理模式
twemproxy:快速、轻量级memcached和redis代理,Twitter推特公司开发
codis:redis集群代理解决方案,豌豆荚公司开发,需要修改redis源码
predixy:高性能全特征redis代理,支持Redis Sentinel和Redis Cluster
Redis-cerberus: Redis Cluster代理
Redis集群模式
哈希槽:默认Redis官方在Redis集群模式中内置了16384个槽
1 % 16384 = 1
重定向:在Redis集群任意节点查询或存储修改数据时,通过哈希槽运算,未命中节点,则会重新计算查找节点。
配置文件sentinel.conf说明 | |
名称 | 说明 |
protected-mode no | 关闭保护模式,使外网能访问 |
port 26379 | 修改端口 |
daemonize no | 修改为后台运行 |
pidfile /var/run/redis-sentinel.pid | 指定不同pid文件,注意文件夹不存在自己要新建 |
logfile "" | 配置哨兵日志文件 |
dir "/tmp" | 配置哨兵工作路径 |
sentinel monitor mymaster 127.0.0.1 6379 2 | 配置哨兵需要监控的主节点ip和端口,2表示哨兵数 |
sentinel auth-pass mymaster 123 | 配置哨兵连接主节点的认证密码 |
sentinel down-after-milliseconds mymaster 5000 | 配置多少毫秒后没收到主节点的反馈,则主观认为主节点宕机了 |
sentinel failover-timeout mymaster 30000 | 表示如果30秒后,主服务仍没活过来,则启动failover,从剩下的从服务中选一个升级为主服务 |
sentinel parallel-syncs mymaster 1 | parallel-syncs 指定了在执行故障转移时,最多可以有多少个从服务同时对新的主服务进行同步,这个数字越小,完成故障转移所需的时间就越长 |
实验:一主两从三哨兵
192.168.8.11 主服务
192.168.8.12 从服务
192.168.8.13 从服务
主从模式(一主两从)
1.关闭防火墙
firewall-cmd --state #查看防火墙状态
service firewalld stop #关闭防火墙
2.安装Redis
安装Redis:安装Redis操作步骤
cd /usr/local/redis/bin
./redis-cli
3.配置主机和从机
cd /usr/local/redis/etc
只需要在从节点添加配置
vim redis.conf
最后一行添加
replicaof 192.168.81.11 6379
4.启动服务
启动三台主机的Redis服务器端服务
./bin/redis-server ./etc/redis.conf
ps -ef|grep redis
三台服务器进去Redis
./bin/redis-cli
5.手动设置从服务
slaveof 192.168.81.11 6379
6.查看主从信息
info replication
哨兵集群(单哨兵模式)
(哨兵服务)
1.备份配置文件
cp /usr/local/src/redis-6.2.14/sentinel.conf /usr/local/redis/etc/sentinel.conf
2.进入etc目录
cd /usr/local/redis/etc/
3.编辑哨兵配置文件
vim sentinel.conf
sentinel monitor mymaster 192.168.81.11 6379 1
mymaster是监控主数据的名称,命名时可以使用大小写字母和“.-_”符号;
后面是主机IP、端口号和哨兵的数量,少数服从多数的命令
sentinel down-after-milliseconds mymaster 10000
配置多少毫秒后没收到主节点的反馈,则主观认为主节点宕机了
sentinel failover-timeout mymaster 15000
表示如果30秒后,主服务仍没活过来,则启动failover;
从剩下的从服务中选一个升级为主服务
5.返回到redis目录里
cd ../
或
cd /usr/local/redis
6.启动哨兵实时查看情况
./bin/redis-sentinel ./etc/sel.conf
或
./bin/redis-server ./etc/sentinel.conf --sentinel
(从服务)
7.从机宕机
(1)查看从服务进程号
ps -ef|grep redis
root 22163 1 0 12:18 ? 00:00:02 ./bin/redis-server 0.0.0.0:6379
(2)杀死进程
kill -s 9 22163
(3)重新启动服务
./bin/redis-server ./etc/redis.conf
(4)观察哨兵日志
(主服务)
8.主机宕机
(1)查看主服务进程
ps -ef | grep redis
(2)杀死进程
kill -s 9 进程号
(3)重新启动主服务
./bin/redis-server ./etc/redis.conf
(4)观察哨兵日志
(哨兵服务)
9.测试哨兵连接
端口默认为26379
redis-cli -p 26379 sentinel masters
如果哨兵工作正常,返回所有节点信息
10.通过哨兵获取当前节点地址
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
哨兵集群(多哨兵模式)
(主服务)
1.备份配置文件
cp /usr/local/src/redis-6.2.14/sentinel.conf /usr/local/redis/etc/sentinel.conf
2.进入etc目录
cd /usr/local/redis/etc/
3.复制份哨兵文件
cp sentinel.conf sentinel-1.conf
cp sentinel.conf sentinel-2.conf
cp sentinel.conf sentinel-3.conf
4.修改配置文件
先看看/usr/local/redis下有没有logs目录
(1)修改/sentinel-1.conf
vim sentinel-l.conf
protected-mode no
port 27001
daemonize yes
pidfile "/var/run/redis-sentinel-27001.pid"
logfile "/usr/local/redis/logs/27001.log"
sentinel monitor mymaster 192.168.81.11 6379 2
(2)修改/sentinel-2.conf
vim sentinel-2.conf
protected-mode no
port 27002
daemonize yes
pidfile "/var/run/redis-sentinel-27002.pid"
logfile "/usr/local/redis/logs/27002.log"
sentinel monitor mymaster 192.168.81.11 6379 2
(3)修改/sentinel-3.conf
vim sentinel-3.conf
protected-mode no
port 27003
daemonize yes
pidfile "/var/run/redis-sentinel-27003.pid"
logfile "/usr/local/redis/logs/27003.log"
sentinel monitor mymaster 192.168.81.11 6379 2
5.启动哨兵
cd /usr/local/redis./bin/redis-sentinel ./etc/sentinel-1.conf./bin/redis-sentinel ./etc/sentinel-2.conf./bin/redis-sentinel ./etc/sentinel-3.conf
6.启动哨兵实时查看情况
tail -100 sentinel-1.conf
tail -100 sentinel-2.conf
tail -100 sentinel-3.conf
(从服务)
7.从机宕机
(1)查看进程
ps -ef|grep redis
(2)杀死进程
kill -s 9 进程名
(3)重新启动
./bin/redis-server ./etc/redis.conf
(主服务)
8.主机宕机
(1)查看进程
ps -ef|grep redis
(2)杀死进程
kill -s 9 进程名
(3)重新启动
./bin/redis-server ./etc/redis.conf
Redis集群操作步骤
用ubuntu操作,centos有问题
集群搭建:至少要三个master(123为主,456为从)
安装Redis:安装Redis操作步骤
1. 创建文件夹redis-cluster
cd /usr/local/redis
mkdir redis-cluster
cd redis-cluster/
mkdir 700{1..6}
#mkdir 700{1..6}与下面的相等
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
mkdir 7006
2.复制配置文件到700*下
cd /usr/local/redis
cp ./etc/redis.conf ./redis-cluster/7001/redis.conf
cp ./etc/redis.conf ./redis-cluster/7002/redis.conf
cp ./etc/redis.conf ./redis-cluster/7003/redis.conf
cp ./etc/redis.conf ./redis-cluster/7004/redis.conf
cp ./etc/redis.conf ./redis-cluster/7005/redis.conf
cp ./etc/redis.conf ./redis-cluster/7006/redis.conf
3.安装ruby
apt install ruby
gem install redis
4.修改集群配置
配置修改的地方都一样,把700*改成相对应的值(例如:7001)
vim ./redis-cluster/700*/redis.conf
daemonize yes
port 700*
#(分别对每个机器的端口号进行设置)
bind 192.168.3.210
#(必须要绑定当前机器的ip,不然会无限悲剧下去哇..深坑勿入!!!)
dir /usr/local/redis/redis-cluster/700*/
#(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据,深坑勿入!!!)
appendonly yes
pidfile /usr/local/redis/redis-700*.pid
logfile "/usr/local/redis/logs/redis-700*.log"#下面三行没有,添加上去
cluster-enabled yes #(启动集群模式,开始玩耍)
cluster-config-file nodes700*.conf #(这里700*最好和port对应上)
cluster-node-timeout 5000 #redis节点宕机被发现的时间 #也可以把配置好的7001复制到其余上,在全文修改(以7002为例)
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7002/redis.conf
vim ./redis-cluster/7002/redis.conf
:%s/7001/7002/g
5.启动Redis服务
./bin/redis-server ./redis-cluster/7001/redis.conf
./bin/redis-server ./redis-cluster/7002/redis.conf
./bin/redis-server ./redis-cluster/7003/redis.conf
./bin/redis-server ./redis-cluster/7004/redis.conf
./bin/redis-server ./redis-cluster/7005/redis.conf
./bin/redis-server ./redis-cluster/7006/redis.conf
6.创建集群
./bin/redis-cli --cluster create 192.168.3.210:7001 192.168.3.210:7002 192.168.3.210:7003 192.168.3.210:7004 192.168.3.210:7005 192.168.3.210:7006 --cluster-replicas 1
create表示创建一个redis集群。
cluster-replicas 1表示为集群中的每一个主节点指定一个从节点,即一比一的复制
显示OK即为成功
7.查看redis服务状态
ps -ef|grep redis
8.进入一个节点
./bin/redis-cli -c -h 192.168.3.210 -p 7001
192.168.3.210:7001> info cluster
cluster_enabled:1 #节点是否为cluster模式(1为是0为否)
9.测试
[root@zuolaoshi redis]# ./bin/redis-cli -c -h 192.168.3.210 -p 7005
192.168.3.210:7005> set b fdfsfsd
-> Redirected to slot [3300] located at 192.168.3.210:7001
OK
192.168.3.210:7001> get b
"fdfsfsd"
192.168.3.210:7001> set c fdsfdfdsfds
-> Redirected to slot [7365] located at 192.168.3.210:7002
OK
192.168.3.210:7002> get c
"fdsfdfdsfds"
192.168.3.210:7002> set x fdsfdsfsdf
-> Redirected to slot [16287] located at 192.168.3.210:7003
OK
192.168.3.210:7003> keys *
1) "x"
2) "a"
192.168.3.210:7003> get b
-> Redirected to slot [3300] located at 192.168.3.210:7001
"fdfsfsd"
192.168.3.210:7001> keys *
1) "b"
192.168.3.210:7001> set d fdsfdsfsd
-> Redirected to slot [11298] located at 192.168.3.210:7003
OK
192.168.3.210:7003> get d
"fdsfdsfsd"
192.168.3.210:7003> set x zhangsan
OK
192.168.3.210:7003> get x
"zhangsan"