快速了解Redis中的单机、主从、哨兵和集群模式

1. Redis简介

Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,数据结构包含字符串、哈希、列表、集合和有序集合。Redis支持主从复制、发布/订阅、Lua脚本、LRU驱动事件、事务和不同级别的磁盘持久化。Redis的特点是高性能、高并发,是一款NoSQL数据库。

2. Redis单机模式

Redis单机模式指Redis服务器只运行在一个节点上,所有数据都存放在内存中。如果需要持久化数据,可以选择RDB(Redis DataBase)或AOF(Append Only File)方式。其中RDB方式是在某个时间点上将内存中的数据备份到磁盘中,而AOF方式则是将所有写操作追加到文件中,用于在重启Redis时恢复数据。

2.1 Redis数据类型

Redis支持五种数据类型,分别是:字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)。

其中,字符串是最常用的数据类型,可以存放任何数据,包括二进制数据。哈希类型可以看作是一个属性列表,适用于存储对象信息。列表类型用于存储有序的字符串列表,可以进行左右插入和弹出操作。集合类型存储无序的字符串集合,支持交、并、差集运算。有序集合类型类似于集合类型,但是每个元素都有对应的权重值(score),可以按照权重排序。

举例说明Redis数据类型

redis> SET key1 "hello"

OK

redis> HSET user:1 name "Tom"

(integer) 1

redis> LPUSH list1 "a"

(integer) 1

redis> LPUSH list1 "b"

(integer) 2

redis> SADD set1 "a"

(integer) 1

redis> SADD set1 "b"

(integer) 1

redis> ZADD zset1 1 "a"

(integer) 1

redis> ZADD zset1 2 "b"

(integer) 1

2.2 Redis命令行操作

Redis提供了一系列命令用于数据操作,可以在Redis客户端中执行。下面使用Redis命令行演示如何进行数据操作:

字符串操作

redis> SET key1 "value1"

OK

redis> GET key1

"value1"

哈希操作

redis> HSET person id 1

(integer) 1

redis> HSET person name "Tom"

(integer) 1

redis> HGET person id

"1"

redis> HGET person name

"Tom"

列表操作

redis> LPUSH list1 "item1"

(integer) 1

redis> LPUSH list1 "item2"

(integer) 2

redis> LRANGE list1 0 -1

1) "item2"

2) "item1"

集合操作

redis> SADD set1 "item1"

(integer) 1

redis> SADD set1 "item2"

(integer) 1

redis> SMEMBERS set1

1) "item2"

2) "item1"

有序集合操作

redis> ZADD zset1 1 "item1"

(integer) 1

redis> ZADD zset1 2 "item2"

(integer) 1

redis> ZRANGE zset1 0 -1 WITHSCORES

1) "item1"

2) "1"

3) "item2"

4) "2"

3. Redis主从模式

Redis主从模式是指Redis服务器可以拆分为主节点和从节点,共同构成一个分布式系统。主节点可以进行写操作,而从节点只能进行读操作。

Redis主从模式的作用:

提高Redis的读取性能,缓解单点读压力。

提高Redis的可用性,主节点宕机后从节点可以顶替主节点,不会影响整个系统的运行。

通过从节点可以进行数据备份。

3.1 Redis主从配置

Redis主从配置大致分为以下几个步骤:

启动主节点,修改配置文件

bind 127.0.0.1

port 6379

daemonize yes #后台启动

logfile "/var/log/redis.log"

# 打开主节点的只读模式

slave-read-only yes

启动从节点,修改配置文件

bind 127.0.0.1

port 6380

daemonize yes #后台启动

logfile "/var/log/redis.log"

# 设置从节点

slaveof 127.0.0.1 6379

3.2 Redis主从复制

Redis主节点可以将自己的数据同步到从节点中,从而实现主从复制。当主节点执行写操作时,会将数据同步到从节点中,从节点就可以读取到主节点的最新数据。

Redis主从复制的过程

从节点连接主节点,发送SYNC命令

redis> SLAVEOF 127.0.0.1 6379

OK

redis> SYNC

