Redis中主从复制、哨兵、集群的示例分析

1. Redis主从复制的示例

Redis是一个支持主从复制的NoSQL数据库,主从复制指将一台Redis服务器(称为“主节点”)上的数据自动同步到其他Redis服务器上(称为“从节点”)。Redis主从复制的作用是提高数据的可用性和可伸缩性。下面是一个Redis主从复制的示例:

1.1 主节点配置

在Redis主节点上,需要在配置文件中指定一些参数,使其能够接受从节点的连接和复制请求。以下是一个示例配置文件:

bind 127.0.0.1

port 6379

daemonize yes

pidfile /var/run/redis/redis.pid

logfile /var/log/redis/redis.log

dir /var/lib/redis

dbfilename dump.rdb

save 900 1

save 300 10

save 60 10000

appendonly yes

其中,bind参数指定了Redis服务器监听的IP地址,通常设置为127.0.0.1,表示只接受本地连接。如果需要允许外部访问,可以设置为服务器的IP地址。

port参数指定了Redis服务器监听的端口号,默认为6379

daemonize参数指定是否以守护进程模式运行,即后台运行,默认为no,建议设置为yes

pidfile参数指定守护进程的PID文件路径,默认为/var/run/redis.pid

logfile参数指定日志文件路径,默认为stdout

dir参数指定数据文件的存储路径,默认为/var/lib/redis

dbfilename参数指定数据文件的文件名,默认为dump.rdb

save参数指定Redis自动保存数据文件的条件。下面这行配置的含义是当900秒内至少有1个key值被修改,Redis就会自动保存数据文件:

save 900 1

其他两行的含义依次是300秒内至少有10个key值被修改,60秒内有10000个key值被修改。可以根据实际需求进行调整。

appendonly参数指定是否开启数据追加模式,即每次修改数据时先将修改操作记录到日志文件中,然后再更新数据文件。这种模式可以保证当Redis意外宕机时数据不会丢失,但会降低写入性能。

1.2 从节点配置

在Redis从节点上,也需要在配置文件中指定一些参数,以便连接到主节点并接收其同步数据。以下是一个示例配置文件:

bind 127.0.0.1

port 6380

daemonize yes

pidfile /var/run/redis/redis-slave.pid

logfile /var/log/redis/redis-slave.log

dir /var/lib/redis

dbfilename dump.rdb

slaveof 127.0.0.1 6379

其中,bindportdaemonizepidfilelogfiledirdbfilename参数的含义与主节点相同,不再赘述。

slaveof参数指定从节点要连接的主节点的IP地址和端口号。这里设置为连接到127.0.0.1的6379端口,即连接到本地运行的主节点。

1.3 启动主从节点

配置文件设置好之后,可以分别启动主从节点。先启动主节点:

$ redis-server /etc/redis/redis.conf

然后启动从节点:

$ redis-server /etc/redis/redis-slave.conf

查看主从节点的运行状态:

$ ps aux | grep redis

可以看到主节点的进程和从节点的进程都已经在运行。

1.4 主从节点的同步

主从节点启动之后,主节点会自动将数据同步到从节点。可以通过以下命令查看主从节点的同步状态:

$ redis-cli

127.0.0.1:6379> info replication

可以得到类似以下的输出:

# Replication

role:master

connected_slaves:1

slave0:ip=127.0.0.1,port=6380,state=online,offset=447,lag=0

master_repl_offset:447

从节点的状态中,state字段值为online表示连接正常,offset为已复制的字节数,lag为主从节点的延迟时间。如果没有出现错误,主从节点的同步就已经完成了,并且从节点可以读取主节点上的数据。

2. Redis哨兵的示例

Redis哨兵是一个自动化监控和管理Redis集群的工具。它可以检测Redis节点的故障并自动对故障节点进行故障转移,实现高可用性。下面是一个Redis哨兵的示例:

2.1 配置哨兵

在Redis哨兵中,需要指定一些参数,以便运行监控和管理Redis节点的任务。以下是一个示例配置文件:

bind 127.0.0.1

port 26379

daemonize yes

pidfile /var/run/redis/sentinel.pid

logfile /var/log/redis/sentinel.log

dir /var/lib/redis

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 10000

sentinel parallel-syncs mymaster 1

其中,bindportdaemonizepidfilelogfiledir参数的含义与前面所说的相同,不再赘述。

sentinel monitor命令指定了要监控的Redis节点,其参数依次为:mymaster为该Redis节点的别名,127.0.0.1为Redis节点的IP地址,6379为Redis节点的端口号,2为至少有2个哨兵认为该Redis节点已经下线时才进行故障转移。

sentinel down-after-milliseconds命令指定了哨兵检测到Redis节点失联后等待的时间,单位为毫秒,默认是30秒。该行配置表明,如果Redis节点在5000毫秒内没有响应,则认为该节点已经故障。

