说明:单机的Redis存在许多的问题,如数据丢失问题、高并发问题、故障恢复问题、海量数据的存储能力问题,针对这四个问题,对应解决方式有:数据持久化(参考:http://t.csdn.cn/SSyBi)、搭建主从集群、Redis哨兵和搭建分片集群;
本文介绍搭建Redis主从集群和哨兵,用以解决单机Redis的并发问题和故障恢复问题。操作系统是CentOS 7,远程连接工具是WindTerm。
首先,先安装单机的Redis
可在官网(https://redis.io/download/#redis-downloads)下载,下载完成后将压缩包复制到云服务器或者Linux虚拟机里;
我这里放在/tmp/essay目录下
我安装过了,首次安装需要一点时间
yum install -y gcc tcl
tar -xvf redis-6.2.4.tar.gz
进入redis目录
cd redis-6.2.4
执行编译命令
make && make install
全程没有爆红,就是编译完成
需要修改两个地方,一个是绑定地址(75行),默认是127.0.0.1,本地访问,需要修改为0.0.0.0,表示任意IP访问;
第二个是数据库数量(327行),默认是16,我们设置为1;
可通过下面的命令查看配置文件中对应的配置是否已经更改
grep -rina "关键字" 文件
修改完之后再看,已经修改完成
redis-server redis.conf
如果出现了端口被占用的情况,可使用下面两个命令,查看端口被占用的进程PID,再强制结束该进程;
ps -ef |grep 端口号
kill -9 进程ID
关闭Redis(ctrl+c
),开始搭建主从集群
将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
修改对应目录下的配置文件中的端口号,注意路径,我这里的是/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
修改每个目录里的配置文件,使每个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服务器是相互独立的,没有主从关系。需要进入到对应的客户端里,建立主从关系;
# 指定端口进入对应的redis客户端
redis-cli -p 端口号
# 在子节点中设置master节点
slaveof master节点的IP 端口号
# 在master节点中查看子节点信息
info replication
例如设置8001为master节点,8002、8003均为8001的子节点
在master节点的redis日志中,可以看到另外两个节点发过来的同步请求同步信息;
同样,在另外两个子节点也可以看到对应的日志信息;
如果无法关联主从关系,检查一下三个redis.conf文件中的这行配置是否已经设置为0.0.0.0
正如前面所说,搭建主从集群,可以解决高并发问题,这是通过读写分离实现的。
子节点没有写能力,只有读能力;
master节点有读写能力;
通过搭建主从集群,实现读写分离,可解决高并发问题。
另外,值得一提的是:
(1)主从集群可以设置临时和永久两种模式,上面通过命令行的方式设置的是临时模式,重启redis服务后失效。想要设置永久模式,可将命令写在对应的redis.conf配置文件中。
(2)在redis 5.0以后,新增了replicaof命令,效果与slaveof一样。
在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"
在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
通过日志信息,可以看到哨兵已经监测到了前面的主从集群
手动尝试把8001master节点宕机,查看另外两个子节点是否可以异常恢复;
(8002端口Redis:可以发现,8002有关于8001、8003的请求同步日志,说明此时8002成为新的master节点)
(8003端口Redis:可以看到8001宕机后,8003连接数次失败后,转为连接8002,说明此时8002称为新的master节点)
查看哨兵日志,可以看到详细的日志记录,表明8001宕机后,8002称为了新的master节点;
(哨兵日志图片.png)
如果此时8001重新上线,将作为8002的子节点
通过增加哨兵,可以解决单机Redis故障问题