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
其中,bind
、port
、daemonize
、pidfile
、logfile
、dir
和dbfilename
参数的含义与主节点相同,不再赘述。
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
其中,bind
、port
、daemonize
、pidfile
、logfile
和dir
参数的含义与前面所说的相同,不再赘述。
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
其中,bind
、port
、daemonize
、pidfile
、logfile
和dir
参数的含义与前面所说的相同,不再赘述。
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