您的位置:

Redis集群三种方式详解

一、Redis集群三种方式的优缺点

Redis集群主要有三种方式,分别是:一主一从、一主多从、三主三从。它们各自有优缺点:

一主一从:利用主从复制来实现数据备份,当主节点宕机时,从节点可以顶替主节点成为主节点,实现高可用性。这种方式的优点是部署简单,不需要考虑负载均衡、数据拆分等问题。缺点则是数据容灾能力有限,扩展性不够。

一主多从:一个主节点可以配多个从节点,实现读写分离和负载均衡,即主节点可读写,从节点只读。这种方式的优点是可扩展性较好,可根据需求调整从节点数量以满足负载需求;能够有效利用多台机器的计算资源,提高系统整体吞吐量;同时主节点出现故障时,从节点之间可以选举出一台作为主节点,实现高可用性。缺点是容灾能力相对一主一从模式也有限,而且主节点过多时容易导致节点间通信负担加重。

三主三从:与一主多从类似,三个主节点通过Paxos算法协商确定,主节点之间进行复制,从节点对主节点进行读写分离。三主三从的优点是数据容灾能力强,可扩展性较好,同时也能够容忍多个主节点之间出现故障,具备高可用性。

二、Redis集群三种方式的配置

Redis集群的三种方式都需要在配置文件redis.conf中进行相应的配置。

1、一主一从配置

# Master节点配置
port 6379
daemonize yes
bind 127.0.0.1
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/6379
requirepass xyqzyh5678

# Slave节点配置
slaveof 127.0.0.1 6379
port 6380
daemonize yes
bind 127.0.0.1
pidfile /var/run/redis_6380.pid
loglevel notice
logfile /var/log/redis/redis_6380.log
dir /var/lib/redis/6380

2、一主多从配置

# Master节点配置
port 6379
daemonize yes
bind 127.0.0.1
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/6379
requirepass xyqzyh5678

# Slave节点配置
slaveof 127.0.0.1 6379
port 6380
daemonize yes
bind 127.0.0.1
pidfile /var/run/redis_6380.pid
loglevel notice
logfile /var/log/redis/redis_6380.log
dir /var/lib/redis/6380

slaveof 127.0.0.1 6379
port 6381
daemonize yes
bind 127.0.0.1
pidfile /var/run/redis_6381.pid
loglevel notice
logfile /var/log/redis/redis_6381.log
dir /var/lib/redis/6381

3、三主三从配置

# 节点1的配置
port 7001
daemonize yes
pidfile /var/run/redis_7001.pid
cluster-enabled yes
cluster-config-file /etc/redis/7001.conf
cluster-node-timeout 15000
appendonly yes

# 节点2的配置
port 7002
daemonize yes
pidfile /var/run/redis_7002.pid
cluster-enabled yes
cluster-config-file /etc/redis/7002.conf
cluster-node-timeout 15000
appendonly yes

# 节点3的配置
port 7003
daemonize yes
pidfile /var/run/redis_7003.pid
cluster-enabled yes
cluster-config-file /etc/redis/7003.conf
cluster-node-timeout 15000
appendonly yes

# 节点4的配置
port 7004
daemonize yes
pidfile /var/run/redis_7004.pid
cluster-enabled yes
cluster-config-file /etc/redis/7004.conf
cluster-node-timeout 15000
appendonly yes

# 节点5的配置
port 7005
daemonize yes
pidfile /var/run/redis_7005.pid
cluster-enabled yes
cluster-config-file /etc/redis/7005.conf
cluster-node-timeout 15000
appendonly yes

# 节点6的配置
port 7006
daemonize yes
pidfile /var/run/redis_7006.pid
cluster-enabled yes
cluster-config-file /etc/redis/7006.conf
cluster-node-timeout 15000
appendonly yes

三、Redis集群三种方式原理

1、一主一从原理:主从复制

主从复制是Redis提供的一种高可用性方案,它的实现原理是主节点将自身的数据以异步方式复制到从节点中,同时从节点可以在不影响主节点的情况下,对复制过来的数据进行读取操作。

主从复制的实现利用的是Redis的RDB文件,当主节点执行写操作时,Redis会将同步方式同时将命令更新到AOF文件和内存数据库中,随后向绑定的所有从节点发送同步命令,从节点根据同步命令更新自己的内存数据库。

