一.主从复制
概述
在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风 险。
面临问题:
-
机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器 并且要保证数据是同步的。
-
容量瓶颈。当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足 不了。当然,你可以重新买个 128G 的新机器。
解决办法
要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存 储到其他多个网络节点上。
注意:
Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现 Redis的高可用,实现对数据的冗余备份从而保证数据和服务的高可用。
什么是主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后 者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
主从复制的作用
-
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
-
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服 务的冗余。
-
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是 在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
-
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis高可用的基础。
主从复制的环境搭建
-
在redis目录中新建以下文件
-
新建redis6379.conf
include redis.conf文件路径 #例如:....../redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb
-
新建redis6380.conf
include redis.conf文件路径 #例如:....../redis.conf pidfile /var/run/redis_6380.pid port 6380 dbfilename dump6380.rdb
-
新建redis6381.conf
include redis.conf文件路径 #例如:....../redis.conf pidfile /var/run/redis_6381.pid port 6381 dbfilename dump6381.rdb
2.在redis目录下的src目录中启动三台redis服务器并在后台运行
./redis-server ../redis6379.conf ./redis-server ../redis6380.conf ./redis-server ../redis6381.conf
3.配置从库
-
进入6380,6381端口的redis服务器
在Xshell上另外复制两台机器,在第二台机器的src目录中输入
./redis-cli -p 6380 #进入6380端口的redis客户端
在第三台机器的src目录中输入
./redis-cli -p 6381 #进入6381端口的redis客户端
-
分别在两个redis客户端中输入
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 OK
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 OK
这样就完成了主从复制,而主机master可以用来接收redis客户端所写的数据,然后再将master中所保留的数据复制同步到从机slave上;而从机slave上只能读取master的数据,不能往里面写!
Redis主从复制缺点
当主机 Master 宕机以后,我们需要人工解决切换。
二.哨兵机制
主从切换技术
当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造 成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
哨兵概述
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独 立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例.
哨兵作用
集群监控:负责监控redis master和slave进程是否正常工作
消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
故障转移:如果master node挂掉了,会自动转移到slave node上
配置中心:如果故障转移发生了,通知client客户端新的master地址
-
redis目录中配置sentinel文件
-
新建sentinel-26379.conf文件
#端口 port 26379 #守护进程运行 daemonize yes #日志文件 logfile "26379.log" sentinel monitor mymaster 127.0.0.1 6379 2
-
新建sentinel-26380.conf文件
#端口 port 26380 #守护进程运行 daemonize yes #日志文件 logfile "26380.log" sentinel monitor mymaster 127.0.0.1 6379 2
-
新建sentinel-26381.conf文件
#端口 port 26381 #守护进程运行 daemonize yes #日志文件 logfile "26381.log" sentinel monitor mymaster 127.0.0.1 6379 2
-
-
启动哨兵节点并在后台运行
-
进入src目录
-
./redis-sentinel ../sentinel-26379.conf ./redis-sentinel ../sentinel-26380.conf ./redis-sentinel ../sentinel-26381.conf
3.进入哨兵节点
-
在Xshell上另外复制两个机器(保证在src目录中)
-
分别在三个机器上输入
-
./redis-cli -p 26379
-
./redis-cli -p 26380
-
./redis-cli -p 26381
结论
-
哨兵系统中的主从节点,与普通的主从节点并没有什么区别,故障发现和转移是由哨兵来控制和完 成的。
-
哨兵节点本质上是redis节点。
-
每个哨兵节点,只需要配置监控主节点,便可以自动发现其他的哨兵节点和从节点。
-
在哨兵节点启动和故障转移阶段,各个节点的配置文件会被重写(config rewrite)。