redis学习-p06-主从复制

主从复制介绍

image-20220716132942024

主机数据更新后,根据配置和策略自动同步到备机的机制,即master/slaver机制

Master以写为主,Slave以读为主

  • 读写分离,性能扩展
  • 容灾快速恢复

搭建主从复制(一主二仆)

ps:本示例因为资源关系,仅做学习过程,因此是在同一台主机上搭建1个主服务,2个从服务,以不同端口来区分。但是在实际场景中,一般在不同的主机服务器中部署主从,主从实例端口保持一致,以ip来区分。

IP 端口
127.0.0.1 主:6379
127.0.0.1 从:6381
127.0.0.1 从:6382

启动三个redis服务

  1. 在redis安装目录/usr/local/redis-6.2.7/中,编辑conf/redis.conf基础信息

    daemonize yes
    dir /usr/local/redis-6.2.7/data
  2. 在conf目录内,创建3个redis服务的配置文件

    • 创建redis_6379.conf

      include /usr/local/redis-6.2.7/conf/redis.conf
      
      port 6379
      pidfile /usr/local/redis-6.2.7/pid/redis_6379.pid
      logfile "/usr/local/redis-6.2.7/logs/redis_6379.log"
      dbfilename dump_6379.rdb
    • 复制redis_6379.confredis_6381.confredis_6382.conf,替换内容中的端口号

      cp redis_6379.conf redis_6381.conf
      cp redis_6379.conf redis_6382.conf
      sed -i 's/6379/6381/g' redis_6381.conf 
      sed -i 's/6379/6382/g' redis_6382.conf
  3. 启动3个redis服务

    注意:进入到bin目录下执行启动命令

    # 启动前,先kill掉已有的redis服务
    [root@izwz9f92w7soch5m251ghgz bin]# ./redis-server ../conf/redis_6379.conf 
    [root@izwz9f92w7soch5m251ghgz bin]# ./redis-server ../conf/redis_6381.conf 
    [root@izwz9f92w7soch5m251ghgz bin]# ./redis-server ../conf/redis_6382.conf 
    [root@izwz9f92w7soch5m251ghgz bin]# 
    [root@izwz9f92w7soch5m251ghgz bin]# 
    [root@izwz9f92w7soch5m251ghgz bin]# ps -ef | grep redis
    root      9892     1  0 14:00 ?        00:00:00 ./redis-server 127.0.0.1:6379
    root      9899     1  0 14:01 ?        00:00:00 ./redis-server 127.0.0.1:6381
    root      9917     1  0 14:01 ?        00:00:00 ./redis-server 127.0.0.1:6382
    root      9924  9715  0 14:01 pts/1    00:00:00 grep --color=auto redis

配置三个redis服务的主从关系

前面步骤3中将3个redis服务已经启起来,但是3者之间并没有主从配对关系,可通过info replication 查看主从配对关系如下

image-20220716150402976

配从(库)不配主(库)

slaveof <主库ip> <主库port> 成为某个实例的从服务器

slaveof no one 将从机变为主机

分别在从库6381,6382中执行:slaveof 127.0.0.1 6379,然后查看其主从配对关系

image-20220716152420161

至此,我们已经成功配对主从关系,其中6379实例为master,6381,6382 为slave

主从复制验证

在主机上写,在从机上读

image-20220716153232507

主机重启后,依然为主机

主机挂掉后,从机依然可提供读服务

image-20220716154147902

从机重启后,需重新配对成为从机

image-20220716155528996

主从复制原理

  • Slave启动成功连接到Master后,会发送一个sync命令
  • Master接收到sync命令后,启动后台的存盘进程,存盘完毕后将整个数据文件传输给Slave,完成一次完全同步。
  • 全量复制:Slave服务在接收到数据库文件后,将其存盘并加载到内存中
  • 增量复制:Master继续将新收集到的修改命令依次传给Slave,完成同步
  • Slave只要重新连接Master,将会完成一次完全同步

哨兵模式

哨兵是一个独立的进程,作为进程,它会独立运行。哨兵模式能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

image-20220716161729235

当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

配置哨兵

  1. 前提:已经成功按照上面的步骤,搭建好一主二仆

image-20220716192544221

  1. conf目录下创建名字为sentinel.conf文件,内容如下:

    sentinel monitor mymaster 127.0.0.1 6379 1

    其中mymaster为监控对象起的服务器名称,1为至少有多少个哨兵同意转移的数量

启动哨兵

./redis-sentinel ../conf/sentinel.conf

image-20220716210755675

将哨兵设置成后台运行,可修改conf/sentinel.conf配置,添加内容如下:

# 后台运行
daemonize yes
# 日志
logfile "/usr/local/redis-6.2.7/logs/sentinel_log.log"

主机挂掉,从机选举新主机

image-20220716211413466

image-20220716211641140

image-20220716211852290

哪个从机会被选举成主机呢?

  1. 选择优先级靠前的从机:replica-priority 100,值越小优先级越高。
  2. 选择偏移量最大的从机
  3. 选择runid最小的从机

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
My Show My Code