Centos7搭建Redis单机&主从&哨兵&集群

 centos7

### 关闭防火墙
systemctl stop firewalld

### 查看redis
ps -ef | grep redis

### 连接客户端
/usr/local/redis/bin/redis-cli -a 123456
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring.cloud.version>Hoxton.SR11</spring.cloud.version>
    <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
    <spring.boot.version>2.3.10.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-pool2</artifactId>
	</dependency>
</dependencies>

1 Redis单机搭建

https://www.imooc.com/wiki/Redis6/chapter1e.html

1.1 下载安装包并解压

### 下载(/usr/local/src)
wget https://download.redis.io/releases/redis-6.2.3.tar.gz
### 解压
tar -zxvf redis-6.2.3.tar.gz

1.2 安装依赖

### 安装依赖
yum -y install gcc-c++ autoconf automake

redis6.x适配的是centos8,centos7的GCC版本较低需要升级

升级 GCC

# 安装 scl 源
yum install -y centos-release-scl scl-utils-build

# 安装 9 版本的 gcc、gcc-c++、gdb 工具链(toolchian)
yum install -y devtoolset-9-toolchain

# 临时覆盖系统原有的 gcc 引用
scl enable devtoolset-9 bash

# 查看 gcc 当前版本
gcc -v

1.3 预编译和安装

### 切换到解压目录
cd /usr/local/src/redis-6.2.3
### 预编译
make

### 创建安装目录
mkdir -p /usr/local/redis
### 安装
make PREFIX=/usr/local/redis/ install 

安装成功如图

安装成功后的几个文件解释

  • redis-benchmark 性能测试工具
  • redis-check-aof AOF文件修复工具
  • redis-check-rdb RDB文件修复工具
  • redis-cli 客户端命令行
  • redis-sentinal 集群管理工具
  • redis-server 服务进程指令

1.4 启动

1.4.1 redis-server命令

### bin目录下面区执行(/usr/local/redis/bin)
./redis-server
### 任意目录执行
/usr/local/redis/bin/redis-server

执行Ctrl + C就会停止服务

1.4.2 守护进程启动

redis.conf是Redis的配置文件,安装完后,可以复制redis.conf文件到安装路径下

###
mkdir /usr/local/redis/conf
###
cp /usr/local/src/redis-6.2.3/redis.conf /usr/local/redis/conf/

修改安装路径下的redis.conf,将daemonize修改为yes

image11.png

启动时,指定配置文件路径即可

### bin目录下执行
./redis-server ../conf/redis.conf
###
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

1.4.3 配置开机启动(centos7以上)

1、在系统服务目录里创建redis.service文件

vim /etc/systemd/system/redis.service

写入以下内容:

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

配置描述:

Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间

注意:[Service]的启动、重启、停止命令全部要求使用绝对路径

### 重载系统服务
systemctl daemon-reload

2、测试并加入开机自启

### 关闭redis-server
systemctl stop redis.service
### 开启redis-server
systemctl start redis.service
### 查看redis-server状态
systemctl status redis.service

3、开启成功,将服务加入开机自启

systemctl enable redis.service
systemctl disable redis.service

1.5 SpringBoot配置

application.yml

spring:
  # Redis
  redis:
    port: 6379 # Redis 服务器端口
    host: 192.168.10.101 # Redis 服务器地址
    timeout: 3000 # 连接超时时间
    password: 123456 # Redis 服务器密码

2 主从复制

https://www.imooc.com/wiki/Redis6/chapter61.html

2.1 准备环境

IP角色
192.168.0.101Master
192.168.0.108Slave
192.168.0.109Slave

2.2 创建配置/数据/日志目录

# 创建配置目录
mkdir -p /usr/local/redis/conf
# 创建数据目录
mkdir -p /usr/local/redis/data
# 创建日志目录
mkdir -p /usr/local/redis/log

2.3 修改配置文件

