构建高性能数据库缓存之redis主从复制

数据库 Redis
主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致;且实现Redis的主从复制非常简单。

一、什么是redis主从复制?

主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致;且实现Redis的主从复制非常简单。

二、redis主从复制特点

1、同一个Master可以拥有多个Slaves。

2、Master下的Slave还可以接受同一架构中其它slave的链接与同步请求,实现数据的级联复制,即Master->Slave->Slave模式;

3、Master以非阻塞的方式同步数据至slave,这将意味着Master会继续处理一个或多个slave的读写请求;

4、Slave端同步数据也可以修改为非阻塞是的方式,当slave在执行新的同步时,它仍可以用旧的数据信息来提供查询;否则,当slave与master失去联系时,slave会返回一个错误给客户端;

5、主从复制具有可扩展性,即多个slave专门提供只读查询与数据的冗余,Master端专门提供写操作;

6、通过配置禁用Master数据持久化机制,将其数据持久化操作交给Slaves完成,避免在Master中要有独立的进程来完成此操作。

三、redis主从复制原理

wKiom1Ozz5OThc6NAAGUIzDDlQs366.jpg

当启动一个Slave进程后,它会向Master发送一个SYNC Command,请求同步连接。无论是第一次连接还是重新连接,Master都会启动一个后台进程,将数据快照保存到数据文件中,同时Master会记录所有修改数据的命令并缓存在数据文件中。后台进程完成缓存操作后,Master就发送数据文件给Slave,Slave端将数据文件保存到硬盘上,然后将其在加载到内存中,接着Master就会所有修改数据的操作,将其发送给Slave端。若Slave出现故障导致宕机,恢复正常后会自动重新连接,Master收到Slave的连接后,将其完整的数据文件发送给Slave,如果Mater同时收到多个Slave发来的同步请求,Master只会在后台启动一个进程保存数据文件,然后将其发送给所有的Slave,确保Slave正常。

四、服务器资源列表

wKiom1Ozz7PilaRGAAD2EbEmDy4850.jpg
 

五、配置过程

关于Redis的安装与配置这里便不操作,想了解的朋友请阅读:高性能数据库缓存之redis(一)http://cfwlxf.blog.51cto.com/3966339/1423106
 

3、1 Master端操作如下:

运行redis服务

  1. [root@redis_master sh]# redis-server/etc/redis/redis.conf 

查询redis运行日志

wKioL1Ozz6bw05VBAAJdwyDX2eg504.jpg

##通过阅读日志文件输出的一些信息,可以看出MasterSlave建立连接时,需要执行的会话机制:加载数据文件至硬盘,用时0.012秒,可想而知速度是多么的快,当然得依据数据的大小去评测;服务连接至6379端口,收到Slave同步连接请求,开启“BGSAVE”同步等;
 

