1、Redis 主从复制
Redis主从复制和MySQL主从复制的目的是一样的,都是为了数据的备份与减轻单台服务器的压力。
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。
为了避免单点故障,我们需要将数据库复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。
那么这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上,这个该怎么实现呢?
1.1、Redis 主从复制的实现方式一:
1.1.1、Redis提供了复制(replication)功能来自动实现多台服务器的数据同步。
1.1.2、从redis2.6开始,master默认用于写,slave默认用于读,向slave写数据会导致错误。
1.1.3、修改配置文件 redis.conf,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器:
在此就用一个Redis通过三个不同的配置文件实现实例化三个Redis数据库。
第一步:复制三分 redis.conf文件,并分别命名为:redis6380.conf、redis6381.conf、redis6382.conf;
第二步:执行 > redis638*.conf,清空复制出来的配置文件,然后分别按复制以下代码,粘贴到对应的配置文件中,此处注意,如果是在不同的主机上部署的redis,要实现集群,则还要更改 bind 参数,注释掉 bind,同时修改 protected-mode 参数的值为 no,否则不能实现 Redis 相互通讯,也不能实现哨兵监听。
master 的配置文件 redis6380.conf:
slave1 的配置文件 redis6381.conf:include /usr/local/redis-x.x.x/redis.conf daemonize yes port 6380 pidfile /var/run/redis_6380.pid logfile 6380.log dbfilename dump6380.rdb
slave2 的配置文件 redis6382.conf:include /usr/local/redis-x.x.x/redis.conf daemonize yes port 6381 slaveof 127.0.0.1 6380 pidfile /var/run/redis_6381.pid logfile 6381.log dbfilename dump6381.rdb
配置解释:include /usr/local/redis-x.x.x/redis.conf daemonize yes port 6382 slaveof 127.0.0.1 6380 pidfile /var/run/redis_6382.pid logfile 6382.log dbfilename dump6382.rdb
1.1.4、分别启动 redis实例,执行命令:/usr/local/redis-x.x.x/src/redis-server /usr/local/redis-x.x.x/redis638*.conf;include:表示包含redis的默认配置文件,然后下面再更改需要该表的属性就相当于重写或者覆盖默认的属性。
daemonize:改成yes,表示Redis有台运行,启动的时候可以不加 & 就是后台运行,如果不覆盖这个属性,则如果要后台运行启动需要在命令的后面加上 &;
port:表示端口号;
pidfile :pid文件,每个Redis实例需要不同的文件,如果不改,将会覆盖默认的文件;
logfile:日志文件,同上;
dbfilename:rdb文件,同上;
slaveof:从属于那个主机下的那个端口号所在的redis实例。
1.1.5、分别执行命令:/usr/local/reids-x.x.x/src/redis-cli -h <主机IP> -p <端口号>,进入命令行客户端;
1.1.6、分别执行命令:info replication,查看当前实例的角色信息。
此方式的主从复制已经成功。
1.2、Redis主从复制方式二:
此方式与第一种方式的不同点在于:配置文件内容都按 master 的配置文件内容修改,master 启动正常启动,slave 启动命令不同,命令:/usr/local/redis-x.x.x/src/redis-server /usr/local/redis-x.x.x/redis638*.conf --slaveof <主机IP> <端口号>;
主服务信息查看:
从服务信息查看:
2、Redis容灾处理:当Master服务出现故障,需手动将slave中的一个提升为master, 剩下的slave挂至新的master上(冷处理)
2.1、将其中一台 slave 提升为 master,在客户端命令行执行命令:slaveof no one;
2.2、将其他的 salve 挂在新的 master 上:slaveof <主机IP> <端口号>
3、主从复制总结:
一个Master可以有多个Slave,Slave下线,只是读请求的处理性能下降;Master下线,写请求无法执行,其中一台Slave使用slaveof no one命令成为Master,其它Slave执行slaveof命令指向这个新的Master,从它这里同步数据以上过程是手动的,要实现自动化处理,这就需要Sentinel哨兵,实现故障转移Failover操作
4、Redis 高可用 Sentinel 哨兵监听模式:
4.1、Sentinel高可用哨兵监听作用:这是redis官方提供的高可用方案,可以用它管理多个Redis服务实例。Redis 编译后(make 后)产生redis-sentinel程序文件,可以在一个redis中运行多个sentinel进程。Sentinel会不断检查Master和Slave是否正常,如果Sentinel挂了,就无法监控。所以需要多个哨兵,组成Sentinel网络,一般最小的 sentinel 网络由三个 sentinel 组成。监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监控服务器的信息。当一个Sentinel认为被监控的服务器已经下线时,它会向网络中的其它Sentinel进行确认,判断该服务器是否真的已经下线。如果下线的服务器为主服务器,那么Sentinel网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并让其从服务器转移到新的主服务器下,以此来让系统重新回到上线的状态。当下线的旧主服务器重新上线,Sentinel会让它成为从,挂到新的主服务器下。
4.2、Sentinel高可用哨兵监听模式的实现:
4.2.1、复制三份 sentinel.conf,并重命名为 sentinel26380.conf、sentinel26381.conf、sentinel26382.conf;
4.2.2、修改配置文件:
a、修改 Sentinel 端口号:port 26379 改为:port 26380、port 26381、port 26382;
b、修改监听的主服务器:sentinel monitor mymaster 127.0.0.1 6379 2 改为:sentinel monitor mymaster 127.0.0.1 6379 2; 格式:Sentinel monitor <自定义主服务器name>
4.2.3、启动 sentinel,创建监听网络,执行三条命令:/usr/local/redis-4.0.8/src/redis-sentinel /usr/local/redis-4.0.8/sentinel26380.conf、/usr/local/redis-4.0.8/src/redis-sentinel /usr/local/redis-4.0.8/sentinel26381.conf、/usr/local/redis-4.0.8/src/redis-sentinel /usr/local/redis-4.0.8/sentinel26382.conf
4.3.4、最后配上完整的 Redis 集群的图片信息:
Redis进程一览:
哨兵信息:
4.2.5、查看sentinel的监听效果:直接停掉主服务,停掉方式:kill -9 <进程号>或者shutdown,然后查看哨兵sentinel的信息,如下图:
4.2.6、将挂掉的服务器重新启动,哨兵会自动将新启动的服务器当作从服务器挂到现在的主服务下。
5、Redis高可用哨兵监听模式总结:
哨兵监听一般都会组成一个分布式的sentinel网络,至少需要三台服务器。当被监听的主服务下线的时候,sentinel网络会进行故障转移,将其他的某一个从服务器提升为主服务器,将别的服务器挂在新的主服务器下,保证redis系统重新回到线上。当被监听的挂掉的服务器重新启动的时候,sentinel网络会将其当作从服务器也挂在当前的主服务器下。