redis

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言
由于项目需要搭建了一个 Redis 服务器集群实现了主从配置和容灾部署使得主机出现故障时可自动进行容灾切换下面就详细讲解一下如何利用 Redis 来实现。

文章重点
1、Redis 入门简介
2、Redis 安装部署
3、Redis 集群整体架构
4、Redis 主从配置及数据同步
5、Redis 哨兵模式搭建

一、Redis 入门简介
RedisRemote Dictionary Server 远程字典服务是一个开源的高性能key-value数据库它通常被称为数据结构服务器因为值value可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型官网https://redis.io/。

Redis支持数据的持久化可以将内存中的数据保存在磁盘中重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据同时还提供 listsetzsethash等数据结构的存储。
Redis支持数据的备份即master-slave模式的数据备份。
为什么用Redis

一个字快传统的关系型数据库如 Mysql 等已经不能适用所有的场景了比如在高并发访问流量高峰等情况时数据库很容易崩了。Redis 运行在内存能起到一个缓冲作用由于内存的读写速度远快于硬盘因此 Redis 在性能上比其他基于硬盘存储的数据库有明显的优势。
同时除了快之外还可应用于集群的自动容灾切换以及数据的读写分离减轻高并发的压力。


二、Redis 安装部署
1、下载安装包
官网下载地址https://redis.io/download这里我们下载目前最新稳定版5.0.7直接点击下载。


或者直接使用命令下载如下

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

2、安装
首先解压安装包如下

tar xzf redis-5.0.7.tar.gz


进入解压文件目录使用make命令对解压的 redis 文件进行编译如下

cd redis-5.0.7/
make


编译完成之后可以看到解压文件 redis-5.0.7 中会有对应的 src、conf 等文件如下


编译成功后进入 src 文件夹执行 make install 进行 Redis 安装。

cd src/
make install

安装完成后显示如下


注如出现/bin/sh: cc: command not found错误是因为没有安装 gcc 环境使用命令yum install gcc安装 gcc 环境即可。


3、部署
由于 src 下文件非常多我们可以将几个常用的命令和 conf 配置文件复制出来进行统一管理如下
1新建 bin 和 etc 文件夹

cd /root/redis-5.0.7/
mkdir etc
mkdir bin


2回到安装目录将redis.conf复制到 ect 文件夹下

cp redis.conf /root/redis-5.0.7/etc


3进入 src 文件夹下将mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-rdb、redis-cli、redis-server、redis-sentinel文件复制到 bin 文件夹

cd src/
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /root/redis-5.0.7/bin/


查看复制后的文件如下

4、启动redis服务
切换到 bin 目录使用./redis-server即可启动 redis 服务但是这种方式没有指明配置文件redis 将采用默认配置所以我们需要让 redis 按照我们的配置文件来启动如下启动时指定刚才我们复制到 etc 文件夹下的redis.conf。

cd /root/redis-5.0.7/bin
./redis-server /root/redis-5.0.7/etc/redis.conf


启动后查看redis的进程如下可以看到6379端口就是我们运行的 redis 服务配置文件中默认端口为6379。


使用redis-cli命令连接客户端如下


5、关闭redis服务
如果需要关闭redis服务使用如下命令即可关闭。

redis-cli -p 6379 shutdown

三、Redis 集群整体架构
这里我们采用的集群整体架构就是主从结构+哨兵sentinel实现容灾的自动切换如下图所示


一个主节点master可拥有多个从节点slave从节点实现对主节点的复制保证数据同步。而哨兵sentinel则对各节点进行监控主要包括主节点存活检测、主从运行情况检测等一旦主节点宕机哨兵可自动进行故障转移 failover、主从切换。
接下来就开始搭建这样一个集群首先是主从结构然后是哨兵模式接着往下看。


四、Redis 主从配置及数据同步
在第一步 Redis 安装部署中我们已经启动了 Redis 服务但是配置文件并没有做修改因为主从配置主要就是通过修改配置文件来实现所以 Redis 配置文件的修改统一在这里进行讲解。

