Redis主从搭建示例

编程

1,配置

1.1 master redis.conf

# basic

daemonize yes

port 6379

logfile /usr/local/redis/var/redis.log

pidfile /var/run/redis_6379.pid

dir /usr/local/redis/redis_dbfiles/

#受保护模式:在本redis服务暴露在外网时,开启此模式后,其他客户端连接时会校验绑定IP,密码等

protected-mode yes

# aof

# 主节点打开AOF机制

appendonly yes

# master

# 绑定IP,否则主从节点无法通信,127.0.0.1表示本机,0.0.0.0表示所有机器

bind 127.0.0.1

bind 123.123.123.123 #表示slave的机器IP

# 设置master的认证口令为redis

requirepass redis

# backlog大小

repl-backlog-size 1mb

# 快照同步的超时时间

repl-timeout 60

# 开启无盘复制

repl-diskless-sync yes

# 无盘复制的延迟默认为5s,是为了等待更多的slave连接

repl-diskless-sync-delay 5

# 是否开启主从节点复制数据的延迟机制

# 当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节点,这样主从之间延迟会变小

# 但增加了网络带宽的消耗。适用于主从之间的网络环境良好的场景

# 当开启时,主节点会合并较小的TCP数据包从而节省带宽。

# 默认发送时间间隔取决于Linux的内核,一般默认为40毫秒。

# 这种配置节省了带宽但增大主从之间的延迟。适用于主从网络环境复杂或带宽紧张的场景

repl-disable-tcp-nodelay no

# 触发快照同步的条件

# 如果增量同步的缓存大于256MB,或者超过60s大于64MB,则触发快照同步

client-output-buffer-limit slave 256mb 64mb 60

或者

client-output-buffer-limit replica 256mb 64mb 60

# 主从节点进行心跳的时间间隔

repl-ping-slave-period 10

其他配置含义

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica/slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

  • 对于普通客户端来说,限制为0,也就是不限制。因为普通客户端通常采用阻塞式的消息应答模式,何谓阻塞式呢?如:发送请求,等待返回,再发送请求,再等待返回。这种模式下,通常不会导致Redis服务器输出缓冲区的堆积膨胀;
  • 对于slave客户端来说,大小限制是256M,持续性限制是当客户端缓冲区大小持续60秒超过64M,则关闭客户端连接。也可以从节点中查看当前配置
  • 对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端连接;

 

1.2 slaver  redis.conf

# basic

daemonize yes

port 6379

logfile /var/log/redis/redis.log

pidfile /var/run/redis_6379.pid

dir /usr/local/redis/redis_dbfiles/

# slave

# 绑定本机的IP

bind 127.0.0.1

# 绑定master的ip和port

slaveof 100.100.100.100 6379

# 从节点只读

slave-read-only yes

# 从节点在处于快照同步期间是否对外提供服务

slave-serve-stale-data yes

# 如果 master 检测到 slave 的数量小于这个配置设置的值,将拒绝对外提供服务,0 代表,无论 slave 有几个都会对外提供服务

min-slaves-to-write 0

# 如果 master 发现大于等于 ${min-slaves-to-write} 个 slave 与自己的心跳超过此处配置的时间(单位s)

# 就拒绝对外提供服务

min-slaves-max-lag 10

# master的认证口令

masterauth redis

 

2,启动

按先后顺序,分别在后台启动master 和 slaver

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

 

3,查看日志

3.1 master日志

22328:M 26 May 2020 20:26:48.621 * Background RDB transfer terminated with success

22328:M 26 May 2020 20:26:48.513 * Replica 123.123.123.123:6379 asks for synchronization

22328:M 26 May 2020 20:26:48.513 * Full resync requested by replica 123.123.123.123:6379

22328:M 26 May 2020 20:26:48.513 * Delay next BGSAVE for diskless SYNC

22328:M 26 May 2020 20:26:48.434 * Starting BGSAVE for SYNC with target: replicas sockets

22328:M 26 May 2020 20:26:48.435 * Background RDB transfer started by pid 18323

18323:C 26 May 2020 20:26:48.436 * RDB: 0 MB of memory used by copy-on-write

22328:M 26 May 2020 20:26:48.444 # Connection with replica 123.123.123.123:6379 lost.

这里收到了Replica 的同步请求,然后为了同步,开始执行BGSAVE。后面由于一些问题,导致连接中断了。可以看slaver日志,看看发生了什么。

