admin管理员组

文章数量:1794759

经典面试题 之 redis主从复制

经典面试题 之 redis主从复制

1、是什么? 主机更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为 主。

2、能干嘛?

  • 读写分离,性能扩展,降低主服务器的压力
  • 容灾,快速恢复,主机挂掉时,从机变为主机

 3、主从复制:怎么玩?3.1、配置1主2从 下面我们来配置1主2从的效果,现实中是需要3台机器的,为了方便,我们就在一台机器上来演示,通过不同的端口来区分机器,3台机器的配置

 

 3.2、配置主从1)创建案例工作目录:master-slave 执行下面命令创建 /opt/master-slave 目录,本次所有操作,均在 master-slave 目录进行。

ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9 # 方便演示,停止所有的 redis mkdir /opt/master-slave cd /opt/master-slave/

2)将redis.conf复制到master-slave目录

cp /opt/redis-6.2.1/redis.conf /opt/master-slave/

3)创建master的配置文件:redis-6379.conf 在/opt/master-slave目录创建 redis-6379.conf 文件,内容如下,注意 192.168.200.129 是这个测试 机器的ip,大家需要替换为自己的

#redis.conf是redis原配置文件,内部包含了很多默认的配置,这里使用include将其引用,相当于把 redis.conf内容直接贴进来了 include /opt/master-slave/redis.conf daemonize yes bind 192.168.200.129 #配置密码 requirepass 123456 dir /opt/master-slave/ logfile /opt/master-slave/6379.log #端口 port 6379 #rdb文件 dbfilename dump_6379.rdb #pid文件 pidfile /var/run/redis_6379.pid

4)创建slave1的配置文件:redis-6380.conf 在/opt/master-slave目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,多了后面2行

include /opt/master-slave/redis.conf daemonize yes bind 192.168.200.129 requirepass 123456 dir /opt/master-slave/ port 6380 dbfilename dump_6380.rdb pidfile /var/run/redis_6380.pid logfile /opt/master-slave/6380.log #用来指定主机:slaveof 主机ip 端口 slaveof 192.168.200.129 6379 #主机的密码 masterauth 123456

5)创建slave2的配置文件:redis-6381.conf

include /opt/master-slave/redis.conf daemonize yes bind 192.168.200.129 requirepass 123456 dir /opt/master-slave/ port 6381 dbfilename dump_6381.rdb pidfile /var/run/redis_6381.pid logfile /opt/master-slave/6381.log #用来指定主机:slaveof 主机ip 端口 slaveof 192.168.200.129 6379 #主机的密码 masterauth 123456

6)启动maste

redis-server /opt/master-slave/redis-6379.conf

7)启动slave1

redis-server /opt/master-slave/redis-6380.conf

8)启动slave2

redis-server /opt/master-slave/redis-6381.conf

 9)查看主机的信息 通过redis-cli命令连接主机,如下

redis-cli -h 192.168.200.129 -p 6379 -a 123456

通过下面命令,查看主机信息

info Replication

 10)查看slave1的信息

通过下面2个命令查询从机slave1的信息

redis-cli -h 192.168.200.129 -p 6380 -a 123456 info Replication

 11)同样查看slave2的信息

redis-cli -h 192.168.200.129 -p 6381 -a 123456 info Replication

 12)验证主从同步效果 在master上面执行下面2个命令

192.168.200.129:6379> flushdb OK 192.168.200.129:6379> set name ready OK 192.168.200.129:6379> set age 30 OK

到slave1上执行下面命令,可以看出来数据已经同步过来了

192.168.200.129:6380> mget name age 1) "ready" 2) "30" 192.168.200.129:6380>

同样到slave2上也执行一下,效果如下

192.168.200.129:6381> mget name age 1) "ready" 2) "30" 192.168.200.129:6381>

3.3、主从复制原理

  • slave启动成功连接到master后,会给master发送数据同步消息(发送sync命令)
  • master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
  • 全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
  • 增量复制:master继续将收集到的修改命令依次传给slave,完成同步
  • 但是只要重新连接master,一次完全同步(全量复制)将会被自动执行

 3.4、小结主redis挂掉以后情况会如何?从机是上位还是原地待命? 主机挂掉后,从机会待命,小弟还是小弟,会等着大哥恢复,不会篡位。从挂掉后又恢复了,会继续从主同步数据么? 会的,当从重启之后,会继续将中间缺失的数据同步过来。info Replication:查看主从复制信息 上面已经演示过了,主、从上都可以执行,用来查看主从信息。