sentinel failover-timeout命令指定了进行故障转移的最长等待时间,单位为毫秒,默认是3分钟。该行配置表明,如果启动故障转移后10秒钟内没有进行成功,则认为该故障转移失败。

sentinel parallel-syncs命令指定了同时可以进行多少个从节点的复制操作。该行配置表明,每次故障转移最多同时进行1个从节点的同步操作。

2.2 启动哨兵

配置文件设置好之后,可以启动Redis哨兵:

$ redis-sentinel /etc/redis/sentinel.conf

查看哨兵的运行状态:

$ ps aux | grep redis-sentinel

可以看到哨兵进程已经在运行。

2.3 故障转移测试

可以在主节点上手动停止Redis服务器模拟节点下线的情况。然后可以通过以下命令查看哨兵的状态:

$ redis-cli -p 26379

127.0.0.1:26379> sentinel master mymaster

可以看到类似以下的输出:

1) "name"

2) "mymaster"

3) "ip"

4) "127.0.0.1"

5) "port"

6) "6379"

7) ...

8) "num-other-sentinels"

9) "2"

10) "quorum"

11) "2"

12) "failover-timeout"

13) "10000"

14) "parallel-syncs"

15) "1"

16) "failover-state"

17) "unknown"

18) "last-ok-ping-rep-reply"

19) "0"

20) "last-ping-reply"

21) "PONG"

22) "last-ping-sent"

23) "0"

24) "down-after-milliseconds"

25) "5000"

26) "info-refresh"

27) "527"

28) "role-reported"

29) "master"

30) "role-reported-time"

31) "74707"

32) "config-epoch"

33) "1"

可以看到最上面的输出行显示了当前监控的主Redis节点的状态。如果该节点已经下线,则根据配置文件中的参数进行故障转移,将主节点的状态转移到一个从节点上。可以通过以下命令查看故障转移的状态:

$ redis-cli -p 26379

127.0.0.1:26379> sentinel get-master-addr-by-name mymaster

可以看到输出的IP地址和端口号已经变为下线节点的从节点(如果存在多个从节点,则会选取其中一个做为新的主节点):

1) "127.0.0.1"

2) "6380"

这说明故障转移已经成功完成。

3. Redis集群的示例

Redis集群是一种分布式数据库解决方案,它将数据分散存储在多个Redis节点上,每个节点存储部分数据。下面是一个Redis集群的示例:

3.1 配置集群

在Redis集群中,需要将多个Redis节点组成一个集群,在其中选择一个节点作为集群的配置节点。以下是一个示例配置文件:

bind 127.0.0.1

port 6379

daemonize yes

pidfile /var/run/redis/redis.pid

logfile /var/log/redis/redis.log

dir /var/lib/redis

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

其中,bindportdaemonizepidfilelogfiledir参数的含义与前面所说的相同,不再赘述。

cluster-enabled参数用于开启集群模式。

cluster-config-file参数用于指定集群配置文件的路径和文件名。

cluster-node-timeout参数指定节点失联的超时时间,单位为毫秒,默认为15秒。如果节点超过该时间没有响应,则认为该节点失联。

3.2 创建集群

创建一个Redis集群需要多个Redis节点,可以使用以下命令启动6个实例:

$ redis-server redis-7000.conf

$ redis-server redis-7001.conf

$ redis-server redis-7002.conf

$ redis-server redis-7003.conf

$ redis-server redis-7004.conf

$ redis-server redis-7005.conf

其中,每个节点运行在一个不同的端口上。这里使用了6个节点,其实际个数应该是根据要存储的数据量和性能需求来决定的。在6个节点中选择一个作为配置节点,使用以下命令创建集群:

$ redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \

127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \

--cluster-replicas 1

其中,--cluster参数用于指示创建集群,其后的参数依次为各个Redis节点的IP地址和端口号。在这里使用了6个节点,如果需要更多或更少的节点,则可以修改命令中的参数。

--cluster-replicas参数用于指定每个主节点应该拥有的从节点的个数。这里设置为1,则每个主节点都有一个从节点。

3.3 测试集群

创建集群之后,可以使用以下命令测试集群的状态:

$ redis-cli -c cluster nodes

可以看到类似以下的输出:

1f5b8c437f81df620a5db9c1f7bc24383dc042b9 127.0.0.1:7001 master - 0 1510438183000 0 connected

d5cd0eee2548e76d4fdad2b1a29331212734271f 127.0.0.1:7003 master - 0 1510438183048 2 connected

f8cf9af71b421819aa6aad8a23b64ac9904289a1 127.0.0.1:7005 myself,master - 0 0 3 connected

85d84c1cf58fb06471e10865d8ac74d13ed205cb 127.0.0.1:7002 master - 0 1510438181547 1 connected

e23fc1c0d4a70e1e2d0e3b26f64e4166d53731eb 127.0.0.1:7006 slave f8cf9af71b421819aa6aad8a23b64ac9904289a1 0 1510438185580 6 connected

31e10