目录
搭建单机环境
首先需要安装Redis所需要的依赖:
yum install -y gcc tcl
然后将课前资料提供的Redis安装包上传到虚拟机的/usr/local/src
目录:
然后进入到目录中进行解压缩:
cd /usr/local/src
tar -zxvf redis-6.2.4.tar.gz
进入redis目录,运行编译安装命令,将程序安装到/usr/local
下:
cd redis-6.2.4
make & make PREFIX=/usr/local/redis install
如果没有出错,应该就安装成功了,接下来将redis的命令文件配置到环境变量中
# 修改/etc/profile
vim /etc/profile
# 在文件最后追加redis的命令
export PATH=$PATH:/usr/local/redis/bin
# 更新配置文件
source /etc/profile
接下来修改下配置文件:
# 启动单节点的redis
mkdir /usr/local/redis/single
cd /usr/local/redis/single
# 复制redis.conf文件到当前目录
cp /usr/local/src/redis-6.2.4/redis.conf ./
# 修改配置
vim redis.conf
配置内容
# 所有主机都可以访问 75行
bind 127.0.0.1 --> bind 0.0.0.0
# 端口 98行
port 6379
# 是否以守护线程方式执行(后台运行) 257行
daemonize no --> daemonize yes
# pid 文件存储位置 用来锁定写操作只有获得该锁的进程才有写入权限 289行
pidfile /var/run/redis_6379.pid
# 日志文件存储位置 302行
logfile ""
# 数据存储的名字 431行
dbfilename 6379.rdb
# 数据存储的路径,当前运行的目录 454行
dir ./
启动Redis:
redis-server redis.conf
查看redis进程
ps -ef|grep redis
通过Redis客户端连接
redis-cli -h IP或者主机名 -p 端口
关闭redis服务
redis-cli shutdown
搭建主从集群
集群结构
我们搭建的主从集群结构如图:
共包含三个节点,一个主节点,两个从节点。这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
PORT | 角色 |
---|---|
7001 | master |
7002 | slave |
7003 | slave |
准备
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件
复制资料中的 master-slave 文件夹到虚拟机中
配置文件中修改了每个实例的端口、rdb文件保存位置
启动
使用资料中的 start-all.sh
快速启动3个redis实例
# 切换目录
cd master-slave/
# 添加执行权限
chmod +x st*
# 运行启动脚本
./start-all.sh
它相当于同时执行了下面三个命令
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
配置
现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
修改从节点配置文件,在redis.conf中添加一行配置:replicaof <masterip> <masterport>
也就是7002-redis.conf和7003-redis.conf的第477行,添加replicaof 127.0.0.1 7001
修改完毕重启redis,然后连接主(7001节点),查看集群状态:
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication
结果:
测试
执行下列操作以测试:
-
利用redis-cli连接7001,执行
set num 123
-
利用redis-cli连接7002,执行
get num
,再执行set num 666
-
利用redis-cli连接7003,执行
get num
,再执行set num 888
可以发现,只有在7001这个master节点上可以执行写操作,7002和7003这两个slave节点只能执行读操作。
搭建哨兵集群
集群结构
这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。如图:
三个sentinel实例信息如下:
节点 | IP | PORT |
---|---|---|
s1 | 127.0.0.1 | 27001 |
s2 | 127.0.0.1 | 27002 |
s3 | 127.0.0.1 | 27003 |
准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件:
复制资料中的sentinel
目录到虚拟机中,修改内容
# 修改哨兵配置文件
bind 0.0.0.0
port 27001
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
# 配置监控数据节点 mymaster是主节点的别名 后面是主机地址 端口
# 2表示判断主节点故障需要至少2个哨兵节点同意,超过半数同意及判断节点故障,所以一般情况下哨兵节点的个数设置为奇数 84行
sentinel monitor mymaster 127.0.0.1 7001 2
# 哨兵节点定期发送ping命令判断redis数据节点和其他哨兵节点是否可达,如果超过这个时间没有相应,则判断节点不可达,默认是30秒,单位为毫秒 125行
sentinel down-after-milliseconds mymaster 30000
# 故障转移完成后,每次向新的主节点发起复制操作的从节点个数 200行
sentinel parallel-syncs mymaster 1
# 故障转移超时时间,默认3分钟 225行
sentinel failover-timeout mymaster 180000
启动
启动3个redis实例,启动命令:
# 第1个
redis-sentinel sentinel-27001.conf
# 第2个
redis-sentinel sentinel-27002.conf
# 第3个
redis-sentinel sentinel-27003.conf
注意: 设置主从配置后reids会自动更改配置文件中的内容,确保重新复制master-slave中的配置到虚拟机中
测试
尝试让master节点7001宕机,查看sentinel日志:
查看7003的日志:
查看7002的日志:
搭建分片集群
集群结构
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:
角色 | IP | port | 槽分配 | 说明 |
---|---|---|---|---|
master-1 | 127.0.0.1 | 7001 | {0..5460} | 主节点 |
master-2 | 127.0.0.1 | 7002 | {5461..10922} | 主节点 |
master-3 | 127.0.0.1 | 7003 | {10923..16383} | 主节点 |
slave-1 | 127.0.0.1 | 7004 | 从节点 | |
slave-2 | 127.0.0.1 | 7005 | 从节点 | |
slave-3 | 127.0.0.1 | 7006 | 从节点 |
准备实例和配置
复制资料中的 cluster
目录到虚拟机中,主要修改内容如下:
bind 0.0.0.0
port 7001
daemonize yes
pidfile /var/run/redis_cluster_7001.pid
dbfilename 7001.rdb
dir ./
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file nodes-7001.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
启动
使用脚本开启集群
# 加权
cd /usr/local/redis/cluster
chmod +x st*
# 启动
./start-all.sh
# 通过客户端连接
redis-cli -p 7001
# 查看集群节点信息
cluster nodes
创建集群
虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
接下来,我们需要执行命令来创建集群
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
命令说明:
-
redis-cli --cluster
代表集群操作命令 -
create
:代表是创建集群 -
--replicas 1
或者--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
# 输入yes
查看集群信息
redis-cli -p 7001 cluster nodes
测试
尝试连接7001节点,存储一个数据:
# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1
结果悲剧了:
集群操作时,需要给redis-cli
加上-c
参数才可以:
redis-cli -c -p 7001
这次可以了: