redis-主从复制、读写分离

1、为什么要主从复制(一主多仆),读写分离:redis在作为缓存的时候,随着数据的不断增加,是有可能出现宕机的,这时候就出现了“单点故障”,解决方案就是进行主从复制,读写分离。

原理图:Master是主,Slave是从,Master具有读写权限,Slave只有读权限(以下还会介绍redis分布式锁,即当Master死机之后,利用“sentinel监控”把Slave其中一个提升为Master,让系统继续执行,直至原Master重启后恢复)

 
 
企业一般用redis都是”高可用“的,以下为原理图

 

   

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

 daemonize yes
 

 

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也会自动把内存的数据保存到磁盘。

posted @ 2018-05-30 22:32  隐语者  阅读(4931)  评论(0编辑  收藏  举报