创建一份配置文件至 conf 目录

vim /usr/local/redis/conf/redis.conf

修改三个 Redis 节点配置文件中以下内容

# 放行访问IP限制
bind 0.0.0.0
# 后台启动
daemonize yes
# 日志存储目录及日志文件名
logfile "/usr/local/redis/log/redis.log"
# rdb数据文件名
dbfilename dump.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename "appendonly.aof"
# rdb数据文件和aof数据文件的存储目录
dir /usr/local/redis/data
# 设置密码
requirepass 123456
# 从节点访问主节点密码(必须与 requirepass 一致)
masterauth 123456
# 从节点只读模式
replica-read-only yes

从节点(108/109)中额外添加以下内容

# 下面的配置无需在主节点中配置
# 从节点属于哪个主节点
slaveof 192.168.0.101 6379

2.4 启动

三个节点分别运行以下命令:

/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

2.5 检查

每个节点自带的客户端连接至 Redis 服务

/usr/local/redis/bin/redis-cli -a 123456

通过 info replication 查看主从信息,检查环境是否搭建成功

127.0.0.1:6379> info replication

然后在主节点插入一条数据,测试从节点是否可读取(是否复制成功),测试从节点是否可写数据(从节点只读模式是否生效)

2.6 SpringBoot配置

application.yml

 

2.7 原理剖析

2.7 手动恢复故障


3 哨兵监控

https://www.imooc.com/wiki/Redis6/chapter71.html

3.1 节点准备 

角色IP
Master192.168.0.101
Slave192.168.0.118
Slave192.168.0.119

3.2 编写配置文件

三个节点分别创建 sentinel.conf 并添加以下配置

vi /usr/local/redis/conf/sentinel.conf
# 放行所有 IP 限制
bind 0.0.0.0
# 进程端口号
port 26379
# 后台启动
daemonize yes
# 日志记录文件
logfile "/usr/local/redis/log/sentinel.log"
# 进程编号记录文件
pidfile /var/run/sentinel.pid
# 指示 Sentinel 去监视一个名为 mymaster 的主服务器
sentinel monitor mymaster 192.168.0.101 6379 2
# 访问主节点的密码
sentinel auth-pass mymaster 123456
# Sentinel 认为服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 10000
# 若 Sentinel 在该配置值内未能完成 failover 操作,则认为本次 failover 失败
sentinel failover-timeout mymaster 180000

3.3 启动

先启动 3 个 Redis 服务

/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

再启动 3 个 Sentinel 服务

/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf

查看日志

tail -f /usr/local/redis/log/sentinel.log

3.4 SpringBoot配置

application.yml

spring:
  # Redis
  redis:
    port: 6379 # Redis 服务器端口,哨兵模式下不一定非要配置为主节点,只要是主从环境中任何一个节点即可
    host: 192.168.10.101 # Redis 服务器地址
    timeout: 3000 # 连接超时时间
    password: 123456 # Redis 服务器密码
    # lettuce 连接池
    lettuce:
      pool:
        max-active: 8 # 最大连接数,默认 8
        max-idle: 8 # 最大空闲连接,默认 8
        min-idle: 0 # 最小空闲连接,默认 0
        max-wait: 1000 # 最大连接阻塞等待时间,单位毫秒,默认 -1
    # 哨兵
    sentinel:
      # 主节点名称
      master: mymaster
      # 主从服务器地址
      nodes: 192.168.10.101:26379,192.168.10.102:26379,192.168.10.103:26379

3.5 故障转移演示

模拟主节点故障

kill -9 杀死 Redis 主节点,down-after-milliseconds 时间满足以后,观察 Sentinel 日志是否会发起重新选举操作,内容如下


4 集群搭建

https://www.imooc.com/wiki/Redis6/chapter81.html

Redis 集群搭建在5版本以前使用Ruby构建集群,而5版本以后直接使用 redis-cli 命令创建集群了。

