09-Redis 主从(复制)

Redis 主从(复制)

一、作用

  • slaveof host port命令来让一个服务器成为另一个服务器的从服务器。一个从服务器最多只能有一个主服务器,但是一个主服务器可以用多个从服务器,但是不支持主主复制主从也叫复制。主从模式优势和缺点如下:
1.高可用性(如果master宕机,slave可以介入并取代master的位置,但是主从需要手动介入,是一个缺点)
2.高性能(主备分离,分担master压力)
3.水平扩展性(master负责写、slave负责读。)
  • 缺点:
1.同步开销
2.数据不一致性问题
3.编程复杂

二、部署

2.1 安装包准备

2.2 配置

  • 修改主从节点配置如下(其他默认):
//master
bind 192.168.xx.1
port 6379
daemonize yes
logfile "redis.log"
dir /tmp
masterauth 123456   //这个是向master验证的密码
requirepass 123456  //这个是登陆的密码
appendonly yes
appendfilename "appendonly.aof"

//slave
bind 192.168.xx.2
port 6379
daemonize yes
logfile "redis.log"
dir /tmp
masterauth 123456   
requirepass 123456 //这里是验证master的密码
appendonly no
slaveof 192.168.13.52 6379
  • 注意master和slave的masterauth要设置成一样,因为配置哨兵的时候需要配置这个密码才能监控master和slave,如果二者不一样,那哨兵那边就没法配置了。
  • masterauth和requirepass辨析
requirepass:是客户端访问的密码。比如A是一个redis,所有要访问该redis的都需要带上该密码验证
masterauth:是向master验证的密码。比如B是一个slave,A是他的master,A的访问密码是requirepass=123456,那么B的masterauth就应该配置123456,意思是我向我的主设备去验证,这个值要和master的requirepass一致。
PS:如果master指定了requirepass是123456,那么slave的masterauth是其他的值比如123,那么salve向master验证就会失败,会提示如下错误
41497:S 16 Jul 20:30:41.393 * Master replied to PING, replication can continue...
41497:S 16 Jul 20:30:41.393 # Unable to AUTH to MASTER: -ERR invalid password
到这里我们发现,既然master指定一个requirepass,slave设备来认证,那么master的masterauth就没有用啦,因为他不需要向别人认证,实际上不是这样,因为在主备模式中,主备的身份是可能切换的,万一master宕机,再起来,自己很可能成为slave,此时他就需要向另外的设备验证,现在假设A、B两台设备,刚开始A是master,A设置requirepass=123,那么B的masterauth要是123,才能向A验证成功,等身份切换之后,就反过来需要A的masterauth等于B的requirepass,另外我们通常在客户端连接主备模式的时候,读写分离只会设置一个密码,因此A和B的requirepass要一样,这样一来由前面三种情况得知这四个值需要是一样的才能满足,因此最好这四个值一样。

2.3 启动

  • 同一条命令启动master和slave,命令:sudo ./bin/redis-server ./redis.conf

2.4 启动日志

  • 通过分析启动日志我们可以更好的理解主从模式的连接过程
//master
intellif@segment1:/tmp$ tail -fn 100  redis.log 
35470:C 16 Jul 16:05:32.969 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
35470:C 16 Jul 16:05:32.969 # Redis version=4.0.13, bits=64, commit=00000000, modified=0, pid=35470, just started
35470:C 16 Jul 16:05:32.969 # Configuration loaded
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.13 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 35471
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

35471:M 16 Jul 16:05:32.973 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
35471:M 16 Jul 16:05:32.973 # Server initialized
35471:M 16 Jul 16:05:32.973 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
35471:M 16 Jul 16:05:32.974 * DB loaded from append only file: 0.000 seconds
35471:M 16 Jul 16:05:32.974 * Ready to accept connections
35471:M 16 Jul 16:12:54.071 * Slave 192.168.13.53:6379 asks for synchronization
35471:M 16 Jul 16:12:54.071 * Full resync requested by slave 192.168.13.53:6379
35471:M 16 Jul 16:12:54.072 * Starting BGSAVE for SYNC with target: disk
35471:M 16 Jul 16:12:54.073 * Background saving started by pid 35613
35613:C 16 Jul 16:12:54.075 * DB saved on disk
35613:C 16 Jul 16:12:54.075 * RDB: 6 MB of memory used by copy-on-write
35471:M 16 Jul 16:12:54.093 * Background saving terminated with success
35471:M 16 Jul 16:12:54.093 * Synchronization with slave 192.168.13.53:6379 succeeded


//slave
intellif@segment2:/tmp$ tail -fn 100  redis.log 
44963:C 16 Jul 16:12:54.116 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
44963:C 16 Jul 16:12:54.116 # Redis version=4.0.13, bits=64, commit=00000000, modified=0, pid=44963, just started
44963:C 16 Jul 16:12:54.116 # Configuration loaded
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.13 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 44964
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

