主从:一主两从
| IP | PORT | 角色 |
|---|---|---|
| 192.168.1.9 | 7001 | master |
| 192.168.1.9 | 7002 | replica |
| 192.168.1.9 | 7003 | replica |
redis01
mkdir redis01
三个目录中分别放置redis.conf配置文件
vi redis.conf
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 密码,设置后访问Redis必须输入密码
requirepass "123456"
# 监听的端口
port 7001
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir "/home/centos/redis01"
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
# 主节点密码,构建集群时从节点需要配置
# 注意,若使用哨兵集群,则从节点会切换为主节点,所以随后若主节点恢复降为从节点时也需要该值,所以主从哨兵集群中必须所有工作节点必须配置主节点密码,同时,也由于会自动切换,所以任意一个节点可能需要配置其他节点的密码,由此可以推出,主从哨兵集群中必须所有密码一样才能满足自动切换的条件
masterauth 123456
# Generated by CONFIG REWRITE
pidfile "/var/run/redis.pid"
save 3600 1
save 300 100
save 60 10000
user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* &* +@all
replicaof 192.168.1.9 7003
redis-server ./redis01/redis.conf
redis02
redis03
建立拓扑
注意:在5.0以后新增命令replicaof,与salveof效果一致。
replicaof <masterIp> <masterPort>
replicaof 192.168.1.9 7001
replicaof 主库IP 主库端口
slaveof 主库IP 主库端
slaveof no one 设置本机不再是任何redis服务的从机
使用info查看节点信息,可以在master查看主节点信息,可以看到子节点相关信息
可以在replica节点看到主节点相关信息
从节点会禁止写操作
127.0.0.1:7002> set key value
(error) READONLY You can't write against a read only replica.
主从哨兵:一主两从三哨兵
在先前基础上增加三个节点的哨兵集群构成一主两从三哨兵集群。
| 节点 | IP | PORT |
|---|---|---|
| sentinel01 | 192.168.1.9 | 27001 |
| sentinel02 | 192.168.1.9 | 27002 |
| sentinel03 | 192.168.1.9 | 27003 |
mkdir sentinel01 sentinel02 sentinel03
sentinel01
mkdir sentinel01
port 27001
daemonize yes
dir "/home/centos/sentinel01"
logfile "sentinel.log"
sentinel monitor mymaster 192.168.1.9 7001 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
redis-sentinel /home/centos/sentinel01/sentinel.conf
mkdir sentinel02
port 27002
daemonize yes
dir "/home/centos/sentinel02"
logfile "sentinel.log"
sentinel monitor mymaster 192.168.1.9 7001 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
redis-sentinel /home/centos/sentinel02/sentinel.conf
mkdir sentinel03
port 27003
daemonize yes
dir "/home/centos/sentinel03"
logfile "sentinel.log"
sentinel monitor mymaster 192.168.1.9 7001 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
redis-sentinel /home/centos/sentinel03/sentinel.conf
测试故障切换
尝试让master节点7001宕机,查看sentinel日志:
查看7003的日志:
查看7002的日志:
主从分片
集群结构
主从分片,三分片,每个分片一主一从
| IP | PORT | 角色 |
|---|---|---|
| 192.168.1.9 | 8001 | master |
| 192.168.1.9 | 8002 | master |
| 192.168.1.9 | 8003 | master |
| 192.168.1.9 | 9001 | slave |
| 192.168.1.9 | 9002 | slave |
| 192.168.1.9 | 9003 | slave |
redis01
- 创建目录
mkdir -p /usr/local/redis_cluster/redis01
- 移动到工作目录
cd /usr/local/redis_cluster/redis01
- 创建配置文件
vi redis.conf
# redis.conf
bind 0.0.0.0
port 8001
daemonize yes
protected-mode no
databases 1
requirepass 123456
masterauth 123456
pidfile redis.pid
logfile "redis.log"
# RDB
dir /usr/local/redis_cluster/redis01
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "dump.aof"
# 集群
cluster-enabled yes
cluster-config-file /usr/local/redis_cluster/redis01/nodes.conf
cluster-node-timeout 5000
- 启动节点
redis-server /usr/local/redis_cluster/redis01/redis.conf
redis02
- 创建目录
mkdir -p /usr/local/redis_cluster/redis02
- 移动到工作目录
cd /usr/local/redis_cluster/redis02
- 创建配置文件
vi redis.conf
# redis.conf
bind 0.0.0.0
port 8002
daemonize yes
protected-mode no
databases 1
requirepass 123456
masterauth 123456
pidfile redis.pid
logfile "redis.log"
# RDB
dir /usr/local/redis_cluster/redis02
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "dump.aof"
# 集群
cluster-enabled yes
cluster-config-file /usr/local/redis_cluster/redis02/nodes.conf
cluster-node-timeout 5000
- 启动节点
redis-server /usr/local/redis_cluster/redis02/redis.conf
redis03
- 创建目录
mkdir -p /usr/local/redis_cluster/redis03
- 移动到工作目录
cd /usr/local/redis_cluster/redis03
- 创建配置文件
vi redis.conf
# redis.conf
bind 0.0.0.0
port 8003
daemonize yes
protected-mode no
databases 1
requirepass 123456
masterauth 123456
pidfile redis.pid
logfile "redis.log"
# RDB
dir /usr/local/redis_cluster/redis03
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "dump.aof"
# 集群
cluster-enabled yes
cluster-config-file /usr/local/redis_cluster/redis03/nodes.conf
cluster-node-timeout 5000
- 启动节点
redis-server /usr/local/redis_cluster/redis03/redis.conf
redis04
- 创建目录
mkdir -p /usr/local/redis_cluster/redis04
- 移动到工作目录
cd /usr/local/redis_cluster/redis04
- 创建配置文件
vi redis.conf
# redis.conf
bind 0.0.0.0
port 9001
daemonize yes
protected-mode no
databases 1
requirepass 123456
masterauth 123456
pidfile redis.pid
logfile "redis.log"
# RDB
dir /usr/local/redis_cluster/redis04
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "dump.aof"
# 集群
cluster-enabled yes
cluster-config-file /usr/local/redis_cluster/redis04/nodes.conf
cluster-node-timeout 5000
- 启动节点
redis-server /usr/local/redis_cluster/redis04/redis.conf
redis05
- 创建目录
mkdir -p /usr/local/redis_cluster/redis05
- 移动到工作目录
cd /usr/local/redis_cluster/redis05
- 创建配置文件
vi redis.conf
# redis.conf
bind 0.0.0.0
port 9002
daemonize yes
protected-mode no
databases 1
requirepass 123456
masterauth 123456
pidfile redis.pid
logfile "redis.log"
# RDB
dir /usr/local/redis_cluster/redis05
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "dump.aof"
# 集群
cluster-enabled yes
cluster-config-file /usr/local/redis_cluster/redis05/nodes.conf
cluster-node-timeout 5000
- 启动节点
redis-server /usr/local/redis_cluster/redis05/redis.conf
redis06
- 创建目录
mkdir -p /usr/local/redis_cluster/redis06
- 移动到工作目录
cd /usr/local/redis_cluster/redis06
- 创建配置文件
vi redis.conf
# redis.conf
bind 0.0.0.0
port 9003
daemonize yes
protected-mode no
databases 1
requirepass 123456
masterauth 123456
pidfile redis.pid
logfile "redis.log"
# RDB
dir /usr/local/redis_cluster/redis06
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "dump.aof"
# 集群
cluster-enabled yes
cluster-config-file /usr/local/redis_cluster/redis06/nodes.conf
cluster-node-timeout 5000
- 启动节点
redis-server /usr/local/redis_cluster/redis06/redis.conf
分别启动
创建集群拓扑
# --cluster-replicas 用于指定每一个分片中从节点数量
# master数量 = 总结点数 / (单个分片中从节点 + 1)
redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.1.9:8001 192.168.1.9:8002 192.168.1.9:8003 192.168.1.9:9001 192.168.1.9:9002 192.168.1.9:9003
输入命令开始生成集群配置,等待确认
确认配置后完成集群构建
查看集群信息
info replication 查看主从复制的相关信息
cluster info 查看集群所有节点的信息
cluster nodes 查看集群整体信息
redis-cli -a 123456 -p 8001 cluster nodes
集群读写
单节点操作在集群中不会自动转发
redis-cli -a 123456 -p 8001
集群操作会被自动转发
redis-cli -c -a 123456 -p 8001
故障切换
cluster failover
缩容
从集群中删除以9003为主节点的整个分片,哈希槽为0-5460。
redis-cli -a 123456 --cluster check 192.168.1.9:8001
将分片的从节点删除
redis-cli -a 123456 --cluster del-node 192.168.1.9:8001 ccd516357bce6f5abc038a406e8d9377c802d26a
然后将分片的主节点移除,移除主节点之前需要将哈希槽移走
redis-cli -a 123456 --cluster reshard 192.168.1.9:8002
选择哈希槽数量,选择移动到哪个主节点,选择从哪里移动
确认
移动成功
删除无哈希槽的主节点
redis-cli -a 123456 --cluster del-node 192.168.1.9:9003 c4d66d29086727519d56772398365b75730b3a8b
之前被删除的两个节点都会变成无哈希槽的主节点
扩容
接下来进行扩容操作,将8001节点作为主节点,9003作为从节点扩容一个新的分片。
向集群中添加主节点8001
redis-cli -a 123456 --cluster add-node 192.168.1.9:8001 192.168.1.9:8002
redis-cli -a 123456 --cluster reshard 192.168.1.9:8002
将9003作为8001的从机
redis-cli -a 123456 --cluster add-node 192.168.1.9:9003 192.168.1.9:8001 --cluster-slave --cluster-master-id ccd516357bce6f5abc038a406e8d9377c802d26a
完成扩容