4.1 节点准备

IPRedis节点
192.168.0.1016371,6372
192.168.0.1026373,6374
192.168.0.1036375,6376

4.2 创建目录

三个节点分别创建以下目录:

mkdir -p /usr/local/redis/cluster/conf /usr/local/redis/cluster/data /usr/local/redis/cluster/log

4.3 编写配置文件

三个节点分别创建 redis-*.conf 并添加以下配置(* 为具体端口为了区分文件)。

注意:修改配置文件中所有 IP 和端口部分内容,可以使用 vi 命令 %s/old/new/g 全局替换。

vi /usr/local/redis/cluster/conf/redis-6371.conf
vi /usr/local/redis/cluster/conf/redis-6372.conf
vi /usr/local/redis/cluster/conf/redis-6373.conf
vi /usr/local/redis/cluster/conf/redis-6374.conf
vi /usr/local/redis/cluster/conf/redis-6375.conf
vi /usr/local/redis/cluster/conf/redis-6376.conf

配置文件 

# 放行访问IP限制
bind 0.0.0.0
# 端口
port 6371
# 后台启动
daemonize yes
# 日志存储目录及日志文件名
logfile "/usr/local/redis/cluster/log/redis-6371.log"
# rdb数据文件名
dbfilename dump-6371.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename "appendonly-6371.aof"
# rdb数据文件和aof数据文件的存储目录
dir /usr/local/redis/cluster/data
# 设置密码
requirepass 123456
# 从节点访问主节点密码(必须与 requirepass 一致)
masterauth 123456
# 是否开启集群模式,默认 no
cluster-enabled yes
# 集群节点信息文件,会保存在 dir 配置对应目录下
cluster-config-file nodes-6371.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点 IP
cluster-announce-ip 192.168.10.101
# 集群节点映射端口
cluster-announce-port 6371
# 集群节点总线端口
cluster-announce-bus-port 16371

1、全局修改端口号

%s/6371/new/g

2、修改集群节点IP cluster-announce-ip

每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。

第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信。

4.4 创建 Redis Cluster 集群

启动 6 个 Redis 节点

/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6371.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6372.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6373.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6374.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6375.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6376.conf

创建集群

随便一个 Redis 节点中使用客户端运行以下命令即可(注意IP和端口):

/usr/local/redis/bin/redis-cli -a 123456 --cluster create \
192.168.0.101:6371 192.168.0.101:6372 \
192.168.0.102:6373 192.168.0.102:6374 \
192.168.0.103:6375 192.168.0.103:6376 \
--cluster-replicas 1
  • --cluster:构建集群环境的所有 Redis 节点 IP + PORT 信息
  • --cluster-replicas 1:主节点数/从节点数的比例,使用一比一的比例,6 个节点最终会产生 3 主 3 从的集群环境

### 连接集群
/usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.0.103 -p 6376

### 检查集群状态
/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.0.101:6371

4.4 节点与插槽管理

重新搭建了一个集群,集群信息如下表所示

IPRedis节点
10.4.42.1016371,6372
10.4.42.1026373,6374
10.4.42.1046375,6376
10.4.42.1056377,6378

4.4.1 添加主节点

首先准备一个新的节点,添加配置文件。

### 创建目录
mkdir -p /usr/local/redis/cluster/conf /usr/local/redis/cluster/data /usr/local/redis/cluster/log

### 编写配置文件
vi /usr/local/redis/cluster/conf/redis-6377.conf
# 放行访问IP限制
bind 0.0.0.0
# 端口
port 6377
# 后台启动
daemonize yes
# 日志存储目录及日志文件名
logfile "/usr/local/redis/cluster/log/redis-6377.log"
# rdb数据文件名
dbfilename dump-6377.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename "appendonly-6377.aof"
# rdb数据文件和aof数据文件的存储目录
dir /usr/local/redis/cluster/data
# 设置密码
requirepass 123456
# 从节点访问主节点密码(必须与 requirepass 一致)
masterauth 123456
# 是否开启集群模式,默认 no
cluster-enabled yes
# 集群节点信息文件,会保存在 dir 配置对应目录下
cluster-config-file nodes-6377.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点 IP
cluster-announce-ip 10.4.42.105
# 集群节点映射端口
cluster-announce-port 6377
# 集群节点总线端口
cluster-announce-bus-port 16377