3.2 slaver日志

我们来看

50835:S 26 May 20:26:48.572 * Connecting to MASTER 100.100.100.100:6379

50835:S 26 May 20:26:48.572 * MASTER <-> SLAVE sync started

50835:S 26 May 20:26:48.578 * Non blocking connect for SYNC fired the event.

50835:S 26 May 20:26:48.585 # Error condition on socket for SYNC: Connection reset by peer

50835:S 26 May 20:26:49.580 * Connecting to MASTER 100.100.100.100:6379

50835:S 26 May 20:26:49.580 * MASTER <-> SLAVE sync started

50835:S 26 May 20:26:49.588 * Non blocking connect for SYNC fired the event.

50835:S 26 May 20:26:49.595 # Error reply to PING from master:

"-DENIED Redis is running in protected mode because protected mode is enabled,

no bind address was specified, no authentication password is requested to clients.

In this mode connections are only accepted from the loopback interface.

If you want to connect from external computers to Redis you may adopt one of the following solutions:

1) Just disable protected mode sending the command "CONFIG SET protected-mode no" from the loopback interface

by connecting to Redis from the same host the server is running,

however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.

2) Alternatively you can just disable the protected mode by editing the Redis configuration file,

and setting the protected mode option to "no", and then restarting the server.

3) If you started the server manually just for testing, restart it with the --portected-mode no option.

4) Setup a bind address or an authentication password.

NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

从master对PING命令的返回出现错误:DENIED 被拒绝,Redis在受保护模式下运行,因为受保护模式被打开,没有指定 bind 地址,clients的请求无校验密码。在这种模式下,只接收从本地界面去连接。如果你想从外部的电脑连接到Redis,你可以采取以下措施之一

  • 在服务器运行的主机中,用本地界面(比如终端),通过 CONFIG SET protected-mode no 去禁用受保护模式。然而,如果你这样做,一定要确保此Redis不能通过外部网络公开访问(否则任何人都可以访问)。使用 CONFIG REWRITE 命令使设置永久保存。
  • 编辑Redis的配置文件,将 protected-mode 设为 no,保存,退出,重启服务;
  • 如果只是想测试一下,可以重启服务时,带上 --protected-mode no 的选项;
  • 设置一个可以连接的client绑定地址 bind address 或者一个验证密码。

注意:你只需要对服务端做以上任何一个,就可以开始接受外部的连接。

解决以上问题后,日志变为

50835:S 26 May 21:37:47.338 * Connecting to MASTER 100.100.100.100:6379

50835:S 26 May 21:37:47.339 * MASTER <-> SLAVE sync started

50835:S 26 May 21:37:47.347 * Non blocking connect for SYNC fired the event.

50835:S 26 May 21:37:47.354 * Master replied to PING, replication can continue...

50835:S 26 May 21:37:47.377 * Partial resynchronization not possible (no cached master)

50835:S 26 May 21:37:53.024 * Full resync from master: f6ebf98b8cca919a5775dbe9dd43608a3fe8ad2c:2374

50835:S 26 May 21:37:53.025 * MASTER <-> SLAVE sync: receiving streamed RDB from master

50835:S 26 May 21:37:53.025 * MASTER <-> SLAVE sync: Flushing old data

50835:S 26 May 21:37:53.025 * MASTER <-> SLAVE sync: Loading DB in memory

50835:S 26 May 21:37:53.025 # Can"t handle RDB format version 9

50835:S 26 May 21:37:53.025 # Failed trying to load the MASTER synchronization DB from disk

可以看到,至少已经连接上了,且在进行同步。

只是最后,由于RDB数据格式的问题,导致同步失败。这是由于主从的Redis版本不一致引起的,可通过进行版本统一或兼容进行解决。

至此,我们把Redis的主从同步搭建跑了一遍。

 

4,补充

可以看到,我们这里的主从IP是外网了,主要是由于手头资源不够。实际项目中,肯定是有多台内网的Redis机器去做主从,包括集群等,既安全,又提高性能。

另外,如果Redis使用的是云服务器,那么除了在服务器中redis本身的配置文件外,还要注意云服务器厂商,对Redis实例做的一些限制,比如从服务权限上就把Redis实例的主从同步功能给限制了,或者访问白名单(bind ip),或者校验密码,等等。这些可以通过云服务器的管理后台看到。

 

以上是 Redis主从搭建示例 的全部内容, 来源链接: utcz.com/z/516835.html

回到顶部