Redis主从复制(一)

前面两篇文章和小伙伴们聊了redis中的数据备份问题,也对快照备份和AOF备份做了对比,本文我们来聊聊redis中的主从复制问题,算是数据备份的第三种解决方案。

主从复制可以在一定程度上扩展redis性能,redis的主从复制和关系型数据库的主从复制类似,从机能够精确的复制主机上的内容。实现了主从复制之后,一方面能够实现数据的读写分离,降低master的压力,另一方面也能实现数据的备份。

配置方式

假设我有三个redis实例,地址分别如下:

192.168.248.128:6379  
192.168.248.128:6380  
192.168.248.128:6381

即同一台服务器上三个实例,配置方式如下:

1.将redis.conf文件更名为redis6379.conf,方便我们区分,然后把redis6379.conf再复制两份,分别为redis6380.conf和redis6381.conf。如下:

2.打开redis6379.conf,将如下配置均加上6379,(默认是6379的不用修改),如下:

port 6379
pidfile /var/run/redis_6379.pid
logfile "6379.log"
dbfilename dump6379.rdb
appendfilename "appendonly6379.aof"

3.同理,分别打开redis6380.conf和redis6381.conf两个配置文件,将第二步涉及到6379的分别改为6380和6381。 4.输入如下命令,启动三个redis实例:

[root@localhost redis-4.0.8]# redis-server redis6379.conf
[root@localhost redis-4.0.8]# redis-server redis6380.conf
[root@localhost redis-4.0.8]# redis-server redis6381.conf

5.输入如下命令,分别进入三个实例的控制台:

[root@localhost redis-4.0.8]# redis-cli -p 6379
[root@localhost redis-4.0.8]# redis-cli -p 6380
[root@localhost redis-4.0.8]# redis-cli -p 6381

此时我就成功配置了三个redis实例了。

6.假设在这三个实例中,6379是主机,即master,6380和6381是从机,即slave,那么如何配置这种实例关系呢,很简单,分别在6380和6381上执行如下命令:

127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK

这一步也可以通过在两个从机的redis.conf中添加如下配置来解决:

slaveof 127.0.0.1 6379

OK,主从关系搭建好后,我们可以通过如下命令可以查看每个实例当前的状态,如下:

127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=56,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=56,lag=0
master_replid:26ca818360d6510b717e471f3f0a6f5985b6225d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56

我们可以看到6379是一个主机,上面挂了两个从机,两个从机的地址、端口等信息都展现出来了。如果我们在6380上执行INFO replication,显示信息如下:

127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:630
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:26ca818360d6510b717e471f3f0a6f5985b6225d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:630
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:630

我们可以看到6380是一个从机,从机的信息以及它的主机的信息都展示出来了。

7.此时,我们在主机中存储一条数据,在从机中就可以get到这条数据了。

主从复制注意点

1.如果主机已经运行了一段时间了,并且了已经存储了一些数据了,此时从机连上来,那么从机会将主机上所有的数据进行备份,而不是从连接的那个时间点开始备份。 2.配置了主从复制之后,主机上可读可写,但是从机只能读取不能写入(可以通过修改redis.conf中 slave-read-only 的值让从机也可以执行写操作)。 3.在整个主从结构运行过程中,如果主机不幸挂掉,重启之后,他依然是主机,主从复制操作也能够继续进行。

复制原理

每一个master都有一个replication ID,这是一个较大的伪随机字符串,标记了一个给定的数据集。每个master也持有一个偏移量,master将自己产生的复制流发送给slave时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新slave的状态。复制偏移量即使在没有一个slave连接到master时,也会自增,所以基本上每一对给定的Replication ID, offset都会标识一个master数据集的确切版本。当slave连接到master时,它们使用PSYNC命令来发送它们记录的旧的master replication ID和它们至今为止处理的偏移量。通过这种方式,master能够仅发送slave所需的增量部分。但是如果master的缓冲区中没有足够的命令积压缓冲记录,或者如果slave引用了不再知道的历史记录(replication ID),则会转而进行一个全量重同步:在这种情况下,slave会得到一个完整的数据集副本,从头开始(参考redis官网)。

简单来说,就是以下几个步骤:

    1.slave启动成功连接到master后会发送一个sync命令。  
    2.Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令。  
    3.在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。  
    4.全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。  
    5.增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。  
    6.但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。  

OK,redis主从复制我们先介绍这么多,更多资料小伙伴们可以参考官方文档http://www.redis.net.cn/tutorial/3501.html。小伙伴在看官方文档时,有什么问题欢迎留言讨论。

本文分享自微信公众号 - 牧码小子(gh_d1ca11234a30)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

MySQL调优

48090
来自专栏代码世界

MYSQL之库操作

一、系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 my...

37170
来自专栏Pythonista

sublime Text与python3的中文编码错误解决办法

但是在windows上面运行代码正常。 原因是因为:linux系统语言导致的。 查看了一下系统环境编码

19930
来自专栏LIN_ZONE

远程连接ubuntu mysql出现2003错误 cant connect to mysql(转载)

2.打开my.cnf文件,找到 bind-address = 127.0.0.1 在前面加上#注释掉,如下: #bind-address = 127.0.0....

31620
来自专栏数据和云

Oracle公共云中的MySQL InnoDB集群

题记:本文我们将引导大家完成在Oracle公共云(OPC)中创建3节点InnoDB集群的整个过程,包括从OPC IaaS资源的初始配置,到InnoDB集群的创建...

34950
来自专栏张善友的专栏

SQLite 预写式日志

      SQLite在3.7.0版本引入了WAL (Write-Ahead-Logging),WAL的全称是Write Ahead Logging,它是很多...

26790
来自专栏喵了个咪的博客空间

基于PhalApi2的Redis拓展

基于PhalApi2的Redis拓展 ? 前言 Redis在PHP开发中运用场景已经无处不在,小到简单缓存大到数据库或消息队列都可以使用Redis来进行实现,基...

32750
来自专栏我是攻城师

ElasticSearch的一些删除用法笔记

38270
来自专栏Python

mysql数据备份与恢复

MySQL数据备份与恢复 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境。但不能恢复到异构系统中如Windows。 #2. 逻辑备份: 备份的是建...

43060
来自专栏Laoqi's Linux运维专列

Ansible roles搞定LAMP架构

15020

扫码关注云+社区

领取腾讯云代金券