主节点执行BGSAVE命令,备份数据

redis> BGSAVE

Background saving started

主节点将备份过的数据发送给从节点

redis> PSYNC b8b5476d36ac5997f4a15dd75d2363e8aba708c1 3806997

+OK

从节点保存主节点的数据,并持续接收主节点的新数据

redis> WAIT 1 1000

OK

4. Redis哨兵模式

Redis哨兵模式是一种用于高可用性的Redis解决方案,能够在Redis主从复制的基础上,自动检测主节点的故障,切换到备用节点,保证Redis集群的高可用性。

如果主节点宕机,哨兵可以自动切换到备用节点,使得Redis集群仍然可以正常工作。

4.1 Redis哨兵配置

Redis哨兵配置大致分为以下几个步骤:

修改主节点配置文件

bind 127.0.0.1

port 6379

daemonize yes #后台启动

logfile "/var/log/redis.log"

# 打开主节点的只读模式

slave-read-only yes

# 开启哨兵模式

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 15000

sentinel parallel-syncs mymaster 1

启动哨兵进程,创建配置文件

port 26379 #哨兵端口号

daemonize yes

logfile "/var/log/sentinel.log"

# 设置哨兵监控的主节点

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 15000

sentinel parallel-syncs mymaster 1

4.2 Redis哨兵切换

当Redis主节点发生故障时,哨兵可以自动切换到备用节点,使得Redis集群仍然可以正常工作。

Redis哨兵切换的过程

哨兵检测到主节点故障

 +sdown master mymaster 127.0.0.1 6379

哨兵选举出新的主节点

 +elected-leader master mymaster 127.0.0.1 6380

哨兵更改备用节点为主节点,并通知前端应用

 +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380

5. Redis集群模式

Redis集群模式主要解决单机Redis的容量有限,无法支持海量数据的需求。Redis集群的每个节点都需要存储部分数据,可以横向扩展节点以增加整个Redis集群的存储容量。

Redis集群模式需要满足以下几个条件:

数据分片:将数据分为多个区间,每个节点存储其中的一部分数据。

节点间互联:Redis集群中的每个节点都要互相连通。

故障转移:当某个节点出现故障时,需要自动将其故障转移到其他节点上。

5.1 Redis集群搭建

Redis集群的搭建大致分为以下几个步骤:

创建6个Redis节点,并修改配置文件

bind 127.0.0.1

port 6379

daemonize yes #后台启动

logfile "/var/log/redis.log"

cluster-enabled yes

cluster-config-file node-6379.conf

cluster-node-timeout 5000

bind 127.0.0.1

port 6380

daemonize yes #后台启动

logfile "/var/log/redis.log"

cluster-enabled yes

cluster-config-file node-6380.conf

cluster-node-timeout 5000

# ... 其它节点

使用redis-trib.rb脚本创建Redis集群

$ redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

5.2 Redis集群操作

Redis集群提供了一系列操作命令,用于管理Redis节点和数据。下面以一些常用的Redis集群命令为例进行演示:

创建键值对

$ redis-cli -c -p 6379

127.0.0.1:6379> SET key1 value1

OK

查询键的信息

$ redis-cli -c -p 6379

127.0.0.1:6379> CLUSTER KEYSLOT key1

(sinteger) 12758

移动键的槽位

$ redis-cli -c -p 6379

127.0.0.1:6379> CLUSTER SETSLOT 12758 NODE 751e45d402d5393f137881891f9aa1f04791f09e

OK

查看节点信息

$ redis-cli -c -p 6379

127.0.0.1:6379> CLUSTER NODES

6. 总结

Redis是一个开源的内存数据结构存储系统,支持主从复制、哨兵和集群模式,具有高性能和高可用性。单机模式适用于小规模系统,而主从模式可以提高读取性能和可用性。哨兵模式可以实现自动故障转移,保证Redis集群的高可用性。集群模式则可以进行横向扩展,解决单机Redis容量的问题。不同模式有不同的优缺点,根据实际需求选择合适的模式才能发挥Redis的最大价值。

数据库标签