2、一主多从原理:主从复制+读写分离

一主多从结构与一主一从类似,在此不再详细阐述。它的读写分离实现原理是将写操作全部交给主节点处理,而读操作则可以由主节点和从节点共同承担。当从节点发起读操作时,Redis会将同步命令发送到主节点,让主节点将最新的数据同步到从节点中,然后从节点就能够对数据进行读操作了。

3、三主三从原理:Paxos算法实现数据同步

三主三从模式是Redis集群的最佳实践,它使用Paxos算法实现数据同步,从而保证在任意节点故障或网络分区的情况下,系统仍然能够正常运行。

Paxos算法是由Leslie Lamport于1990年提出的一种基于消息传递的一致性算法。它的实质是通过消息传递机制,保证多个进程在数值上的一致性。在Redis中,三个主节点通过Paxos算法协商确定数据的一致性,从节点对主节点进行读写分离,每个主节点都会将数据复制到其他两个主节点和它们的从节点,从而实现数据的同步和备份。

四、Redis集群节点

在Redis集群中,节点可以分为主节点和从节点两种类型。主节点负责数据的存储和管理,从节点则通过主节点进行数据的同步和读写分离。

Redis集群中有三种角色,分别是:主节点、从节点和无状态节点。在三主三从结构中,每个主节点绑定两个从节点,同时充当无状态节点以处理请求。

主节点的职责是负责数据的写入和同步。当它的一个从节点崩溃时,它会自动选出一个从节点充当备份。

从节点则负责数据的读取,并通过心跳机制与主节点保持同步。当主节点故障时,从节点之间会选举出一台作为新的主节点,其他从节点则成为新的从节点。

无状态节点(Non-Data-Sharing Node)既不保存数据,也不影响数据的分割和分发,仅用于处理客户端发来的请求。每个主节点在接收到请求时,会通过哈希函数将其转发给对应的无状态节点,该节点负责将请求的变更同步到主节点和从节点中。

五、Redis集群搭建

1、Redis单节点搭建

首先安装Redis并执行以下命令启动服务:

sudo apt install redis-server
sudo systemctl start redis-server

然后在redis.conf配置文件中添加以下内容:

dbfilename dump.rdb
appendonly yes

运行以下命令重启Redis:

sudo systemctl restart redis-server

至此,Redis单节点搭建完成。

2、Redis三主三从集群搭建

首先下载安装Redis,并将其安装在三个不同的服务器上。安装完成后在每个节点的redis.conf配置文件中添加以下内容:

port 7000
pidfile /var/run/redis_7000.pid
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
appendonly yes

然后启动三个节点的Redis,使用以下命令创建集群:

redis-cli --cluster create 192.168.1.2:7000 192.168.1.3:7000 192.168.1.4:7000

在通过正常的Redis客户端进行连接和操作前,需要先进行节点验证:

redis-cli --cluster check 192.168.1.2:7000
redis-cli --cluster check 192.168.1.3:7000
redis-cli --cluster check 192.168.1.4:7000

至此,Redis三主三从集群搭建完成。

六、Redis集群原理

Redis集群的工作方式是,将数据按一定规则分散到多个节点上,同时每个节点维护一份部分数据的拷贝,当需要访问数据时,会先计算出该数据应该在哪个节点上,然后进行访问。

Redis集群内部采用的哈希槽分配算法,将哈希值在0~16383之间的整数划分为16384个桶,每个桶对应一个槽。当执行SET、GET等操作时,根据操作的key计算出哈希值,并根据哈希值计算出对应的槽,然后将数据存储在该槽对应的节点上。如果对应节点宕机,则由备份节点接管槽的数据。

Redis集群的节点之间使用Gossip通信,用于集群的成员发现和状态更新。每个节点都会向集群中的一部分节点发送PING消息,在收到PING消息时,节点会回复PONG消息,用于确认集群中的节点是否正常工作。当节点感知到集群中有节点宕机时,会将宕机信息广播给其他节点。

七、Redis Cluster集群

Redis Cluster是Redis官方提供的集群方案,它基于Redis的多节点模型,以一定规则将数据分散到多个节点上,从而保证数据的高可用性和负载均衡。

Redis Cluster的主要特点是:

  • 分布式:数据在多个节点之间分