这里我创建了三台虚拟机来演示分别按照上述安装方式安装好 Redis三台虚拟机如下配置

IP地址    端口号    角色
192.168.231.130    6379    主机master
192.168.231.132    6380    从机slave
192.168.231.131    6381    从机slave
现在进入 etc 文件夹使用vi redis.conf命令打开编辑 redis.conf 配置文件如下


首先看一下redis.conf 配置文件中的各个参数详解如下

# redis进程是否以守护进程的方式运行yes为是no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
# redis进程的端口号
port 6379
#是否开启保护模式默认开启。要是配置里没有指定bind和密码。开启该参数后redis只会本地进行访问拒绝外部访问。要是开启了密码和bind可以开启。否则最好关闭设置为no。
protected-mode yes
# 绑定的主机地址
bind 127.0.0.1
# 客户端闲置多长时间后关闭连接默认此参数为0即关闭此功能
timeout 300
# redis日志级别可用的级别有debug.verbose.notice.warning
loglevel verbose
# log文件输出位置如果进程以守护进程的方式运行此处又将输出文件设置为stdout的话就会将日志信息输出到/dev/null里面去了
logfile stdout
# 设置数据库的数量默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save <seconds> <changes>
# 指定存储至本地数据库时是否压缩文件默认为yes即启用存储
rdbcompression yes
# 指定本地数据库文件名
dbfilename dump.db
# 指定本地数据问就按存放位置
dir ./
# 指定当本机为slave服务时设置master服务的IP地址及端口在redis启动的时候他会自动跟master进行数据同步
replicaof <masterip> <masterport>
# 当master设置了密码保护时slave服务连接master的密码
masterauth <master-password>
# 设置redis连接密码如果配置了连接密码客户端在连接redis是需要通过AUTH<password>命令提供密码默认关闭
requirepass footbared
# 设置同一时间最大客户连接数默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符如果设置 maxclients 0表示不作限制。当客户端连接数到达限制时Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
# 指定Redis最大内存限制Redis在启动时会把数据加载到内存中达到最大内存后Redis会先尝试清除已到期或即将到期的Key。当此方法处理后仍然到达最大内存设置将无法再进行写入操作但仍然可以进行读取操作。Redis新的vm机制会把Key存放内存Value会存放在swap区
maxmemory<bytes>
# 指定是否在每次更新操作后进行日志记录Redis在默认情况下是异步的把数据写入磁盘如果不开启可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的条件有三个可选参数 - no表示等操作系统进行数据缓存同步到磁盘(快)always表示每次更新操作后手动调用fsync()将数据写到磁盘(慢安全) everysec表示每秒同步一次(折衷默认值)
appendfsync everysec

1、主机配置
主机192.168.231.130需要改动的配置如下所示修改完毕后先按 esc 然后:wq命令保存退出。

bind0.0.0.0
port6379
protected-modeno
daemonizeyes
logfile./redis.log
requirepasspwdtest@2019
masterauthpwdtest@2019


bind0.0.0.0
Redis 默认只允许本机访问把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问可设置对应的 ip。
port6379
监听端口默认为6379想改其他也行。
protected-modeno
关闭保护模式可以外部访问。
daemonizeyes
设置为后台启动。
logfile./redis.log
redis 日志文件生成后在 bin 目录下可找到。
requirepasspwdtest@2019
设置 redis 连接密码。
masterauthpwdtest@2019
slave 服务连接 master 的密码。

2、从机配置
从机的配置和主机相似相同的地方我就不再详解不同的地方是需要使用replicaof指定主机master的IP地址和端口需要注意的是老版本使用的是 slaveof目前我使用的5.0.7版本要使用 replicaof 如下。

bind0.0.0.0
port6379
protected-modeno
daemonizeyes
logfile./redis.log
requirepasspwdtest@2019
masterauthpwdtest@2019
replicaof 192.168.231.130 6379 


