目录
一、redis集群模式
主从复制模式
哨兵模式:是为了弥补主从复制模式中主机宕机后,主备切换的复杂性而演变出来的。哨兵模式就是用来监控的,只要作用是监控主从集群,自动切换主备,完成集群故障转移
cluster三种模式:是官方提供集群模式,不仅实现了高可用、读写分离、也实现了真正的分布式存储
二、主从复制模式
1、主从复制原理
① 从redis开启同步服务,连接master发送sync命令
② 主服务器开始执行bgsave,派生一个fork子进程去做RDB快照,并使用缓存区记录bgsave之后的写命令
③ 主服务区bgsave完成以后,向从服务器发送快照文件,并继续缓存写的命令
④ 快照文件完成以后,向从服务器发送缓存写的命令。
⑤ 缓存写命令执行完后,以后每个写命令都会同步给从服务器
2、主从复制模式集群配置
1、实验环境
角色 | IP |
master | 192.168.159.13 |
slave | 192.168.159.20 |
slave | 192.168.159.159 |
2、实验步骤
三台redis正常安装,之前的博客写了
①配置master节点
[root@master ~]# vim /etc/redis/6379.conf ## 进入redis的配置文件
bind 0.0.0.0 ## 第70行修改加监听地址为0.0.0.0
daemonize yes ## 第137行开启守护进程
logfile /var/log/redis_6379.lo ## 第172行指定日志文件目录位置
dir /var/lib/redis/6379 ## 第264行,指定工作目录
appendonly yes ## 第700行开启AOF持久化功能
[root@master bin]# /etc/init.d/redis_6379 restart ## 重启redis服务
Stopping ...
Redis stopped
Starting Redis server...
②配置slave1和slave2节点(配置一样)
[root@slave1 ~]# vim /etc/redis/6379.conf ## 进入redis的配置文件
bind 0.0.0.0 ## 第70行修改加监听地址为0.0.0.0
daemonize yes ## 第137行开启守护进程
logfile /var/log/redis_6379.lo ## 第172行指定日志文件目录位置
dir /var/lib/redis/6379 ## 第264行,指定工作目录
replicaof 192.168.159.13 6379 ## 第288行指定同步的IP地址和端口
appendonly yes ## 第700行开启AOF持久化功能
[root@slave1 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@slave1 ~]# ss -natp |grep 6379
LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=13420,fd=6))
TIME-WAIT 0 0 127.0.0.1:6379 127.0.0.1:57084
ESTAB 0 0 192.168.159.20:35572 192.168.159.13:6379 users:(("redis-server",pid=13420,fd=8))
③在master上验证
[root@master bin]# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.159.20,port=6379,state=online,offset=1750,lag=1
slave1:ip=192.168.159.159,port=6379,state=online,offset=1750,lag=1
master_replid:21a4e24bc8705e1a36ebcc5c2409d0931aed2c35
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1750
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1750
三、哨兵模式
在主从复制的基础上起到主节点自动故障转移的作用
1、工作原理
当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。(先主观下线,后客观下线)
2、主要功能
① 监控主服务器和从服务器是否正常运行
② 主服务器出现故障时自动将从服务器转换为主服务器
3、发布和订阅模式
① 哨兵节点向master节点发送两条连接,命令连接和订阅连接
命令连接:用于建立连接,然后发送info请求,用于获取redis-master的信息,状态,role角色、offset段偏移量等
②订阅连接,为了方便后续获取master的数据
4、哨兵模式实验
①实验环境
角色 | IP |
master | 192.168.159.13 |
slave1 | 192.168.159.20 |
slave2 | 192.168.159.159 |
② 哨兵配置文件,三台服务器都需要配置
[root@master ~]# vim /opt/redis-5.0.7/sentinel.conf
protected-mode no ## 17行取消注释,关闭保护模式
port 26379 ## 21行默认的监听端口
daemonize yes ## 26行开启守护进程
logfile "/var/log/sentinel.log" ## 36行指定日志存放位置
dir "/var/lib/redis/6379" ## 65行指定数据库存放位置
sentinel monitor mymaster 192.168.159.13 6379 2 ##83行指定哨兵节点
sentinel down-after-milliseconds mymaster 30000 #判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000 (180秒 )
sentinel deny-scripts-reconfig yes
grep -v "^#\|^$" /opt/redis-5.0.7/sentinel.conf 查看配置的文件内容
protected-mode no
port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
logfile "/var/log/sentinel.log"
dir "/var/lib/redis/6379"
sentinel monitor mymaster 192.168.159.13 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
③开启哨兵模式 先开master ,再开启slave1和slave2
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf & ##后台启动哨兵
④在master上查看哨兵信息
[root@master redis-5.0.7]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.159.13:6379,slaves=0,sentinels=3
四、Redis集群模式
1、Redis集群模式概括
① Redis集群模式就是,可以解决写的操作无法负载均衡,存储受到单机限制,以及故障自动切换功能的一种集群。
② 集群由多个节点组成,Redis的数据分布在这些节点中。
③ 集群中的节点分为主节点和从节点,只有主节点复制读写请求和集群信息的维护,从节点只进行主节点数据和状态信息的复制。
2、Redis集群模式作用
数据分区:数据分区(或称数据分片) 是集群最核心的功能。
① 集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加;
② 另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
③ Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及
高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似) ;当任一节点发生故障时,集群仍然可以对外提供服务
3、Redis集群模式实验
本实验使用一台虚拟机模拟
[root@zwb_redis01 ~]# cd /etc/redis/
[root@zwb_redis01 redis]# mkdir -p /etc/redis/redis-cluster/redis600{1..6}
[root@zwb_redis01 redis]# cd redis-cluster/redis6001
vim /opt/redis.sh
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
[root@zwb_redis01 redis]# cd /opt/
[root@zwb_redis01 opt]# sh redis.sh
[root@zwb_redis01 redis]# cd redis-cluster/
[root@zwb_redis01 redis-cluster]# ls
redis6001 redis6003 redis6005
redis6002 redis6004 redis6006
[root@zwb_redis01 redis-cluster]# ls /etc/redis/redis-cluster/* ## 检验
/etc/redis/redis-cluster/redis6001:
redis-cli redis.conf redis-server
/etc/redis/redis-cluster/redis6002:
redis-cli redis.conf redis-server
/etc/redis/redis-cluster/redis6003:
redis-cli redis.conf redis-server
/etc/redis/redis-cluster/redis6004:
redis-cli redis.conf redis-server
/etc/redis/redis-cluster/redis6005:
redis-cli redis.conf redis-server
/etc/redis/redis-cluster/redis6006:
redis-cli redis.conf redis-server
配置集群配置文件
[root@zwb_redis01 redis-cluster]# ls
redis6001 redis6002 redis6003 redis6004 redis6005 redis6006
[root@zwb_redis01 redis-cluster]# cd redis6001
[root@zwb_redis01 redis6001]# ls
redis-cli redis.conf redis-server
[root@zwb_redis01 redis6001]# vim redis.conf
69行 #bind 127.0.0.1 #将其注释,即监听所有端口
88行 protected-mode no #关闭保护模式
92行 port 6001 #为了区分,将端口更改,6个不能相同
136行 daemonize yes #开启守护进程
699行 appendonly yes #开启AOF持久化
832行 cluster-enabled yes #开启集群功能
840行 cluster-config-file nodes-6001.conf #群集名称文件设置
846行 cluster-node-timeout 15000 #群集超时时间设置
将配置好6001的配置文件,拷贝到另外6002-6006中,修改为各自端口
启动redis 节点
[root@zwb_redis01 redis6002]# cd /opt
[root@zwb_redis01 opt]# vim /opt/redisqidong.sh
#!/bin/bash
for i in {1..6}
do
cd /etc/redis/redis-cluster/redis600$i
redis-server redis.conf
done
~
~
[root@zwb_redis01 opt]# source redisqidong.sh ### 启动
8565:C 06 Oct 2022 02:51:04.526 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8565:C 06 Oct 2022 02:51:04.526 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=8565, just started
8565:C 06 Oct 2022 02:51:04.526 # Configuration loaded
8567:C 06 Oct 2022 02:51:04.572 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8567:C 06 Oct 2022 02:51:04.572 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=8567, just started
8567:C 06 Oct 2022 02:51:04.572 # Configuration loaded
8572:C 06 Oct 2022 02:51:04.593 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8572:C 06 Oct 2022 02:51:04.593 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=8572, just started
8572:C 06 Oct 2022 02:51:04.593 # Configuration loaded
8577:C 06 Oct 2022 02:51:04.623 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8577:C 06 Oct 2022 02:51:04.623 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=8577, just started
8577:C 06 Oct 2022 02:51:04.623 # Configuration loaded
8582:C 06 Oct 2022 02:51:04.655 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8582:C 06 Oct 2022 02:51:04.655 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=8582, just started
8582:C 06 Oct 2022 02:51:04.655 # Configuration loaded
8587:C 06 Oct 2022 02:51:04.681 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8587:C 06 Oct 2022 02:51:04.681 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=8587, just started
8587:C 06 Oct 2022 02:51:04.681 # Configuration loaded
启动集群
[root@zwb_redis01 redis6006]# redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6005 to 127.0.0.1:6001
Adding replica 127.0.0.1:6006 to 127.0.0.1:6002
Adding replica 127.0.0.1:6004 to 127.0.0.1:6003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: cf9f910ec86d8342a1b2d9772d16a08b284e6c3d 127.0.0.1:6001
slots:[0-5460] (5461 slots) master
M: d313359d96331c3a29feb8c7190840988495ca90 127.0.0.1:6002
slots:[5461-10922] (5462 slots) master
M: cde875e1ff8ee6139c7ed08c5e9ec277eaad899e 127.0.0.1:6003
slots:[10923-16383] (5461 slots) master
S: ac9604817c45821d6c96ca316ca9f86396e3d2fd 127.0.0.1:6004
replicates cde875e1ff8ee6139c7ed08c5e9ec277eaad899e
S: 862e44292efd5ab7521cb74c89da7d2792e90a02 127.0.0.1:6005
replicates cf9f910ec86d8342a1b2d9772d16a08b284e6c3d
S: b596e7774f1a1e39c54a862b588e90f4a255ac21 127.0.0.1:6006
replicates d313359d96331c3a29feb8c7190840988495ca90
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
......
>>> Performing Cluster Check (using node 127.0.0.1:6001)
M: cf9f910ec86d8342a1b2d9772d16a08b284e6c3d 127.0.0.1:6001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 862e44292efd5ab7521cb74c89da7d2792e90a02 127.0.0.1:6005
slots: (0 slots) slave
replicates cf9f910ec86d8342a1b2d9772d16a08b284e6c3d
S: ac9604817c45821d6c96ca316ca9f86396e3d2fd 127.0.0.1:6004
slots: (0 slots) slave
replicates cde875e1ff8ee6139c7ed08c5e9ec277eaad899e
S: b596e7774f1a1e39c54a862b588e90f4a255ac21 127.0.0.1:6006
slots: (0 slots) slave
replicates d313359d96331c3a29feb8c7190840988495ca90
M: d313359d96331c3a29feb8c7190840988495ca90 127.0.0.1:6002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: cde875e1ff8ee6139c7ed08c5e9ec277eaad899e 127.0.0.1:6003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
测试:
[root@zwb_redis01 redis6006]# redis-cli -p 6001 -c ## 哈希槽的分配
127.0.0.1:6001> cluster slots
1) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 6001 ## 主
3) "cf9f910ec86d8342a1b2d9772d16a08b284e6c3d"
4) 1) "127.0.0.1"
2) (integer) 6005 ## 从
3) "862e44292efd5ab7521cb74c89da7d2792e90a02"
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 6002 ## 主
3) "d313359d96331c3a29feb8c7190840988495ca90"
4) 1) "127.0.0.1"
2) (integer) 6006 ## 从
3) "b596e7774f1a1e39c54a862b588e90f4a255ac21"
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 6003 ## 主
3) "cde875e1ff8ee6139c7ed08c5e9ec277eaad899e"
4) 1) "127.0.0.1"
2) (integer) 6004 ## 从
3) "ac9604817c45821d6c96ca316ca9f86396e3d2fd"