Redis5.0.5主从复制配置
阅读原文时间:2021年04月20日阅读:1

文章目录

效果

  • 一主一从
  • 一主多从
  • 主->从->从 链式结构

环境准备

1.软件
OS:CentOS 7.3
Redis:5.0.5(安装目录:/application/redis/)

2.虚拟机

虚拟机

HOSTNAME

IP

端口

web01(主库)

192.168.55.9

6379

web02(从库)

192.168.55.10

6379

Redis安装,参考 https://blog.csdn.net/zhou16333/article/details/84154879

配置

在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

在 Redis 中使用复制功能非常容易,

第一种:修改配置文件

只需要在数据库的配置文件中加入slaveof 主数据库地址 主数据库端口即可,主数据库无需进行任何配置。

[root@web02 ~]# vim /application/redis/redis.conf

slaveof  192.168.55.9  6379

启动从库
[root@web02 ~]# /application/redis/bin/redis-server /application/redis/redis.conf &

第二种:(在从库)命令行

从库运行时,在命令行中设置

......> SLAVEOF  192.168.55.9  6379

如果该数据库已经是其他主数据库的从数据库了,SLAVEOF命令会停止和原来数据库的同步转而和新数据库同步。此外对于从数据库来说,还可以使用 SLAVEOF NO ONE命令来使当前数据库停止接收其他数据库的同步并转换成为主数据库。

使用INFO命令来分别在主库和从库中获取Replication节的相关信息:

主库

从库

[root@web01 src]# /application/redis/bin/redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.55.10,port=6379,state=online,offset=168,lag=1
master_replid:679029a635afe5a0f57290da96c37368f15cf44a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168

[root@web02 ~]# /application/redis/bin/redis-cli
127.0.0.1:6379> INFO replication
#Replication
role:slave
master_host:192.168.55.9
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:182
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:679029a635afe5a0f57290da96c37368f15cf44a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182

测试

主库

从库

第一步

127.0.0.1:6379> set foo bar
OK

第二步

127.0.0.1:6379> get foo
“bar”

第三步

127.0.0.1:6379> set foo hi
(error) READONLY You can’t write against a read only replica.

可以通过设置从数据库的配置文件中的 slave-read-onlyno 以使从数据库可写,但是因为对从数据库的任何更改都不会同步给任何其他数据库,并且一旦主数据库中更新了对应的数据就会覆盖从数据库中的改动,所以通常的场景下不应该设置从数据库可写,以免导致易被忽略的潜在应用逻辑错误。

单机多实例

在一台服务器上启动两个 Redis 实例,监听不同端口,其中一个作为主数据库,另一个作为从数据库。

首先我们不加任何参数来启动一个Redis实例作为主数据库:

$ /application/redis/bin/redis-server

该实例默认监听6379端口。然后加上slaveof参数启动另一个Redis实例作为从数据库,并让其监听6380端口:

$ /application/redis/bin/redis-server --port 6380 --slaveof 127.0.0.1 6379

此时在主数据库中的任何数据变化都会自动地同步到从数据库中。
我们打开 redis-cli实例A并连接到主数据库:

$ /application/redis/bin/redis-cli -p 6379

再打开redis-cli实例B并连接到从数据库:

$ /application/redis/bin/redis-cli -p 6380

无硬盘复制

主库开启该选项时,Redis在与从数据库进行复制初始化时将不会将快照内容存储到硬盘上,而是直接通过网络发送给从数据库,避免了硬盘的性能瓶颈。

vim /application/redis/redis.conf

repl-diskless-sync yes

参考文献

[1] 李子骅. Redis入门指南(第2版)[M]. 人民邮电出版社. 2015-05-01。