Redis 集群搭建
单机环境搭建
- 安装 redis, 我从 Redis 官网 下载的最新版 redis-6.2.6
- linux 环境,我用的 centos 7.7
# redis 准备
$ cd /opt
$ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
$ tar zxvf credis-6.2.6.tar.gz
$ cd redis-6.2.6
$ make
$ make PREFIX=/usr/local/redis install # 安装目录可以自定义
$ cp redis.conf /usr/local/redis/etc/ # 将redis-6.2.6下的 redis.conf拷贝到安装目录
# 修改 reids 配置
$ cd /usr/local/reids
$ vi redis.conf
基本配置项如下:
1.设置为后台启动: daemonize yes
2.修改端口: port 6379 (默认:6379)
3.绑定IP,绑定ip后,只有绑定的ip才能连接【即远程连接受限;若是需要远程连接,可以注释】:bind
4.指定数据存放路径,dir /usr/local/redis/log rdb存放的路径
5.指定持久化方式: appendonly yes
6.设置密码: requirepass foobared (默认: foobared)
# 启动
$ ./bin/redis-server ./etc/redis.conf
# 查看是否启动成功
$ ps -ef|grep redis
安装问题解决
若make 时报错如下:
make[3]: cc:命令未找到
make[3]: *** [alloc.o] 错误 127
make[3]: 离开目录“/opt/redis-6.2.6/deps/hiredis”
make[2]: *** [hiredis] 错误 2
make[2]: 离开目录“/opt/redis-6.2.6/deps”
make[1]: [persist-settings] 错误 2 (忽略)
CC adlist.o
/bin/sh: cc: 未找到命令
make[1]: *** [adlist.o] 错误 127
make[1]: 离开目录“/opt/redis-6.2.6/src”
这是因为没有安装 gcc 导致的,需要执行以下命令安装 gcc
sudo yum install gcc
若 make 时报错如下:
make[1]: 进入目录“/opt/redis-6.2.6/src”
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
#include <jemalloc/jemalloc.h>
^
编译中断。
make[1]: *** [adlist.o] 错误 1
需要在 make 时候添加参数,make 命令如下:
make MALLOC=libc
主从复制搭建
生产环境做集群一般会采用多个独立主机,这里做演示在一台虚拟机上同时运行多个节点的,这点注意一下。
主要有两步
- 准备 master/slave 配置文件
- 先启动 master 再启动 slave,进行验证
集群节点
节点 | 配置文件 | 端口 |
---|---|---|
master | redis_6379.conf | 6379 |
slave1 | redis_6380.conf | 6380 |
slave2 | redis_6381.conf | 6381 |
配置文件
内容如下
# 通用配置
daemonize yes # 后台启动
protected-mode no # 关闭保护模式
bind 0.0.0.0 # 允许任意远程连接
appendonly yes # 开启AOF持久化
# redis_6379.conf master
# 包含命令,有点复用的意思
port 6379
logfile /var/log/redis_6379.log # 指定日志文件目录
dir /var/lib/redis/6379 # 指定工作目录,不存在则需要创建 `mkdir /var/lib/redis/6379`
# redis_6380.conf slave1
port 6380
logfile /var/log/redis_6380.log # 指定日志文件目录
dir /var/lib/redis/6380 # 指定工作目录
replicaof 127.0.0.1 6379 # 指定要同步的master节点IP和端口
# redis_6381.conf slave1
port 6381
logfile /var/log/redis_6381.log # 指定日志文件目录
dir /var/lib/redis/6381 # 指定工作目录
replicaof 127.0.0.1 6379 # 指定要同步的master节点IP和端口
主节点可选配置
requirepass 123456 # 设置密码
从节点可选配置
masterauth 123456 # 从节点访问主节点的密码(必须和requirepass 一致)【没有可不配置】
replica-read-only yes # 从节点只读模式
启动节点
启动节点,然后查看节点信息
# 创建软连接 `/usr/local/redis/redis-server` 目录为redis安装目录
ln -s /usr/local/redis/bin/redis-server /usr/bin/redis-server
ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
# 顺序启动节点
$ redis-server redis_6379.conf
$ redis-server redis_6380.conf
$ redis-server redis_6381.conf
# 进入redis 客户端,开多个窗口查看方便些
$ redis-cli -p 6379
$ info replication
info replication
命令可以查看连接该数据库的其它库的信息,可看到有两个 slave 连接到 master
主节点信息
从节点信息
实例测试
在 master 节点设置值,在 slave1/slave2 节点可以查看数据同步情况
在主节点添加键值对
set k1 akieay
,在从节点可以通过get k1
查看 k1 的值,如果能查询成功,证明主从复制集群搭建成功。
# master
$ redis-cli -p 6379
127.0.0.1:6379> set k1 akieay
OK
# slave1
$ redis-cli -p 6380
127.0.0.1:6380> get k1
"akieay"
Sentinel(哨兵)模式搭建
上面也说了哨兵其实主动复制的自动版,所以需要先配置好主从复制,不同点在于要增加几个哨兵进行监控。
主要有两步:
- 准备主从复制集群,并启动
- 增加哨兵配置,启动验证
集群节点
一般来说,哨兵模式的集群是:一主,二从,三哨兵。
那咱们就来演示一下三个哨兵的集群。
节点 | 配置 | 端口 |
---|---|---|
master | redis_6379.conf | 6379 |
slave1 | redis_6380.conf | 6380 |
slave2 | redis_6381.conf | 6381 |
sentinel1 | sentinel_26379.conf | 26379 |
sentinel2 | sentinel_26380.conf | 26380 |
sentinel3 | sentinel_26381.conf | 26381 |
哨兵配置
哨兵的配置其实跟 redis.conf 有点像,可以看一下自带的 sentinel.conf
这里咱们创建三个哨兵文件, 哨兵文件的区别在于启动端口不同
# 通用配置
protected-mode no # 关闭保护模式
daemonize yes # 后台启动
# 指定该哨兵节点监控 '127.0.0.1 6379' 这个主节点,该主节点的名称是 mymaster,最后的'2'的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456 # 访问主节点的密码【没有可不配置】
sentinel down-after-milliseconds mymaster 30000 # 判定服务器down掉的时间周期,默认30000毫秒
sentinel failover-timeout mymaster 180000 # 故障节点的最大超时时间为180000毫秒
# sentinel_26379.conf
port 26379 # 端口
logfile "/var/log/sentinel_26379.log" # 指定日志存放路径
dir "/var/lib/redis/26379" # 设置工作目录
# sentinel_26380.conf
port 26380 # 端口
logfile "/var/log/sentinel_26380.log" # 指定日志存放路径
dir "/var/lib/redis/26380" # 设置工作目录
# sentinel_26381.conf
port 26381 # 端口
logfile "/var/log/sentinel_26381.log" # 指定日志存放路径
dir "/var/lib/redis/26381" # 设置工作目录
实例测试
先启动主从节点,在启动三个哨兵
$ redis-sentinel sentinel_26379.conf
$ redis-sentinel sentinel_26380.conf
$ redis-sentinel sentinel_26381.conf
启动之后日志如下,可以看到监听到的主/从节点情况以及哨兵集群情况
主从节点故障切换
我们在 master(6379) 节点 执行 shutdown
,然后观察哨兵会帮我做什么?
可以看到哨兵扫描到了 master 下线, 然后经过一系列判断,投票等操作重新选举了master(6380) 节点
可以查看到,6380 已成为 master
然后我们可以看到, 即使我们把原 master 节点恢复运行, 它也降级成为了 slave
Cluster 集群模式搭建
Redis 的 Cluster 集群模式, 启动还挺简单
主要有两步
- 配置文件
- 启动验证
集群节点
根据官方推荐,集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式。
节点 | 配置 | 端口 |
---|---|---|
cluster-master1 | redis_7001.conf | 7001 |
cluster-master2 | redis_7002.conf | 7002 |
cluster-master3 | redis_7003.conf | 7003 |
cluster-slave1 | redis_7004.conf | 7004 |
cluster-slave2 | redis_7005.conf | 7005 |
cluster-slave3 | redis_7006.conf | 7006 |
配置文件
咱们准备 6 个配置文件 ,端口:7001,7002,7003,7004,7005,7006;分别命名成 redis_7001.conf …redis_7006.conf
redis_7001.conf 配置文件内容如下,复制6份并替换端口号
# 通用配置
cluster-enabled yes # 启用集群模式
cluster-node-timeout 15000 # 超时时间
appendonly yes # 开启AOF持久化
daemonize yes # 后台启动
protected-mode no # 非保护模式
port 7001 # 端口
dir "/var/lib/redis/7001" # 设置工作目录
# 根据你启用的节点来命名,最好和端口保持一致,这个是用来保存其他节点的名称,状态等信息的【会自动生成在上面配置的dir目录下】
cluster-config-file nodes-7001.conf
pidfile /var/run/redis_7001.pid # 运行时PID文件pidfile
logfile /var/log/redis_7001.log # 指定日志文件目录
创建集群
挨个启动节点
$ redis-server redis_7001.conf
...
$ redis-server redis_7006.conf
看以下启动情况
启动集群
# 执行命令
# `--cluster-replicas 1` 命令的意思是创建 master 的时候同时创建一个 slave
# 创建集群
$ redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
执行成功结果如下:
我们可以看到 7001,7002,7003 成为了 master 节点,分别占用了 slot [0-5460],[5461-10922],[10923-16383]
以上信息展示了集群的主从节点信息及主-丛节点关联信息;这里我们需要手动输入 ‘yes’ 来确认
检查集群
$ redis-cli --cluster check 127.0.0.1:7001
实例测试
集群搭建完成后,我们需要测试是否能够正常运行
# 注意:集群模式下连接客户端要带参数 -c,表示集群,否则不能正常存取数据
$ redis-cli -p 7001 -c
# 设置k1
$ set k1 akieay
-> Redirected to slot [12706] located at 127.0.0.1:7003
OK
# 这里可以看到存储 k1 时,首先根据key计算出对应的 slot,然后选择相应的主节点;这里自动跳到了 7003
# 然后我们在 7003 节点获取 k1,可以看到能正常获取
$ get k1
"akieay"
# 切换到 7001 获取 k1,可以看到会自动重定向到 7003,然后返回 结果
$ redis-cli -p 7001 -c
$ get k1
-> Redirected to slot [12706] located at 127.0.0.1:7003
"akieay"
127.0.0.1:7003>