清除Master端数据库中所有Key

  1. [root@redis_master sh]# redis-cli   
  2. 127.0.0.1:6379> FLUSHALL   
  3. OK   
  4. 127.0.0.1:6379> keys *   
  5. (empty list or set

3、2 Slave端操作如下:

[root@redis_slave ~]# vim/etc/redis/redis.conf

#添加Master端的IP与端口

  1. # slaveof <masterip><masterport>   
  2. slaveof 192.168.8.8 6379 

运行redis

  1. [root@redis_slave ~]# redis-server/etc/redis/redis.conf 

查询Slave运行日志

wKioL1Ozz7vRolYwAAOCbyhb-MU029.jpg

##分析redis日志,可以看出Slave与Master建立连接,数据同步的过程;如:发送SYNC命令,与Master端192.168.8.8:6379建立连接,然后Slave sync started;随后Master发送PING命令检查Slave的存活状态,复制被继续….

查询数据库中的所有key

  1. [root@redis_slave ~]# redis-cli                   
  2. 127.0.0.1:6379> keys *   
  3. (empty list or set

3、3 slave2端操作如下:

[root@redis_slave2 ~]# vim/etc/redis/redis.conf

#添加Slave端的IP与端口,实现级联复制;

  1. # slaveof <masterip><masterport>   
  2. slaveof 192.168.8.10 6379 

#运行redis服务

  1. [root@redis_slave2 ~]# redis-server/etc/redis/redis.conf 

查询redis运行日志

wKiom1Oz0AGRPpzyAAOAB3zsl1Q226.jpg

##结果与Slave1类似,只不过Slave2与Slave1(192.168.8.10:6379)建立连接,同步数据;MySQL的级联复制便是这样,Master->Slave1->Slave2;

#查询数据库的所有key

[root@redis_slave2 ~]# redis-cli

127.0.0.1:6379> keys *

(empty list or set)

3、4 master端操作如下:

  1. [root@redis_master sh]# redis-cli   
  2. 127.0.0.1:6379> MSET ID 1005 NAMEMariaDB City BeiJing   
  3. OK   
  4. 127.0.0.1:6379> MGET ID NAME City   
  5. 1) "1005" 
  6. 2) "MariaDB" 
  7. 3) "BeiJing" 
  8. 127.0.0.1:6379> keys *   
  9. 1) "NAME" 
  10. 2) "ID" 
  11. 3) "City" 

3、5 客户端验证同步结果

slave1端验证

  1. [root@redis_slave ~]# redis-cli   
  2. 127.0.0.1:6379> auth !@#aedf   
  3. 127.0.0.1:6379> keys *   
  4. 1) "City" 
  5. 2) "NAME" 
  6. 3) "ID" 
  7. 127.0.0.1:6379> MGET ID NAME City   
  8. 1) "1005" 
  9. 2) "MariaDB" 
  10. 3) "BeiJing" 

slave2端验证

  1. [root@redis_slave2 ~]# redis-cli   
  2. 127.0.0.1:6379> keys *   
  3. 1) "ID" 
  4. 2) "NAME" 
  5. 3) "City" 
  6. 127.0.0.1:6379> MGET ID NAME City   
  7. 1) "1005" 
  8. 2) "MariaDB" 
  9. 3) "BeiJing" 

四、Master write,Slave read机制

Redis的主从复制,通过程序实现数据的读写分离,让Master负责处理写请求,Slave负责处理读请求;通过扩展Slave处理更多的并发请求,减轻Master端的负载,如下图:

wKioL1Ozz-3yEjbBAAEZvvETcp8136.jpg

此图画得比较简易,展示了实现Redis读写分离的过程,通过判断用户读写请求,将write请求发送给Redis Master处理,Read请求发送给Redis Slave处理,文章中的不足之处,欢迎大家指点。

博文地址:http://cfwlxf.blog.51cto.com/3966339/1433637

责任编辑:林师授 来源: 51CTO
相关推荐

2023-09-24 14:32:15

2012-11-26 10:17:44

InnoDB

2011-04-06 09:59:00

MySQL数据库主从复制

2019-05-10 15:30:18

数据库主从复制MySQL

2015-03-13 19:34:41

2020-01-03 16:30:14

数据库读写分离分库

2023-03-15 08:30:37

2023-12-25 08:02:09

2023-03-19 22:38:12

逻辑复制PostgreSQL

2023-03-19 11:53:27

2021-01-12 08:03:19

Redis数据系统

2023-07-03 08:57:45

Master服务TCP

2019-02-11 09:04:24

MySQL主从复制数据库

2017-05-03 11:43:51

Redis数据库

2020-09-24 06:39:58

MySQL数据库

2015-04-22 14:41:04

云迁移Redis缓存数据模型调整

2019-08-27 15:00:09

MySQL数据库存储

2024-03-01 18:33:59

MySQL节点数据

2021-06-08 07:48:27

MySQL主从配置

2019-07-23 11:41:45

数据库SQLDocker
点赞
收藏

51CTO技术栈公众号