replicaof 192.168.231.130 6379
指定当本机为 slave 服务时设置 master 服务的IP地址及端口在 redis 启动的时候会自动跟 master 进行数据同步所以两台从机都这样配置即可。
注由于我们搭建的集群需要自动容灾切换主数据库可能会变成从数据库所以三台机器上都需要同时设置 requirepass 和 masterauth 配置项。


3、数据同步
上面我们主从节点的配置文件配置好后重启 redis 服务进入 bin 目录即可查看配置文件中指定的redis.log日志文件。


下面我们需要设置一下防火墙否则主从机之间无法同步数据命令如下这里根据自己设置的端口进行更改。

firewall-cmd --add-port=6379/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload


至此主从结构搭建完毕不出意外主从机已经可以数据同步下面我们分别查看三台机器的信息如下

192.168.231.130 6379主

可以看到当前角色为主机master并且连接了另外两台从机slave。

192.168.231.132 6380从

可以看到当前角色为从机slave并指明了主机地址192.168.231.130和端口6379。

192.168.231.131 6381从

可以看到当前角色为从机slave并指明了主机地址192.168.231.130和端口6379。


4、主从验证
接下来我们在主机master添加几条数据看从机slave是否可以获取到如果能获取说明数据已经同步到了从机主机添加数据如下


两台从机已经获取到数据证明主从搭建成功并可同步数据如下所示


五、Redis 哨兵模式搭建
1、哨兵模式详解
Redis Sentinel是Redis 的高可用性解决方案由一个或多个Sentinel哨兵实例组成。它可以监视任意多个主服务器以及这些主服务器属下的所有从服务器并在被监视的主服务器进入下线状态时自动将下线主服务器属下的某个从服务器升级为新的主服务器它的主要功能如下

监控(Monitoring)Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
通知(Notification)当被监控的某个 Redis 服务器出现问题时 Sentinel可以通过API向管理员或者其他应用程序发送通知。
故障迁移当主服务器不能正常工作时Sentinel会自动进行故障迁移也就是主从切换。
统一的配置管理连接者询问sentinel取得主从的地址。

哨兵原理
Sentinel 使用的算法核心是 Raft 算法主要用途就是用于分布式系统系统容错以及Leader选举每个Sentinel都需要定期的执行以下任务

每个 Sentinel 会自动发现其他 Sentinel 和从服务器它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。

如果一个实例instance距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值 那么这个实例会被 Sentinel 标记为主观下线。 有效回复可以是 +PONG 、 -LOADING 或者 -MASTERDOWN 。

如果一个主服务器被标记为主观下线 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。

如果一个主服务器被标记为主观下线 并且有足够数量的Sentinel至少要达到配置文件指定的数量在指定的时间范围内同意这一判断 那么这个主服务器被标记为客观下线。

在一般情况下 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

当没有足够数量的Sentinel同意主服务器已经下线 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时 主服务器的主管下线状态就会被移除。


配置文件详解
哨兵的配置主要就是修改sentinel.conf配置文件中的参数在Redis安装目录即可看到此配置文件各参数详解如下:
 

# 哨兵sentinel实例运行的端口默认26379  
port 26379
# 哨兵sentinel的工作目录
dir ./
# 是否开启保护模式默认开启。
protected-mode:no
# 是否设置为后台启动。
daemonize:yes

# 哨兵sentinel的日志文件
logfile:./sentinel.log

# 哨兵sentinel监控的redis主节点的 
## ip主机ip地址
## port哨兵端口号
## master-name可以自己命名的主节点名字只能由字母A-z、数字0-9 、这三个字符".-_"组成。
## quorum当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了  
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  
sentinel monitor mymaster 127.0.0.1 6379 2

# 当在Redis实例中开启了requirepass所有连接Redis实例的客户端都要提供密码。
# sentinel auth-pass <master-name> <password>  
sentinel auth-pass mymaster 123456  

# 指定主节点应答哨兵sentinel的最大时间间隔超过这个时间哨兵主观上认为主节点下线默认30秒  
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000  