启动新的节点。

/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6377.conf

添加主节点

添加主节点前需要查看集群信息,找到集群中已存在的最后一个主节点的 IP 和端口

使用以下命令添加主节点。

/usr/local/redis/bin/redis-cli -a 123456 \
--cluster add-node 10.4.42.105:6377 10.4.42.104:6375 \
--cluster-master-id cfb0dceecaa697051fed51e2b39e50b577e26012

redis-cli \
--cluster add-node new_host:new_port existing_host:existing_port \
--cluster-master-id node_id

  • new_host:new_port:为要新添加的主节点 IP 和端口
  • existing_host:existing_port:表示的是环境中已存在的最后一个主节点的 IP 和端口,这个可以通过查看节点信息得知,根据 slots 槽数,10.4.42.104:6375 对应的节点槽数是 10923-16383,16383 表示的是最后的槽数
  • --cluster-master-id:表示的是最后一个主节点的节点 ID,表示的是新添加的主节点要在这个节点后面

再次查看集群信息

/usr/local/redis/bin/redis-cli -c -a 123456 -h 10.4.42.101 -p 6371 cluster nodes

会发现 6377 端口对应的节点已经加入到集群中,是主节点,但是没有从节点,也没有分配槽数。

重新分片

添加完新节点后,需要对新添加的主节点进行 hash 槽重新分配,这样该主节点才能存储数据,Redis 共有16384个槽

/usr/local/redis/bin/redis-cli -a 123456 \
--cluster reshard 10.4.42.105:6377 \
--cluster-from b861b7ec62c278e4be74636967adbc4dc6f099a1 \
--cluster-to 84aabd0a23d4c0bd5e9f39524bcd7a199a1f6bfc \
--cluster-slots 2000

redis-cli \
--cluster reshard host:port \
--cluster-from node_id \
--cluster-to node_id \
--cluster-slots <args> \
--cluster-yes

  • host:port:集群中随便一个节点的 IP:PORT 连接集群用的
  • --cluster-from node_id:表示的是从哪个节点取出槽,节点 ID
  • --cluster-to node_id:表示的是取出的槽添加给哪个节点,也就是新添加的那个主节点 ID
  • --cluster-slots 2000:表示的是给新主节点分配多少,此处 2000 表示是分配从 0-1999 个 slots 槽数,然后需要输入 yes 重新进行槽分配。
  • --cluster-yes:不回显槽分配信息直接移动。

再次查看集群信息

# 会发现 6377 端口对应的主节点已经有 slots 槽数了,并且是从 0 开始的
/usr/local/redis/bin/redis-cli -c -a 123456 -h 10.4.42.101 -p 6371 cluster nodes

4.4.2 添加从节点

准备节点

首先准备一个新的节点,添加配置文件。

### 编写配置文件
vi /usr/local/redis/cluster/conf/redis-6378.conf
# 放行访问IP限制
bind 0.0.0.0
# 端口
port 6378
# 后台启动
daemonize yes
# 日志存储目录及日志文件名
logfile "/usr/local/redis/cluster/log/redis-6378.log"
# rdb数据文件名
dbfilename dump-6378.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename "appendonly-6378.aof"
# rdb数据文件和aof数据文件的存储目录
dir /usr/local/redis/cluster/data
# 设置密码
requirepass 123456
# 从节点访问主节点密码(必须与 requirepass 一致)
masterauth 123456
# 是否开启集群模式,默认 no
cluster-enabled yes
# 集群节点信息文件,会保存在 dir 配置对应目录下
cluster-config-file nodes-6378.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点 IP
cluster-announce-ip 10.4.42.105
# 集群节点映射端口
cluster-announce-port 6378
# 集群节点总线端口
cluster-announce-bus-port 16378