2、常用的主从结构

2.1、一主二从 刚刚上面演示的就是一主二从,不过采用的都是配置文件的方式,实际上从机可以采用命令的方式配置,下面我们来演示一遍,大家看好了。1)创建案例工作目录:master-slave 执行下面命令创建 /opt/master-slave 目录,本次所有操作,均在 master-slave 目录进行。

ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9 # 方便演示,停止所有的 redis mkdir /opt/master-slave cd /opt/master-slave/

2)将redis.conf复制到master-slave目录

cp /opt/redis-6.2.1/redis.conf /opt/master-slave/

3)创建master的配置文件:redis-6379.conf 在/opt/master-slave目录创建 redis-6379.conf 文件,内容如下,注意 192.168.200.129 是这个测试 机器的ip,大家需要替换为自己的

include /opt/master-slave/redis.conf daemonize yes bind 192.168.200.129 requirepass 123456 dir /opt/master-slave/

port 6379 dbfilename dump_6379.rdb pidfile /var/run/redis_6379.pid logfile /opt/master-slave/6379.log

4)创建slave1的配置文件:redis-6380.conf 在/opt/master-slave目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,只是将6379 换成6380了

include /opt/master-slave/redis.conf daemonize yes bind 192.168.200.129 requirepass 123456 dir /opt/master-slave/

port 6380 dbfilename dump_6380.rdb pidfile /var/run/redis_6380.pid logfile /opt/master-slave/6380.log

5)创建slave2的配置文件:redis-6381.conf

include /opt/master-slave/redis.conf daemonize yes bind 192.168.200.129 requirepass 123456 dir /opt/master-slave/

port 6381 dbfilename dump_6381.rdb pidfile /var/run/redis_6381.pid logfile /opt/master-slave/6381.log

6)启动master

redis-server /opt/master-slave/redis-6379.conf

7)启动slave1

redis-server /opt/master-slave/redis-6380.conf

8)启动slave2

redis-server /opt/master-slave/redis-6381.conf

9)分别登陆3台机器,查看各自主从信息 本次我们并没有在slave1和slave2的配置文件通过 slaveof 命令配置主从信息,所以目前3台机器的角色都是master。 分别登陆对3个redis,然后用 info replication 命令看下3个的主从信息,如下: 下面我们将通过控制台命令来指定slave1和slave2的为master的从库。

 

  10)配置slave1为master的从库 (1)执行下面命令,连接slave1

redis-cli -h 192.168.200.129 -p 6380 -a 123456

(2)执行下面命令,设置master的密码 由于master需要密码,所以在slave1中需要指定master的密码,否则无法同步数据。

config set masterauth 123456

(3)执行下面命令,指定slave1的作为master的从机

slaveof 192.168.200.129 6379

(4)如下,使用 info replication 查看下slave1的主从信息

 11)配置slave2为master的从库 (1)执行下面命令,连接slave2

redis-cli -h 192.168.200.129 -p 6381 -a 123456

(2)执行下面命令,设置master的密码 由于master需要密码,所以在slave2中需要指定master的密码,否则无法同步数据。

config set masterauth 123456

(3)执行下面命令,指定slave2的作为master的从机

slaveof 192.168.200.129 6379

(4)如下,使用 info replication 查看下slave2的主从信息

 12)再来看看master的主从信息

[root@hspEdu01 ~]# redis-cli -h 192.168.200.129 -p 6379 -a 123456 192.168.200.129:6379> info replication

注意:通过 slaveof 命令指定主从的方式,slave重启之后主从配置会失效,所以,重启后需要在slave上重新通过 slaveof 命令进行设置,这个不要忘记了。 中途通过 slaveof 变更转向,本地的数据会被清除,会从新的master重新同步数据。

2.2、薪火相传 若master下面挂很多slave,master会有压力,实际上slave下面也可以挂slave,如下图,配置这里就不演示了,和上面的类似。

 当master挂掉之后,我们可以从slave中选择一个作为主机。 比如我们想让slave1作为主机,那么可以在slave1上执行下面的命令就可以了。

slaveof no one

此时slave1就变成主机了,然后再去其他slave上面执行 slaveof 命令将其挂在slave1上。 这种主备切换有个缺点:需要手动去执行命令去操作,不是太方便。

本文标签: 主从面试题经典Redis