redis-主从复制、读写分离
1、为什么要主从复制(一主多仆),读写分离:redis在作为缓存的时候,随着数据的不断增加,是有可能出现宕机的,这时候就出现了“单点故障”,解决方案就是进行主从复制,读写分离。
原理图:Master是主,Slave是从,Master具有读写权限,Slave只有读权限(以下还会介绍redis分布式锁,即当Master死机之后,利用“sentinel监控”把Slave其中一个提升为Master,让系统继续执行,直至原Master重启后恢复)
2、为了方便测试,把开启redis服务的四个关键文件统一放在单独的文件夹中 :redis-server、redis-benchmark、redis-cli和redis.conf(redis.conf在redis的文件根目录下,其余三个在根目录的/src目录下)
# mkdir /usr/redis # cp redis-server /usr/redis # cp redis-benchmark /usr/redis # cp redis-cli /usr/redis # cp redis.conf /usr/redis # cd /usr/redis
3、在/usr/redis中把redis-conf进行Copy两次:redis1-conf、redis2-conf
依次修改redis-conf(主)、redis1-conf(仆)、redis2-conf(仆).
vi redis.conf vi redis1.conf vi redis2.conf
(/'字符串' 可以进行快速Find 查找位置,键盘“N”可以Find Next 查找下一个)
redis-conf (daemonize no (守护进程)改为 daemonize yes ):
port 6379 requirepass 123456
redis1-conf -->:
port 6380 slaveof 127.0.0.1 6379 masterauth 123456 requirepass 123456
redis2-conf -->:
port 6381 slaveof 127.0.0.1 6379 masterauth 123456 requirepass 123456
4、保存之后运行相对应的服务和客户端
注意:当使用 命令:/redis-server redis-conf ,提示redis-conf无效时,只要把redis-conf放在redis-server同一个目录下即可。
服务:
./redis-server redis.conf ./redis-server redis1.conf ./redis-server redis2.conf
主(Master):
仆1(slave):
仆2(slave):
(slove是不具备写权限的,会提示:(error) READONLY You can't write against a read only slave.)
可以看到主机执行写命令,从机能同步主机的值,主从复制,读写分离就实现了。
但是万一主机挂了怎么办,这是个麻烦事情,所以redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,类似与zookeeper.
5、一般“高可用”我们需要建立三个sentinel(哨兵)构成“sentinel集群”,即三个:sentinel.conf、sentinel1.conf、sentinel2.conf
sentinel.conf:
一般默认的就行,但是我们之前设置了认证密码,所以需要加一个命令(在对应的位置添加,直接看注释就知道在哪里添加了):
sentinel auth-pass mymaster 123456
之后Copy两份:sentinel1.conf、sentinel2.conf,改其端口号即可(我用的:26379、26479、26579)。
6、分别启动三哨兵:
./redis-sentinel sentinel.conf ./redis-sentinel sentinel1.conf ./redis-sentinel sentinel2.conf
接着启动三个服务:
./redis-server redis.conf ./redis-server redis1.conf ./redis-server redis2.conf
查询线程情况:
自此已经完成redis的状态:“三哨兵”、“一主”、“二从”
7、测试下:
我们kill其中一个主服务:
(注意:sentinel是怎么进行主从切换的呢?就是以下这条命令:
sentinel monitor mymaster 127.0.0.1 6379 2 最后面的2就是当两个以上的sentinel确定6379端口的“主服务”已经“主观下线”的时候,就把“从服务“自动切换成主服务
)
其中的sentinel服务产生变化:
自动把端口号6380的服务切换成主服务,当然sentinel会修改我们的配置文件:
sentinel.conf、sentinel1.conf、sentinel2.conf--》(原来的mymaster 由6379 换为了 6380)
此时切换已经完成,但是我们还需要启动之前的主redis,但是这个时候我们已经进行过插入、删除等操作,以前的主redis并没有记录这些,那么就需要将之前从redis的dump.rdb替换之前redis 的dump.rdb文件。
首先进入redis-master 启动 ./redis-server redis.conf
在新生成的主master操作(设置为主服务)
127.0.0.1:6380> slaveof no one
然后设置重启的6379服务为从服务,映射主服务:
127.0.0.1:6379> slaveof 127.0.0.1 6380
顺便把6381也重新指向6380为主服务,映射主服务
127.0.0.1:6381> slaveof 127.0.0.1 6380
如果还没有回到原来的状态,就关掉sentinel(哨兵)在设置。
8、总结:
1、”主从复制、读写分离、主从切换“的原理和步骤和集群
2、扩展:企业一般使用redis都是使用”高可用“的,最基本的就是”三哨兵、二主、三从“,我们这边博文写的是”三哨兵、一主、三从“,自己加一个主服务就可以了
3、”高可用”作用:防止“Master主服务宕机”、“sentinel监控宕机”,要知道,数据的丢失是致命的。
4、redis的作用:Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。当然,redis也会自动把内存的数据保存到磁盘。