启动新的节点。

/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6378.conf

添加从节点

使用以下命令添加从节点。

/usr/local/redis/bin/redis-cli -a 123456 \
--cluster add-node 10.4.42.105:6378 10.4.42.105:6377 \
--cluster-slave \
--cluster-master-id 84aabd0a23d4c0bd5e9f39524bcd7a199a1f6bfc

redis-cli \
--cluster add-node new_host:new_port existing_host:existing_port \
--cluster-slave \
--cluster-master-id node_id

  • new_host:new_port:表示的是要添加的那个从节点的 IP 和端口
  • existing_host:existing_port:表示的是要给哪个主节点添加从节点
  • --cluster-slave:表示的是要添加从节点
  • --cluster-master-id node_id:表示要给哪个主节点添加从节点,该主节点节点 ID

再次查看集群信息 

# 会发现 6378 端口对应的节点已经是 6377 端口对应的从节点
/usr/local/redis/bin/redis-cli -c -a 123456 -h 10.4.42.101 -p 6371 cluster nodes

4.4.3 删除从节点

/usr/local/redis/bin/redis-cli -a 123456 \
--cluster del-node 10.4.42.105:6378 87c49b01180fb369afb0323d92b3c7042e9d83ce

redis-cli \
--cluster del-node host:port node_id

  • host:port:表示的是要删除的那个节点的 IP 和端口
  • node_id:表示的是删除的那个节点的节点 ID

4.4.4 删除主节点

删除主节点稍微麻烦一点,因为主节点分配了 slots 槽,所以必须先把 slots 槽放到其他可用节点中去,然后再进行移除节点操作才行,不然会出现数据丢失问题。

重新分片

把数据移动到其它主节点中去,执行重新分片命令。

/usr/local/redis/bin/redis-cli -a 123456 \
--cluster reshard 10.4.42.105:6377

10.4.42.105:6377 分配了 2000 个槽,这里输入 2000 即可。

回车以后,出现 what is the receiving node ID?意思是你想移动到那个节点上。

我想移动到 6374 的节点上,那么此处输入 6374 节点的 ID。

回车以后,需要填写数据源节点 ID,就是 6377 节点的 ID,因为我们要把 6377 节点的数据移动至其他节点去。

回车以后,还可以继续选择其他源节点,但是我这里只想把 6377 节点分到其它地方就行,此处输入 done 即可,否则输入其它节点的 ID,最后输入 done。

最后输入 yes 等待转移结束。

删除节点

接下来,调用删除从节点的方式,删除主节点。

/usr/local/redis/bin/redis-cli -a 123456 \
--cluster del-node 10.4.42.105:6377 84aabd0a23d4c0bd5e9f39524bcd7a199a1f6bfc

4.5 SpringBoot配置

application.yml

spring:
  # Redis
  redis:
    timeout: 3000 # 连接超时时间
    password: 123456 # Redis 服务器密码
    #database: 1 # 集群模式无需配置 database
    # lettuce 连接池
    lettuce:
      pool:
        max-active: 8 # 最大连接数,默认 8
        max-idle: 8 # 最大空闲连接,默认 8
        min-idle: 0 # 最小空闲连接,默认 0
        max-wait: 1000 # 最大连接阻塞等待时间,单位毫秒,默认 -1
    # 集群
    cluster:
      nodes: 192.168.10.101:6371,192.168.10.101:6372,192.168.10.102:6373,192.168.10.102:6374,192.168.10.103:6375,192.168.10.103:6376
      max-redirects: 5 # Redis 命令执行时最多转发次数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值