搭建Redis主从集群和哨兵

说明:单机的Redis存在许多的问题,如数据丢失问题、高并发问题、故障恢复问题、海量数据的存储能力问题,针对这四个问题,对应解决方式有:数据持久化(参考:http://t.csdn.cn/SSyBi)、搭建主从集群、Redis哨兵和搭建分片集群;

本文介绍搭建Redis主从集群和哨兵,用以解决单机Redis的并发问题和故障恢复问题。操作系统是CentOS 7,远程连接工具是WindTerm。

单机安装

首先,先安装单机的Redis

第一步:下载Redis压缩包

可在官网(https://redis.io/download/#redis-downloads)下载,下载完成后将压缩包复制到云服务器或者Linux虚拟机里;

搭建Redis主从集群和哨兵_第1张图片

我这里放在/tmp/essay目录下

搭建Redis主从集群和哨兵_第2张图片

第二步:安装Redis所需的依赖

我安装过了,首次安装需要一点时间

yum install -y gcc tcl

搭建Redis主从集群和哨兵_第3张图片

第三步:解压

tar -xvf redis-6.2.4.tar.gz

搭建Redis主从集群和哨兵_第4张图片

第四步:编译

进入redis目录

cd redis-6.2.4

执行编译命令

make && make install

全程没有爆红,就是编译完成

搭建Redis主从集群和哨兵_第5张图片

搭建Redis主从集群和哨兵_第6张图片

第五步:修改配置文件

需要修改两个地方,一个是绑定地址(75行),默认是127.0.0.1,本地访问,需要修改为0.0.0.0,表示任意IP访问;

搭建Redis主从集群和哨兵_第7张图片

第二个是数据库数量(327行),默认是16,我们设置为1;

搭建Redis主从集群和哨兵_第8张图片

可通过下面的命令查看配置文件中对应的配置是否已经更改

grep -rina "关键字" 文件

可以看到地址已经修改了,可是数据库数量没有更改过来
搭建Redis主从集群和哨兵_第9张图片

修改完之后再看,已经修改完成

搭建Redis主从集群和哨兵_第10张图片

第六步:启动测试

redis-server redis.conf

可以看到,Redis可以正常启动;
搭建Redis主从集群和哨兵_第11张图片

如果出现了端口被占用的情况,可使用下面两个命令,查看端口被占用的进程PID,再强制结束该进程;

ps -ef |grep 端口号

kill -9 进程ID

搭建Redis主从集群和哨兵_第12张图片

关闭Redis(ctrl+c),开始搭建主从集群

搭建Redis主从集群和哨兵_第13张图片

主从集群

结构图

搭建Redis主从集群和哨兵_第14张图片

第一步:复制配置文件

将redis.conf配置文件拷贝三份,修改文件中对应的端口号(如8001、8002、8003),模拟三台Redis服务器;

注意,需要在Redis的目录外面操作;

# 创建三个目录,以端口号命名
mkdir 8001 8002 8003

# 复制redis配置文件到三个文件夹中
echo 8001 8002 8003 | xargs -t -n 1 cp redis-6.2.4/redis.conf

搭建Redis主从集群和哨兵_第15张图片

第二步:修改对应的端口号

修改对应目录下的配置文件中的端口号,注意路径,我这里的是/tmp/essay

sed -i -e 's/6379/8001/g' -e 's/dir .\//dir \/tmp\/essay\/8001\//g' 8001/redis.conf
sed -i -e 's/6379/8002/g' -e 's/dir .\//dir \/tmp\/essay\/8002\//g' 8002/redis.conf
sed -i -e 's/6379/8003/g' -e 's/dir .\//dir \/tmp\/essay\/8003\//g' 8003/redis.conf

在这里插入图片描述

第三步:绑定IP

修改每个目录里的配置文件,使每个Redis绑定一个固定IP,避免多个IP造成的混乱(如果是虚拟机操作);

printf '%s\n' 8001 8002 8003 | xargs -I{} -t sed -i '1a replica-announce-ip IP' {}/redis.conf

我这里改成自己云服务的内网IP,如果是虚拟机操作的话,那么改成自己虚拟机的IP就可以;

在这里插入图片描述

第四步:启动

可以创建三个窗口,分别启动这三个Redis

# 第1个
redis-server 8001/redis.conf
# 第2个
redis-server 8002/redis.conf
# 第3个
redis-server 8003/redis.conf

搭建Redis主从集群和哨兵_第16张图片

第五步:关联主从关系

此时,三台Redis服务器是相互独立的,没有主从关系。需要进入到对应的客户端里,建立主从关系;

# 指定端口进入对应的redis客户端
redis-cli -p 端口号
# 在子节点中设置master节点
slaveof master节点的IP 端口号
# 在master节点中查看子节点信息
info replication

例如设置8001为master节点,8002、8003均为8001的子节点

搭建Redis主从集群和哨兵_第17张图片

在master节点的redis日志中,可以看到另外两个节点发过来的同步请求同步信息;

同样,在另外两个子节点也可以看到对应的日志信息;

搭建Redis主从集群和哨兵_第18张图片

如果无法关联主从关系,检查一下三个redis.conf文件中的这行配置是否已经设置为0.0.0.0

搭建Redis主从集群和哨兵_第19张图片

第六步:使用

正如前面所说,搭建主从集群,可以解决高并发问题,这是通过读写分离实现的。

  • 子节点没有写能力,只有读能力;

  • master节点有读写能力;

搭建Redis主从集群和哨兵_第20张图片

小结

通过搭建主从集群,实现读写分离,可解决高并发问题。

另外,值得一提的是:

(1)主从集群可以设置临时和永久两种模式,上面通过命令行的方式设置的是临时模式,重启redis服务后失效。想要设置永久模式,可将命令写在对应的redis.conf配置文件中。

(2)在redis 5.0以后,新增了replicaof命令,效果与slaveof一样。

Redis哨兵

结构图

搭建Redis主从集群和哨兵_第21张图片

第一步:创建文件

在essay目录下,创建三个目录(s1、s2、s3),分别表示三个哨兵,端口号分别是28001、28002、28003;

# 创建三个目录
mkdir s1 s2 s3

进入s1目录,创建sentinel.conf文件,文件内容如下,补充上IP地址

# 创建sentinel.conf文件
touch sentinel.conf
port 28001
sentinel announce-ip IP地址
sentinel monitor mymaster IP地址 8001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/essay/s1"

搭建Redis主从集群和哨兵_第22张图片

第二步:复制文件到其他目录

在essay目录下,将s1中的文件复制一份到另外两个文件夹中

echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf

在这里插入图片描述

第三步:修改配置文件

修改另外两个配置文件中的端口号

sed -i -e 's/28001/28002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/28001/28003/g' -e 's/s1/s3/g' s3/sentinel.conf

在这里插入图片描述

第四步:启动哨兵

分别启动三个哨兵

# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

通过日志信息,可以看到哨兵已经监测到了前面的主从集群

搭建Redis主从集群和哨兵_第23张图片

第五步:使用

手动尝试把8001master节点宕机,查看另外两个子节点是否可以异常恢复;

搭建Redis主从集群和哨兵_第24张图片

(8002端口Redis:可以发现,8002有关于8001、8003的请求同步日志,说明此时8002成为新的master节点)

搭建Redis主从集群和哨兵_第25张图片

(8003端口Redis:可以看到8001宕机后,8003连接数次失败后,转为连接8002,说明此时8002称为新的master节点)
搭建Redis主从集群和哨兵_第26张图片

查看哨兵日志,可以看到详细的日志记录,表明8001宕机后,8002称为了新的master节点;

(哨兵日志图片.png)

如果此时8001重新上线,将作为8002的子节点

搭建Redis主从集群和哨兵_第27张图片

小结

通过增加哨兵,可以解决单机Redis故障问题

你可能感兴趣的:(redis,数据库,缓存)