Redis

文章目录

一、Redis简介

redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了
memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很
好的补充作用。

它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。

Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上
(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个 appendonly file(aof)里面(这称为“全持久化模式”)。

redis是一种典型的no-sql 即非关系数据库 像python的字典一样 存储key-value键值对 工作在memory中

所以很适合用来充当整个互联网架构中各级之间的cache 比如lvs的4层转发层 nginx的7层代理层。尤其是lnmp架构应用层如php-fpm或者是Tomcat到mysql之间 做一个cache 以减轻db的压力。因为有相当一部分的数据 只是简单的key-value对应关系,而且在实际的业务中常常在短时间内迅速变动 。如果用关系数据库mysql之类存储 会大大增加对db的访问 导致db的负担很重 因为所有的require中的大部分最后都要汇聚到db。所以如果想要业务稳定 那么解决db的压力 就是关键 所以现在大部分的解决方案就是在db层之上的各级使用多级的no-sql 。像memcache redis 等 来为db提供缓冲

二、Redis的下载安装

先安装vm1上的redis数据库

https://redis.io/download
wget https://download.redis.io/releases/redis-6.2.5.tar.gz
tar zxf redis-6.2.5.tar.gz
ls
cd redis-6.2.5/
make&make install

RedisRedis
RedisRedis

cd utils/
ls
./install_server.sh	#启动脚本开启Redis服务,未成功需要修改脚本内容
vim install_server.sh
注释掉以下内容,注释掉的部分为systemctl安装
"
if [ "${_pid_1_exe##*/}" = systemd ]
then
       echo "This systems seems to use systemd."
       echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
       exit 1
fi
"
source install_server.sh或是./ install_server.sh#source 是内置命令,用途是读取文件中内容,并在当前shell中逐条执行

RedisRedisRedis

/etc/init.d/redis_6379 start
redis-cli

redis服务的常用指令

redis指令 意义
config get * 查看配置
select 1-15 选择数据库(默认数据库为0号)
flushdb 清空当前数据库
flushall 清空所有数据库
move key 1 移动key
del key 删除键
rename oldkey newkey 修改键名
expire key 10 设置过期时间
persist key 设置持久化
keys user* 查询
exists key 判断是否存在键

查看端口6379
RedisRedis

三、redis的主从复制

Redis持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障。

Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。

为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构:Redis主从复制可以根据是否是全量分为全量同步和增量同步。
Redis主从复制的特点:
1、同一个master可以拥有多个slave。
2、master下的slave还可以接受同一架构中其它slave的连接与同步请求,实现数据的级联复制,即master->slave->slave模式;
3 、master以非阻塞的方式同步数据至slave,这将意味着master会继续处理client的读写请求;
4、slave端同步数据也可以修改为非阻塞的方式,当slave在执行新的同步时,它仍可以用旧的数据信息来提供查询
5、redis的主从复制具有可扩展性,即多个slave专门提供只读查询与数据的冗余,master端专门提供写操作,实现读写分离;
6、通过配置禁用master数据持久化机制,将其数据持久化操作交给slave完成,避免在master中要有独立的进程来完成此操作。

1、全量同步:
  Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
  1)从服务器连接主服务器,发送SYNC命令;
  2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
  Redis2、增量同步:
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

实验部分

在主机1上添加新的键值,并查看是否创建成功
Redis
在主机1添加之前查看age键发现为空,master添加后从机2同步了主机1的age直
Redis
从机3同理
Redis

四、redis主从自动切换(基于sentinel)

万一主机挂了怎么办,这是个麻烦事情,所以redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,类似与zookeeper。

cd /etc/redis
ls
vim 6379.conf
/etc/init.d/redis_6379 restart

Redis
Redis
Redis

将文件复制到vm2和vm3中并进行同样的安装部署操作
Redisvm2安装部署完成

vim /etc/redis/6379.conf
添加以下内容
"
repolicaof master主机的ip 6379
"
/etc/init.d/redis_6379 restart

RedisRedisRedisRedis

sentinel monitor mymaster 172.25.76.1 6379 2
这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机,才会去执行主从切换的功能

RedisRedis

将sentinel.conf文件传输给vm2和vm3

scp sentinel.conf root@172.25.76.2|3:/etc/redis/
redis-sentinel /etc/redis/sentinel.conf	master端的监控命令,能够查看slave机redis的服务状况

Redis

Redis新开一个shell,连接vm并关闭vm1上的redis服务

redis-cli
SHUTDOWN

Redis在之前的shell中可以通过监控看到vm1主机宕掉了
Redis此时只有2和3还活着,且2为新的master主机,3为2的slave从机
打开1主机的redis服务,1和3一样成为2的slave从机
Redis
RedisRedis

五、Redis集群

为了在大流量访问下提供稳定的业务,集群化是存储的必然形。未来的发展趋势肯定是云计算和大数据的紧密结合 只有分布式架构能满足要求。如果没有集群化 何来的分布式。

基本介绍

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。

Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。

Redis 集群通过分区partition来提供一定程度的可用性availability: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

Redis集群提供了以下两个好处:

将数据自动切分split到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

集群原理

redis-cluster架构图

Redis

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效。
  3. 客户端与redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster负责维护node<->slot<->value

redis-cluster投票机制:容错

Redis

  1. 投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.
  2. 什么时候整个集群不可用(cluster_state:fail)?
    如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.
    redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
    如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

Redis集群搭建

redis-cli 参数详解

create:创建集群
check:检查集群
info:查看集群信息
fix:修复集群
reshard:在线迁移slot
rebalance:平衡集群节点slot数量
add-node:将新节点加入集群
del-node:从集群中删除节点
set-timeout:设置集群节点间心跳连接的超时时间
call:在集群全部节点上执行命令
import:将外部redis数据导入集群
  1. 配置文件修改
cd /etc/redis/
vim 6379.conf
---
appendonly yes						##开启AOF模式
---

cd /usr/local/
ls
mkdir redis/
cd redis/
mkdir 700{1..10}
ls

cd 7001/
vim redis.conf
---
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
---
redis-server redis.conf		#启动服务
ps ax	#查看集群进程是否添加成功

cp redis.conf /usr/local/7002/
cp redis.conf /usr/local/7003/
...
cp redis.conf /usr/local/7006/

cd 7002/
vim redis.conf
---
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
---
redis-server redis.conf		#启动服务
ps ax	#查看集群进程是否添加成功
7003-7006进行同样的操作

修改配置文件,设定开启AOF模式。
Redis
创建集群目录
Redis编写集群启动文件
Redis查看是否开启成功
Redis
Redis
配置完成后查看进程集群7001-7006进程启动完毕
Redis
先确定各个节点是否时master主机
Redis
创建集群,将之前建立的6个节点全部添加到集群中

--cluster-replicas 1
代表的是创建每个master带一个slave指令

Redis

cd redis-6.2.4/
cd utils/create-cluster/
./create-cluster start		##开启实例Starting 30001~30006
ps ax
./create-cluster stop		##停止所有实例,构建一个纯净的实验环境,之后的实验使用手动构建的集群
ps ax

Redis 编写集群启动脚本和关闭脚本
Redis
RedisRedis
自动切换
Redis7002进程消失
Redis查看发现7002原先的slave7005变为新的master机,且没有slave机
Redis
打开7002的服务并检查,再次查看集群情况

Redis
Redis重启7002后发现7002成为新的7005的slave机,即在关闭主从中的主机后,从机会替代原主机成为新的master主机
Redis

Redis集群节点的操作

  1. 查询集群信息
redis-cli -c -p 7001
cluster nodes 	#查询集群结点信息

Redis

cluster info 查询集群状态信息

Redis

  1. 添加主节点

集群创建成功后可以向集群中添加节点,下面是添加一个master主节点。

首先,准备一个干净的redis节点。复制7001的集群模板修改redis配置文件。开启该redis节点。

查看redis进程

RedisRedis
查看节点发现7007和7008还未添加到集群中,需要继续设置
Redis

  1. 添加从节点
    添加节点7007为master节点
    Redis
    !检查在这里插入图片描述Redis检查发现7007是master节点还未有slave主机
    Redis添加分片
    RedisRedis将7008设置为7007的slave节点
    Redis添加成功,查看节点内容
    Redis
  2. 删除节点

客户端对Redis集群的使用方法

一定要加-c参数,节点之间就可以互相跳转

使用redis-cli命令行客户端连接
其中-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号
cluster nodes 查询集群结点信息
cluster info 查询集群状态信息

六、redis+mysql 即 Redis作mysql的缓存服务器

敬请期待。。。。

七、报错

make 报错

Redis
问题描述:cc编译指令不认识,那就让他们认识,安装解决
解决:

yum install -y gcc gcc-c++
清除编译痕迹的指令
make clean

清除后继续编译make,出现致命型错误布拉布拉的
Redis
搜到的解决方案有用是有用但我不太懂,等懂了再细说

make MALLOC=libc

再进行make install
Redis

上一篇:文件路径获取 + 绝对路径 + 相对路径


下一篇:Redis集群创建