主从复制
redis主从复制特点:
- 一个master可以有多个slave
- 一个slave只能有一个master
- 数据流是单向的,从master到slave
配置主从
实现方式有两种:
- 命令方式
- 配置文件方式
命令方式
在从服务器上执行以下命令即可:
slaveof 主服务器的IP 端口号
slaveof
命令是异步的,不阻塞。
从服务器现有的数据会先被清空,然后再从主服务器同步数据
停止一台从服务器的复制操作,在此台从服务器上执行以下命令:
slaveof no one
配置文件方式
只需要修改从服务器的配置
修改配置文件
假如主服务器IP是: 127.0.0.1
端口是: 6379
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
// 配置此服务器只提供读取操作
slave-read-only yes
然后重启从服务器的redis服务
查看主从信息命令:
redis-cli -p 6379 info replication
主从+Sentinel
哨兵模式
Redis Sentinel是Redis官方的高可用性解决方案。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器。
此种模式下,客户端要访问的服务IP不是主节点,而是sentiner
服务器的 IP。
配置主从
- 快速生成主节点的配置文件
编译全新文件/etc/redis/redis-6380.conf
, 添加如下内容port 6380 daemonize yes protected-mode no pidfile /var/run/redis-6380.pid logfile /var/log/redis-6380.log dir /redis/data/
假如是多个主机实现的,就需要更改为
protected-mode yes
,并且添加bind 0.0.0.0
- 快速生成从节点的配置文件
[root@s1 ~]# sed 's/6380/6381/g' /etc/redis/redis-6380.conf > /etc/redis/redis-6381.conf [root@s1 ~]# sed 's/6380/6382/g' /etc/redis/redis-6380.conf > /etc/redis/redis-6382.conf
查看配置文件内容,检验配置结果
[root@s1 ~]# cat /etc/redis/redis-6381.conf port 6381 daemonize yes pidfile /var/run/redis-6381.pid logfile /var/log/redis-6381.log dir /redis/data/ [root@s1 ~]# cat /etc/redis/redis-6382.conf port 6382 daemonize yes pidfile /var/run/redis-6382.pid logfile /var/log/redis-6382.log dir /redis/data/
- 配置主从关系
[root@s1 ~]# echo "slaveof 172.16.153.178 6380" >> /etc/redis/redis-6381.conf [root@s1 ~]# echo "slaveof 172.16.153.178 6380" >> /etc/redis/redis-6382.conf
- 启动服务,并验证进程
[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6380.conf [root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6381.conf [root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6382.conf [root@s1 ~]# ps -ef |grep redis root 4335 1 0 19:30 ? 00:00:03 /usr/local/bin/redis-server *:6380 root 4490 1 0 20:17 ? 00:00:00 /usr/local/bin/redis-server *:6381 root 4495 1 0 20:17 ? 00:00:00 /usr/local/bin/redis-server *:6382 root 4500 3755 0 20:17 pts/0 00:00:00 grep --color=auto redis
配置
sentinel
获取程序
Sentinel 程序可以在编译后的 src 文档中发现, 它是一个命名为 redis-sentinel 的程序。
运行一个 Sentinel 所需的最少配置如下所示:
Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。
运行一个 Sentinel 所需的最少配置如下所示:
// 监控一个 Redis 服务器
// 名称为 mymaster ,IP 为 127.0.0.1 端口为 6380
// 最后的 2 是指最少有 2 个 Sentinel 实例同意一台 redis 服务器宕机,才会认为 客观下线。
// sentinel monitor 自定义的主节点名称 主节点的 IP 主节点端口 票数
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
// 180 秒后开始故障自动装换
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
各个选项的功能如下:
down-after-milliseconds
选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。
不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。
将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。
parallel-syncs
选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
最终的配置文件:
daemonize yes
port 27000
dir "/tmp"
logfile "27000.log"
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1