上一篇写了windows环境下搭建redis集群,常用的集群还是搭建在linux服务器上。这里准备了三台可以互相ping通的机器:
IP地址 | 端口号 | 角色 |
---|---|---|
xxx.xx.xxx.151 | 6379 | 主机(master) |
xxx.xx.xxx.32 | 6380 | 从机(slave) |
xxx.xx.xxx.126 | 6381 | 从机(slave) |
一、redis安装部署:首先需要在三台机器上分别安装redis,步骤同前面的单机版安装。
1、下载:到redis官网https://redis.io/download下载后上传到机器上或者使用命令下载:
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
2、安装:
(1)解压安装包:
tar xzf redis-5.0.7.tar.gz
(2)进入解压文件目录使用make
命令对解压的 redis 文件进行编译:
cd redis-5.0.7
make
编译完成之后,可以看到解压文件 redis-5.0.7 中会有对应的 src、conf 等文件
(3)编译成功后,进入 src 文件夹,执行 make install 进行 Redis 安装:
cd src/
make install
3、部署:由于 src 下文件非常多,可以将几个常用的命令和 conf 配置文件复制出来进行统一管理:
(1)新建 bin 和 etc 文件夹
cd /root/redis-5.0.7/
mkdir etc
mkdir bin
(2)回到安装目录,将redis.conf
复制到 ect 文件夹下:
cp redis.conf /root/redis-5.0.7/etc
(3)进入 src 文件夹下,将mkreleasehdr.sh
、redis-benchmark
、redis-check-aof
、redis-check-rdb
、redis-cli
、redis-server
、redis-sentinel
文件复制到 bin 文件夹:
cd src/
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /root/redis-5.0.7/bin/
查看复制后的文件,如下
4、启动redis:
切换到 bin 目录,使用./redis-server
即可启动 redis 服务,但是这种方式没有指明配置文件,redis 将采用默认配置,所以需要让 redis 按照刚才的配置文件来启动:
cd /root/redis-5.0.7/bin
./redis-server /root/redis-5.0.7/etc/redis.conf
如我启动151机器:
验证:查看进程 ps axu|grep redis
注意这里ip地址是127.0.0.1而不是0.0.0.0,只是本机能使用,打开redis.conf文件将bind 127.0.0.1改成bind 0.0.0,并重启redis,外部才可以连接上。
通过RedisDesktopManager连接:
5、redis关闭命令:redis-cli -p 6379 shutdown
二、主从配置:主要是修改redis.conf配置文件(/root/redis-5.0.7/etc/redis.conf)
1、主机配置:主机(151机器)需要改动的配置如下:
bind:0.0.0.0
port:6379
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:wtyy
masterauth:wtyy
修改配置文件后需要重启redis:
2、从机配置:从机的配置和主机相似,不同的地方是需要使用replicaof
指定主机(master)的IP地址和端口,需要注意的是老版本使用的是 slaveof,目前我使用的5.0.7版本要使用 replicaof :
bind:0.0.0.0
port:从机自定义的端口号
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:wtyy
masterauth:wtyy
replicaof xxx.xx.xxx.151 6379
同样的需要重启下:
redis-cli -p 从机端口号 shutdown
ps axu|grep redis
cd /root/redis-5.0.7/bin
./redis-server /root/redis-5.0.7/etc/redis.conf
ps axu|grep redis
3、数据同步:
上面主从节点的配置文件配置好后,重启 redis 服务,进入 bin 目录即可查看配置文件中指定的redis.log
日志文件。如果机器开启了防火墙,还需求设置一下防火墙,否则主从机之间无法同步数据,命令如下:
firewall-cmd --add-port=6379/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
至此主从结构搭建完毕。验证下:
(1)主151机器:可以看到当前角色为主机(master),并且连接了另外两台从机(slave)
cd /root/redis-5.0.7/bin/
./redis-cli
auth wtyy
info replication
(2)从32机器:可以看到当前角色为从机(slave),并指明了主机地址ip
和端口6379
cd /root/redis-5.0.7/bin/
./redis-cli -p 6380
auth wtyy
info replication
(3)从126机器:可以看到当前角色为从机(slave),并指明了主机地址ip
和端口6379
cd /root/redis-5.0.7/bin/
./redis-cli -p 6381
auth wtyy
info replication
4、主从复制验证:
现在从项目中往主机写入数据:
server.port=9999
server.context-path=/redisgroup
my.redis.server.host=xxx.xx.xxx.151
my.redis.server.port=6379
my.redis.server.password = wtyy
my.redis.server.jedis.pool.maxTotal=500
my.redis.server.jedis.pool.maxIdle=10
my.redis.server.jedis.pool.maxWaitMillis=5000
my.redis.server.jedis.pool.min-idle=5
my.redis.server.timeout=5000
package com.demo.controller;
import com.demo.config.RedisClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.security.Key;
@RestController
@RequestMapping("index")
public class IndexController {
@Autowired
private RedisClient redisClient;
private String nameFormat = "redis:name:{name}";
@RequestMapping("/setName")
public void setName(String key,String value){
redisClient.set(nameFormat,value,key);
}
@RequestMapping("/getName")
public String getName(String key){
return redisClient.get(nameFormat,key);
}
}
访问:http://localhost:9999/redisgroup/index/setName?key=user&value=wtyy666,可以看到三台机器都有了同样的数据:
注意从机只能读不可以写入数据,如把配置改成:
my.redis.server.host=xxx.xx.xxx.126
my.redis.server.port=6381
my.redis.server.password = wtyy
会报错:
而http://localhost:9999/redisgroup/index/getName?key=user读取接口是可以正常返回数据的。
三、哨兵配置:主要是修改sentinel.conf配置文件。这里我们每个redis各部署一个哨兵,三台机器的配置方式相同。
1、同样为了方便管理,首先将sentinel.conf
复制到 etc 下
cd /data/redis-5.0.7/
cp sentinel.conf /root/redis-5.0.7/etc/
2、修改sentinel.conf文件,需要改动的配置如下:
//端口默认为26379。
port:26379
//关闭保护模式,可以外部访问。
protected-mode:no
//设置为后台启动。
daemonize:yes
//日志文件。
logfile:./sentinel.log
//指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
sentinel monitor mymaster xxx.xx.xxx.151 6379 2
//当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster wtyy
//这里设置了主机多少秒无响应,则认为挂了。
sentinel down-after-milliseconds mymaster 3000
//主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
snetinel parallel-syncs mymaster 1
//故障转移的超时时间,这里设置为三分钟。
sentinel failover-timeout mymaster 180000
同样的如果机器开启了防火墙,要把防火墙的26379端口打开:
firewall-cmd --add-port=26379/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
3、分别启动三个哨兵:
cd /root/redis-5.0.7/bin/
./redis-sentinel /root/redis-5.0.7/etc/sentinel.conf
三个哨兵都启动后,可使用如下命令查看哨兵信息
redis-cli -p 26379
info sentinel
可以看到,哨兵已经监听到当前的主机IP端口和运行状态,并且应该有2台从机,3个哨兵:
但是我的:哨兵显示2个,好像也不影响。
至此,哨兵搭建完成。
4、容灾切换演示:
现在模拟主机宕机,将主机151机器的 redis 服务关闭,如下
这时候重新进一下32机器:
再重新进一下126机器:
发现哨兵(Sentinel)通过选举机制选举了从机(32)作为了新的主机。需要注意的是,主从切换后配置文件已经被自动进行了更改,现在看一下新上位的主机 redis 日志,可以看到,当主机挂了的时候,一直连接主机被拒绝,当哨兵选举它为主机后,它成功执行重写的配置文件,并且连接了其他从机:
5、对比演示:在上面的基础上,把151上的redis再启起来,
现在的情况是:32主,151从,126从。
现在把三台机器上的哨兵都关闭:
再把此时的主机(32机器)上的redis服务关闭:
这时候重新查看下151、126机器上的redis,显示主机32的状态是down,但是151和126仍然都是从机,并没有新的主机产生:
由此可见哨兵的主从切换功能。
四、命令总结:
1、启动命令:
cd /root/redis-5.0.7/bin
#启动redis
./redis-server /root/redis-5.0.7/etc/redis.conf
#启动哨兵
./redis-sentinel /root/redis-5.0.7/etc/sentinel.conf
2、执行其他命令:注意,启动了哨兵后,哨兵也是一个redis,只不过角色是哨兵。
执行其他命令需要先连接redis服务:
#进入bin目录
cd /root/redis-5.0.7/bin
#连接redis服务,如果端口号是使用默认的6379,直接使用./redis-cli即可
./redis-cli -p 端口号
#如果没有密码,可以省略这一步
auth 密码
连接redis后就可以执行redis命令了,常用的有:
#查看主/从复制的相关信息
info replication
#查看和集群相关的信息
info cluster
#查看哨兵信息
info sentinel
#关闭redis服务
shutdown
参考:https://blog.csdn.net/xch_yang/article/details/104019552