环境准备
1)集群整体规划:
IP | 端口号 | 节点 |
---|---|---|
192.168.159.100 | 7000 | master |
192.168.159.100 | 7001 | master |
192.168.159.100 | 7002 | master |
192.168.159.100 | 7003 | slave—>master为7001 |
192.168.159.100 | 7004 | slave—>master为7002 |
192.168.159.100 | 7005 | slave—>master为7000 |
2)开启防火墙端口
# 开启防火墙端口7000、7001、7002、7003、7004、7005
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=7002/tcp --permanent
firewall-cmd --zone=public --add-port=7003/tcp --permanent
firewall-cmd --zone=public --add-port=7004/tcp --permanent
firewall-cmd --zone=public --add-port=7005/tcp --permanent
# 重新启动防火墙
service firewalld restart
# 查看开放的端口
firewall-cmd --list-ports
3)首先要在Linux虚拟机上安装redis
# 安装包存放目录
cd /usr/local/redis
# 下载最新稳定版
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
# 解压
tar -zxvf redis-6.2.6.tar.gz
# 进入解压后的目录
cd /usr/local/redis/redis-6.2.6/
# 编译
make
# 执行 "make install" 默认会安装到 /usr/local/bin,可通过PREFIX指定安装路径
make install PREFIX=/usr/local/redis
# 测试是否安装成功,执行下面命令
/usr/local/redis/bin/redis-server
判断集群中的一个节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建 redis 集群时建议节点数最好是奇数,搭建集群至少需要三个主节点、三个从节点
,至少需要6个节点
# 安装ruby和依赖的包
yum install -y ruby rubygems
🌈 3.3.5.gem安装:http://rubygems.org/downloads/redis-3.3.5.gem
gem install redis-3.3.5.gem
/usr/local/redis/redis-6.2.6
目录下拷贝一份redis.conf文件到/usr/local/redis/
目录下,修改以下内容bind 0.0.0.0 # 绑定的IP,默认为本机127.0.0.1
port 7000 # 运行的端口号,默认为6379
pidfile /var/run/redis_7000.pid # PID进程文件
daemonize yes # 以守护进程的方式运行,默认是no,需要我们自己开启yes(实质上就是是否开启后台运行,不占用窗口)
dbfilename dump-7000.rdb # 设置rdb快照文件名字
appendonly yes # 默认是不开启aof模式的,默认是使用rdb方式持久化,大部分所有的情况下,rdb完全够用
appendfilename "appendonly-7000.aof" # 持久化的名字的文件
cluster-enabled yes # 开启集群模式,默认关闭
cluster-config-file nodes-7000.conf # 集群各节点配置文件
cluster-node-timeout 5000 # 集群超时时间
/usr/local/redis/
目录下创建redis-cluster-upgrade文件夹,并在该文件夹创建7000~7007文件夹mkdir redis-cluster-upgrade
mkdir 7000 7001 7002 7003 7004 7005 7006 7007
复制完后,对每个redis.conf文件修改对应的端口号
回到/usr/local/redis/bin
目录,根据配置文件分别启动redis-server服务
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7000/redis.conf
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7001/redis.conf
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7002/redis.conf
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7003/redis.conf
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7004/redis.conf
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7005/redis.conf
[root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7006/redis.conf
### 停止节点
#!/bin/bash
./redis-cli -p 7000 shutdown
./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown
# 查看redis进程
ps aux|grep redis
将redis-trib.rb文件复制到/usr/local/redis/bin/
目录下(旧版本才需要)
[root@vinjcent src]# pwd
/usr/local/redis/redis-6.2.6/src
# 旧版本需要拷贝
[root@vinjcent src]# cp ./redis-trib.rb /usr/local/redis/bin/
创建集群命令,在/usr/local/redis/bin
目录下
# (旧版本命令)
./redis-trib.rb create --replicas 1 192.168.159.100:7000 192.168.159.100:7001 192.168.159.100:7002 192.168.159.100:7003 192.168.159.100:7004 192.168.159.100:7005
# 个人使用的是redis-6.2.6版本,命令如下
./redis-cli --cluster create 192.168.159.100:7000 192.168.159.100:7001 \
192.168.159.100:7002 192.168.159.100:7003 192.168.159.100:7004 192.168.159.100:7005 \
--cluster-replicas 1
从节点没有hash槽,只有当主节点宕机之后,从节点选举成为新的主节点才有slot槽
### 1.查看集群状态 check [原始集群中任意节点]
# 旧版本
[root@vinjcent bin]# ./redis-trib.rb check 192.168.159.100:7000
# 新版本 -c 代表集群,没加 -c 代表单机
./redis-cli -c -p 7000 -a [密码]
./redis-cli -c -p 7000
### 2.主节点状态说明
- 主节点
主节点存在hash slots,且主节点的hash slots 没有交叉
主节点不能删除
一个主节点可以有多个从节点
主节点宕机时,多个副本之间自动选举主节点
- 从节点
从节点没有hash slots
从节点可以删除
从节点不负责数据的写,只负责数据的同步
1)帮助命令
### 查看帮助命令
[root@vinjcent bin]# ./redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN
--cluster-replicas <arg>
check host:port
--cluster-search-multiple-owners
info host:port
fix host:port
--cluster-search-multiple-owners
--cluster-fix-with-unreachable-masters
reshard host:port
--cluster-from <arg>
--cluster-to <arg>
--cluster-slots <arg>
--cluster-yes
--cluster-timeout <arg>
--cluster-pipeline <arg>
--cluster-replace
rebalance host:port
--cluster-weight <node1=w1...nodeN=wN>
--cluster-use-empty-masters
--cluster-timeout <arg>
--cluster-simulate
--cluster-pipeline <arg>
--cluster-threshold <arg>
--cluster-replace
add-node new_host:new_port existing_host:existing_port
--cluster-slave
--cluster-master-id <arg>
del-node host:port node_id
call host:port command arg arg .. arg
--cluster-only-masters
--cluster-only-replicas
set-timeout host:port milliseconds
import host:port
--cluster-from <arg>
--cluster-from-user <arg>
--cluster-from-pass <arg>
--cluster-from-askpass
--cluster-copy
--cluster-replace
backup host:port backup_directory
help
2)添加主节点
### 1.添加主节点 --cluster add-node [新加入节点] [原始集群中任意节点]
./redis-cli --cluster add-node 192.168.159.100:7006 192.168.159.100:7000
- 注意
该节点必须以集群模式启动
默认情况下,该节点就是以master节点形式添加
# 查看集群节点./redis-cli --cluster check [ip]:[port]
./redis-cli --cluster check 192.168.159.100:7006
新添加的主节点没有solts槽,需要用到reshard
命令进行分片
3)添加从节点
### 1.添加从节点 --cluster add-node --cluster-slave [新加入节点] [集群中任意节点]
./redis-cli --cluster add-node --cluster-slave 192.168.159.100:7006 192.168.159.100:7000
- 注意
当添加副本节点时,没有指定主节点,redis会随机给该副本节点分配到较少副本节点的主节点
### 2.为确定的master节点添加主节点 --cluster add-node --cluster-slave --cluster-master-id [master节点id] [新加入节点] [集群任意节点]
./redis-cli --cluster add-node --cluster-slave --cluster-master-id 4ca0a36684446afe069ef575c3ca7d0f60c1186c 192.168.159.100:7006 192.168.159.100:7000
4)删除副本节点
### 1.删节节点 --cluster del-node [集群中任意节点] [删除节点id]
./redis-cli --cluster del-node 192.168.159.100:7005 bb3d941a437c52d98caf993b6a92c3e271bc0435
5)集群在线分片
### 1.在线分片 --cluster reshard [集群中任意节点]
reshard host:port
--cluster-from <arg>
--cluster-to <arg>
--cluster-slots <arg>
--cluster-yes
--cluster-timeout <arg>
--cluster-pipeline <arg>
--cluster-replace
./redis-cli --cluster reshard 192.168.159.100:7000
# 端口
server:
port: 3035
servlet:
context-path: /redisSession
# 应用名称
spring:
application:
name: redis-session-manager
# redis集群(建议将所有节点都添加,该集群方式不需要配置主从复制以及哨兵模式,在配置集群中已经具备这些功能)
redis:
cluster:
nodes: 192.168.159.100:7000,192.168.159.100:7001,192.168.159.100:7002,192.168.159.100:7003,192.168.159.100:7004,192.168.159.100:7005