44964:S 16 Jul 16:12:54.121 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
44964:S 16 Jul 16:12:54.121 # Server initialized
44964:S 16 Jul 16:12:54.121 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
44964:S 16 Jul 16:12:54.121 * DB loaded from disk: 0.000 seconds
44964:S 16 Jul 16:12:54.121 * Ready to accept connections
44964:S 16 Jul 16:12:54.121 * Connecting to MASTER 192.168.13.52:6379
44964:S 16 Jul 16:12:54.121 * MASTER <-> SLAVE sync started
44964:S 16 Jul 16:12:54.121 * Non blocking connect for SYNC fired the event.
44964:S 16 Jul 16:12:54.121 * Master replied to PING, replication can continue...
44964:S 16 Jul 16:12:54.122 * Partial resynchronization not possible (no cached master)
44964:S 16 Jul 16:12:54.125 * Full resync from master: fd8fca61fd8a7a36f1dd29a53e429e7268b291f2:0
44964:S 16 Jul 16:12:54.144 * MASTER <-> SLAVE sync: receiving 195 bytes from master
44964:S 16 Jul 16:12:54.144 * MASTER <-> SLAVE sync: Flushing old data
44964:S 16 Jul 16:12:54.144 * MASTER <-> SLAVE sync: Loading DB in memory
44964:S 16 Jul 16:12:54.145 * MASTER <-> SLAVE sync: Finished with success
  • 我们看到master有:Slave 192.168.13.53:6379 asks for synchronization,然后开始执行save命令,之后Synchronization with slave 192.168.13.53:6379 succeeded。从copy-on-write看出redis使用到了写时复制的机制。
  • 在slave:Connecting to MASTER 192.168.13.52:6379,然后Flushing old data,最后Loading DB in memory,并且成功了。

三、主从数据同步

3.1 同步原理

  • 数据同步包括同步和数据传播这两个过程。
  • 数据同步:slave通过sync命令同步数据,主会通过BGSAVE创建RDB给从(载入RDB过程服务器阻塞),并将同步过程中的写命令记录在缓冲区,并同步给从。
  • 命令传播:同步完成后,主每一次执行可能改变服务器状态的命令都会同步给从,保证两者状态一致。
  • 部分同步:对于断线重连的场景,部分同步功能可以同步断线期间的命令,旧版本不支持该功能,每次断线都要做完整的同步,新版本psync才支持。
//部分同步依赖下面几个要素
1.主从服务器复制偏移量:双方会维护一个同步的偏移量,从服务器每次同步数据会带上自身的偏移量,如果一致
说明二者数据一致。如果从服务器的偏移量落后,说明它落后了,主服务器会给他补发之前的命令。
2.主服务器复制积压缓冲区:主服务器维护一个FIFO的队列保存最近传播的命令及其偏移量(默认1MB)。当从服务器
请求部分同步时候落后的偏移量还能在队列中找到就进行部分同步操作,反之的话就进行一次完整重同步操作。
该FIFO队列大小建议配置: 2 * 断线重连平均时间(S) * 每秒产生的写命令数据量
3.另外每个redis都会产生一个id,主服务器会把id发给从,同步的时候从会带过来,主会检查id判断自己是不是之前
的主,如果过程中发送了主切换,将进行完全同步

3.2 psync主从同步过程

  • 设置主服务器地址:slave of xxxx xx
  • 建立套接字
  • 发送ping命令
  • 身份验证 :主服器的requirepass和从服务器的masterauth需要一致
  • 同步端口信息
  • 数据同步
  • 命令传播

四、主从读写

  • master可以接受读写请求,slave只能读,不能写
//slave
192.168.13.53:6379> set address "shenzhen"
(error) READONLY You can't write against a read only slave.
192.168.13.53:6379> 
  • master写数据之后,slave会同步数据
  • 连接redis直接执行info命令,可以看到master和slave的角色信息,以及服务端的很多详细信息

五、主从链

  • 如果从结果过多,可能会加大主节点的同步开销,因此主从模式可以配置多级主从,即A是master,BC是A的slave,然后DE是B的slave,FG是C的slave。

六、参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。Redis是一个开源的内存数据结构存储系统,支持多种数据结构,如字符串、哈希、列表等。Redis主从复制是一种数据复制机制,用于将一个Redis服务器的数据复制到其他Redis服务器上。 下面是一个使用Docker Compose配置Redis主从复制的示例: 1. 首先,创建一个名为docker-compose.yml的文件,并在其中定义两个Redis服务,一个作为主服务器,另一个作为从服务器。示例配置如下: ```yaml version: '3' services: redis-master: image: redis ports: - "6379:6379" volumes: - ./redis-master-data:/data command: redis-server --appendonly yes redis-slave: image: redis volumes: - ./redis-slave-data:/data command: redis-server --slaveof redis-master 6379 ``` 2. 在上述配置中,我们定义了两个服务:redis-master和redis-slave。redis-master服务使用Redis官方镜像,并将主服务器的6379端口映射到主机的6379端口。同时,我们将主服务器的数据目录挂载到本地的redis-master-data目录。 3. redis-slave服务也使用Redis官方镜像,并将从服务器的数据目录挂载到本地的redis-slave-data目录。在command字段中,我们使用--slaveof参数指定redis-slave作为redis-master的从服务器,并指定主服务器的地址和端口。 4. 在终端中,进入包含docker-compose.yml文件的目录,并运行以下命令启动Redis主从复制: ```bash docker-compose up -d ``` 5. 等待一段时间,直到两个Redis服务器都成功启动。您可以使用以下命令检查容器的状态: ```bash docker-compose ps ``` 6. 现在,您可以通过连接到主服务器的6379端口来访问Redis主服务器,并将数据复制到从服务器。您可以使用以下命令连接到Redis服务器: ```bash redis-cli -h localhost -p 6379 ``` 7. 在连接到主服务器后,可以执行一些Redis命令来设置和检索数据。这些数据将自动复制到从服务器。 这就是使用Docker Compose配置Redis主从复制的基本步骤。您可以根据需要进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值