云服务器 Redis 集群搭建
集群搭建说明
为什么会出现 3 种搭建集群的方式?
主从复制架构集群存在的问题:Master 节点单点故障问题
Sentinel(哨兵)集群存在的问题:解决了 Master 单点故障的问题,同时带来了新的问题 -> 单个节点无法存储全量数据,需要把数据分区存储在每一个节点
主从复制架构搭建
集群架构介绍
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器
前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点
主从模式
① 一主一从
如下图所示左边是 Master
节点,右边是 slave
节点,即主节点和从节点。从节点也是可以对外提供服务的,主节点是有数据的,从节点可以通过复制操作将主节点的数据同步过来,并且随着主节点数据不断写入,从节点数据也会做同步的更新。从节点起到的作用主要是数据备份
② 一主多从
一个 Master
可以有多个 slave
,也就相当于有了多份的数据副本,是一个一个高可用的选择,例如一个 Master
和一个 slave
挂掉了,还能有其他的 slave
数据备份
主从复制原理
① 当从数据库启动后,会向主数据库发送 SYNC
命令
② 主数据库接收到 SYNC
命令后开始在后台保存快照(RDB持久化),并将保存快照期间接收到的命令缓存起来
③ 快照完成后,Redis(Master)将快照文件和所有缓存的命令发送给从数据库
④ Redis(Slave)接收到 RDB 和缓存命令时,会开始载入快照文件并执行接收到的缓存的命令
在之后每当主数据库接收到写命令时,就会将命令同步给从数据库
主从复制架构的使用场景
适用于 读多写少 的场景,通过主从复制功能来建立多个从数据库节点,主数据库只进行写操作,从数据库负责读操作。当单个主无法处理过多写操作的时候,需要使用 Redis 3.0
推出的集群功能
环境准备
服务器准备
node1/172.17.0.8 | node2/172.17.30.12 | node3/172.17.30.26 |
---|---|---|
主 | 从 | 从 |
安装包准备
Redis 依赖环境准备
# 在 3 台服务器上都执行
yum -y install gcc-c++
安装
① 解压
# 在 /opt/server 下解压安装包(可自定义安装目录)
tar -zxvf redis-3.2.8.tar.gz
# 3 台服务器解压后的目录(3 台尽量路径相同,方便排查问题)
/opt/server/redis-3.2.8
② 安装 TCL
# 在 node2 和 node3 上执行即可
yum -y install tcl
③ 编译 Redis
# 3 台服务器都执行
cd /opt/server/redis-3.2.8/
# 执行编译和安装
make PREFIX=/opt/server/redis-3.2.8-bin install
④ 创建 备份文件 和 日志存放目录
# 3 台服务器都执行
cd /opt/server/redis-3.2.8-bin/
mkdir -p /opt/server/redis-3.2.8-bin/log
mkdir -p /opt/server/redis-3.2.8-bin/data
配置及启动
① 配置 node1
的 redis.conf
# 进入安装目录
cd /opt/server/redis-3.2.8-bin/
# 修改配置文件
vim redis.conf
# 增加以下内容
# 修改第128行
daemonize yes
# 修改第163行
logfile "/opt/server/redis-3.2.8-bin/log/redis.log"
# 修改第247行
dir /opt/server/redis-3.2.8-bin/data
② 配置 node2
和 node3
的 redis.conf
# 进入安装目录
cd /opt/server/redis-3.2.8/
# 修改配置文件
vim redis.conf
# 增加以下内容
# 修改第128行
daemonize yes
# 修改第163行
logfile "/opt/server/redis-3.2.8-bin/log/redis.log"
# 修改第247行
dir /opt/server/redis-3.2.8-bin/data
# 修改第266行,配置主节点的 ip 和 端口
slaveof node1 6379
③ 启动
依次在 node1 、node2、node3 上执行如下命令
cd /opt/server/redis-3.2.8-bin/
# 启动
bin/redis-server redis.conf
测试
测试:在 node1
上执行写操作,在 node2
和 node3
上查看
bin/redis-cli -h node1
Sentinel (哨兵)架构搭建
集群架构介绍
Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个 Sentinel 实例 组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器
执行流程示意图
当 server1
服务器掉线后,server2
服务器升级为新的主服务器
环境准备
哨兵模式在主从复制架构的基础上实现的,所以需要先将 主从复制集群搭建好
Sentinel 配置
配置说明
① sentinel monitor 代表监控
② mymaster 代表服务器的名称,可以自定义
③ node1 代表监控的主服务器,6379 代表端口
④ 代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行 failover 操作
配置步骤
① 配置 node1
服务器
cd /opt/server/redis-3.2.8
# 修改配置文件
vim sentinel.conf
# 修改以下内容
# 修改第15行, bind 配置,每台机器修改为自己对应的主机名
bind 0.0.0.0
# 在下方添加配置,让 sentinel 服务后台运行
daemonize yes
logfile "/opt/server/redis-3.2.8/log/sentinel.log"
# 修改第71行,三台机器监控的主节点,现在主节点是 node1 服务器
sentinel monitor mymaster node1 6379 2
② 配置 node2
和 node3
服务器
# 修改第15行, bind 配置,每台机器修改为自己对应的主机名
bind 0.0.0.0
# 在下方添加配置,让 sentinel 服务后台运行
daemonize yes
logfile "/opt/server/redis-3.2.8/log/sentinel.log"
# 修改第71行,三台机器监控的主节点,现在主节点是 node1 服务器
sentinel monitor mymaster node1 6379 2
③ 如果 redis
配置了密码,需要在 sentinel.conf
中进行配置
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
Sentinel 启动
分别在 3 台服务器上启动哨兵
cd /opt/server/redis-3.2.8
# 启动
bin/redis-sentinel sentinel.conf
测试
查看当前的 Master
节点的信息,然后将 Master
节点的 redis-server
进程结束掉,然后再看 Master
节点的信息
将 Master
节点的 redis-server
进程结束掉再查看
Redis Cluster 搭建
Redis Cluster 介绍
Redis Cluster 是分布式架构,有多个节点,每个节点都负责进行数据读写操作,每个节点之间会进行通信,Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接
Redis Cluster 特点
① 所有的 Redis 节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
② 节点的 fail 是通过集群中 超过半数 的节点检测失效时才生效
③ 客户端与 Redis 节点直连,不需要中间 proxy 层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
④ redis-cluster 把所有的物理节点映射到 [0-16383]slot
上(不一定是平均分配), cluster
负责维护 node<->slot<->value
⑤ Redis集群预分好 16384
个桶(Slot),当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) & 16384的值,决定将一个key 放到哪个桶中
Redis Cluster 的优势
① 缓存永不宕机
启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令
② 迅速恢复数据
持久化数据,能在宕机后迅速解决数据丢失的问题
③ Redis 可以使用所有机器的内存,变相扩展性能
④ 使 Redis 的计算能力通过简单地增加服务器得到成倍提升,Redis 的网络带宽也会随着计算机和网卡的增加而成倍增长
⑤ Redis 集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈
⑥ 异步处理数据,实现快速读写
环境准备
下载安装包
Redis3.0 及以上版本实现,集群中至少应该有奇数个节点,所以至少有三个节点,官方推荐三主三从的配置方式 Redis 3.x
和 Redis4.x
搭建集群是需要手动安装 ruby
组件的,比较麻烦
Redis 发布了稳定版本的 5.0
版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli
的方式,是集群的构建方式复杂度大大降低
# 上传到该目录下
/opt/server
服务器准备
基于 Redis-5.0.8
版本,在三台机器上搭建 6
个节点的 Redis
集群:三主三从架构
node1/172.17.0.8 | node2/172.17.20.14 | node3/172.17.30.12 | |
---|---|---|---|
主节点端口 | 7001 | 7001 | 7001 |
从节点端口 | 7002 | 7002 | 7002 |
Slot槽范围划分 | 0 - 5460 | 5461 - 10922 | 10923 – 16383 |
编译环境准备
yum -y install gcc-c++ tcl
tar -zxvf redis-5.0.8.tar.gz -C /opt/server/
安装
① 解压安装包
# 赋权
chmod u+x redis-5.0.8.tar.gz
# 解压
tar -zxvf redis-5.0.8.tar.gz -C /opt/server/
② 编译安装
# 进入源码目录
cd /opt/server/redis-5.0.8
# 编译
make
# 安装至指定目录
make PREFIX=/opt/server/redis-5.0.8-bin install
③ 创建目录软连接
# 3台机器都操作
# 创建安装目录软连接
cd /opt/server
ln -s redis-5.0.8-bin redis
④ 配置环境变量
# 3台机器都操作
# 配置环境变量
vim /etc/profile
# 增加以下内容
export REDIS_HOME=/opt/server/redis
export PATH=:$PATH:$REDIS_HOME/bin
# 执行生效
source /etc/profile
配置
① 从解压目录拷贝配置文件到安装目录
cd /opt/server/redis-5.0.8
cp redis.conf /opt/server/redis
② 在 Redis 安装目录下创建 7001 和 7002 目录,分别存储Redis服务配置文件、日志及数据文件
# 创建目录:7001和7002
cd /opt/server/redis
mkdir -p 7001 7002
# 分别创建数据存放目录和日志存放目录
mkdir -p /opt/server/redis/7001/log
mkdir -p /opt/server/redis/7001/data
mkdir -p /opt/server/redis/7002/log
mkdir -p /opt/server/redis/7002/data
③ 拷贝配置文件
cd /opt/server/redis
cp redis.conf 7001/redis_7001.conf
cp redis.conf 7002/redis_7002.conf
④ 修改配置文件
分别修改 redis_7001.conf
和 redis_7002.conf
,以下内容针对 redis_7001.conf
,修改 redis_7002.conf
时将内容中的 7001
全部替换为 7002
# 69行,配置redis服务器接受链接的网卡
bind 0.0.0.0
# 88行,关闭保护模式
protected-mode no
# 92行,设置端口号
port 7001
# 136行,redis后台运行
daemonize yes
# 158行,Redis服务进程PID存储文件名称
pidfile /var/run/redis_7001.pid
# 171行,设置redis服务日志存储路径
logfile "/opt/server/redis-5.0.8-bin/7001/log/redis.log"
## 263行,设置redis持久化数据存储目录
dir /opt/server/redis-5.0.8-bin/7001/data/
## 699行,启动AOF方式持久化
appendonly yes
# 832行,启动Redis Cluster
cluster-enabled yes
# 840行,Redis服务配置保存文件名称
cluster-config-file nodes-7001.conf
# 847行,超时时间
cluster-node-timeout 15000
启动
启动 redis 服务
# 3 台机器都执行
# 启动 7001 端口 Redis 服务
/opt/server/redis/bin/redis-server /opt/server/redis/7001/redis_7001.conf
# 启动 7002 端口 Redis 服务
/opt/server/redis/bin/redis-server /opt/server/redis/7002/redis_7002.conf
启动集群
# 任意选择一台机器执行如下命令,创建集群
/opt/server/redis/bin/redis-cli --cluster create 172.17.0.8:7001 172.17.0.8:7002 172.17.20.14:7001 172.17.20.14:7002 172.17.30.12:7001 172.17.30.12:7002 --cluster-replicas 1
集群常用的操作命令
# 添加新的主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
# 添加新的从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
# 删除节点
redis-cli --cluster del-node host:port node_id
# hash 槽重新分配
添加新的节点后,需对新添加的主节点进行 hash 槽重新分配,此时主节点才能存储数据,redis 共有 16384 个槽
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
测试
启动 redis
客户端
# 任选一台机器启动客户端
redis-cli -c -p 7001
查看集群信息
# 查看集群信息
cluster nodes
# 查看主从信息
info replication
测试查询数据和设置数据
测试主从切换
将 node1 的 7001
端口的 Master
停掉,然后在 node2
上查看集群信息
# 停止 7001 端口的服务
/bin/redis-cli -h node1 -p 7001 SHUTDOWN