Redis有三种集群模式,分别是:
- 主从复制
- Sentinel模式
- Cluster模式
主从复制
主从模式,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
image.png
机制
当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
实践
1、创建redis.conf
#允许外网访问
bind 0.0.0.0
daemonize NO
protected-mode no
2、docker启动至少两个redis
docker run -p 6888:6379 --name redis-1 -v /etc/redis/redis.conf:/etc/redis/redis.conf -d 44d36d2c2374 redis-server /etc/redis/redis.conf --appendonly yes
docker run -p 6889:6379 --name redis-2 -v /etc/redis/redis.conf:/etc/redis/redis.conf -d 44d36d2c2374 redis-server /etc/redis/redis.conf --appendonly yes
3、启动成功后,进入随便一个redis
docker exec -it 384d593f0d07 redis-cli
4、执行info
image.png
每个redis服务器启动都是master
5、进入想要为slave的redis
SLAVEOF ip port
6、查看每个redis的info
slave:
image.png
master:
image.png
connected_slaves为1,配置成功
Sentinel模式
主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此哨兵模式应运而生。也就是启动一个哨兵,观察redis的状态,当master挂掉之后,哨兵可以将其中slave服务器改为master,可以继续写。
当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。
sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
实践
在上一步的基础上,增加一个sentinel服务器就可以了
1、创建/etc/redis/sentinel.conf
# 日志
logfile "sentinel.log"
# sentinel monitor master名称 master-ip master-port 将这个主服务器标记为失效至少需要1个哨兵进程的同意
sentinel monitor mymaster 192.168.0.1 6379 1
# master密码
sentinel auth-pass mymaster 1234
2、启动sentinel
docker run -p 26379:26379 -v /etc/redis/sentinel.conf:/etc/redis/sentinel.conf --name redis-26379 -d docker.io/redis redis-sentinel /etc/redis/sentinel.conf
3、进入sentinel,查看info
docker exec -it 25 /bin/bash
# 连接
root@aa55601cb0c7:/data# redis-cli -h 127.0.0.1 -p 26379
# 查看info
127.0.0.1:26379> info
# 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=172.17.0.3:6379,slaves=1,sentinels=1
sentinel启动成功,查看slave服务器
# Replication
role:slave
master_host:172.17.0.3
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:66932
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:6f5c552953ef4708b2b9382c9b9051cd5b1c7d5c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:66932
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:66932
关闭master
docker stop abbe9edc6c4a
查看sentinel日志:
1:X 07 Mar 2020 09:10:33.599 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:X 07 Mar 2020 09:10:33.599 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:X 07 Mar 2020 09:10:33.599 # Configuration loaded
1:X 07 Mar 2020 09:10:33.601 * Running mode=sentinel, port=26379.
1:X 07 Mar 2020 09:10:33.601 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:X 07 Mar 2020 09:10:33.608 # Sentinel ID is a0637a079feb583c0952a4d7679a0e9b11e34729
1:X 07 Mar 2020 09:10:33.608 # +monitor master mymaster 172.17.0.3 6379 quorum 1
1:X 07 Mar 2020 09:10:33.609 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:31.923 # +sdown master mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:31.923 # +odown master mymaster 172.17.0.3 6379 #quorum 1/1
1:X 07 Mar 2020 09:25:31.923 # +new-epoch 1
1:X 07 Mar 2020 09:25:31.923 # +try-failover master mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:31.927 # +vote-for-leader a0637a079feb583c0952a4d7679a0e9b11e34729 1
1:X 07 Mar 2020 09:25:31.927 # +elected-leader master mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:31.927 # +failover-state-select-slave master mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.011 # +selected-slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.011 * +failover-state-send-slaveof-noone slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.082 * +failover-state-wait-promotion slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.907 # +promoted-slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.907 # +failover-state-reconf-slaves master mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.975 # +failover-end master mymaster 172.17.0.3 6379
1:X 07 Mar 2020 09:25:32.975 # +switch-master mymaster 172.17.0.3 6379 172.17.0.4 6379
1:X 07 Mar 2020 09:25:32.975 * +slave slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.4 6379
1:X 07 Mar 2020 09:26:02.989 # +sdown slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.4 6379
master已经更改,重新启动宕机的redis后只会充当slave
Cluster模式
sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。
使用集群,只需要将redis配置文件中的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。
网友评论