- 搭建MySQL集群一主一从&双主双从:https://yuanyu.blog.csdn.net/article/details/106320629
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单机搭建
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
启动时,指定配置文件路径即可
### 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 主从复制
2.1 准备环境
IP | 角色 |
---|---|
192.168.0.101 | Master |
192.168.0.108 | Slave |
192.168.0.109 | Slave |
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 哨兵监控
3.1 节点准备
角色 | IP |
---|---|
Master | 192.168.0.101 |
Slave | 192.168.0.118 |
Slave | 192.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 集群搭建
Redis 集群搭建在5版本以前使用Ruby构建集群,而5版本以后直接使用 redis-cli
命令创建集群了。
4.1 节点准备
IP | Redis节点 |
---|---|
192.168.0.101 | 6371,6372 |
192.168.0.102 | 6373,6374 |
192.168.0.103 | 6375,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 节点与插槽管理
重新搭建了一个集群,集群信息如下表所示
IP | Redis节点 |
10.4.42.101 | 6371,6372 |
10.4.42.102 | 6373,6374 |
10.4.42.104 | 6375,6376 |
10.4.42.105 | 6377,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 命令执行时最多转发次数