# 指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步。这个数字越小完成failover所需的时间就越长反之但是如果这个数字越大就意味着越多的slave因为replication而不可用。可以通过将这个值设为1来保证每次只有一个slave处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1  

# 故障转移的超时时间failover-timeout默认三分钟可以用在以下这些方面
## 1. 同一个sentinel对同一个master两次failover之间的间隔时间。  
## 2. 当一个slave从一个错误的master那里同步数据时开始直到slave被纠正为从正确的master那里同步数据时结束。  
## 3. 当想要取消一个正在进行的failover时所需要的时间。
## 4.当进行failover时配置所有slaves指向新的master所需的最大时间。不过即使过了这个超时slaves依然会被正确配置为指向master但是就不按parallel-syncs所配置的规则来同步数据了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000

# 当sentinel有任何警告级别的事件发生时比如说redis实例的主观失效和客观失效等等将会去调用这个脚本。一个脚本的最大执行时间为60s如果超过这个时间脚本将会被一个SIGKILL信号终止之后重新执行。
# 对于脚本的运行结果有以下规则  
## 1. 若脚本执行后返回1那么该脚本稍后将会被再次执行重复次数目前默认为10。
## 2. 若脚本执行后返回2或者比2更高的一个返回值脚本将不会重复执行。  
## 3. 如果脚本在执行过程中由于收到系统中断信号被终止了则同返回值为1时的行为相同。
# sentinel notification-script <master-name> <script-path>  
sentinel notification-script mymaster /var/redis/notify.sh

# 这个脚本应该是通用的能被多次调用不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

2、哨兵搭建
这里我们部署三个哨兵每台服务器一个哨兵配置方式相同如下

1同样为了方便管理首先将sentinel.conf复制到 etc 下

cd /data/redis-5.0.7/
cp sentinel.conf /data/redis-5.0.7/etc/


2编辑 sentinel.conf

cd etc/
vi sentinel.conf


配置文件修改如下修改完毕后先按 esc 然后:wq命令保存退出。

//端口默认为26379。
port:26379
//关闭保护模式可以外部访问。
protected-mode:no
//设置为后台启动。
daemonize:yes
//日志文件。
logfile:./sentinel.log
//指定主机IP地址和端口并且指定当有2台哨兵认为主机挂了则对主机进行容灾切换。
sentinel monitor mymaster 192.168.231.130 6379 2
//当在Redis实例中开启了requirepass这里就需要提供密码。
sentinel auth-pass mymaster pwdtest@2019
//这里设置了主机多少秒无响应则认为挂了。
sentinel down-after-milliseconds mymaster 3000
//主备切换时最多有多少个slave同时对新的master进行同步这里设置为默认的1。
sentinel parallel-syncs mymaster 1
//故障转移的超时时间这里设置为三分钟。
sentinel failover-timeout mymaster 180000

3、防火墙设置
命令如下这里根据自己设置的端口进行更改。

firewall-cmd --add-port=26379/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

4、启动三个哨兵

cd /data/redis-5.0.7/bin
redis-sentinel /data/redis-5.0.7/etc/sentinel.conf


三个哨兵都启动后可使用如下命令查看哨兵信息

redis-cli -p 26379
info sentinel


可以看到哨兵已经监听到当前的主机IP端口和运行状态并且有2台从机3个哨兵。


5、容灾切换
现在我们模拟主机宕机将主机 redis 服务关闭如下


现在我们去看三台服务器的情况发现刚才的主机192.168.231.130 6379已经变成了从机并且哨兵Sentinel通过选举机制选举了从机192.168.231.131 6381作为了新的主机如下


进入192.168.231.131 6381 可以看到它已经由从机slave变为了主机master并且成功连接从机。


需要注意的是主从切换后配置文件已经被自动进行了更改我们现在看一下新上位的主机 redis 日志如下


可以看到当主机挂了的时候一直连接主机被拒绝当哨兵选举它为主机后它成功执行重写的配置文件并且连接了其他从机。

至此主从+哨兵的集群架构搭建完毕。
 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis