Redis(五)------redis主从复制的实现

前言

Redis(三)------redis主从复制原理

主从复制,主要优势在于实现了数据备份(主机和从机数据同步一致)、读写分离(主机主要负责写入数据,从机读数据,在读大于写的项目中提高了性能)。最后也为后续集成哨兵机制和集群的实现提供了依据。

在这里插入图片描述

一、多台服务器上配置主从复制

Redis从5.0以后主从配置属性发生了变化,在5.0之前配置的是slaveof,5.0以后变成了replicaof

服务器 用途 redis端口号 备注
centos7 192.168.1.6 主机Master(写) 6379 redis5.0
centos7 192.168.1.4 从机Slave(读) 6379 redis5.0
centos7 192.168.1.5 从机Slave(读) 6379 redis5.0

第一步:安装redis

三台服务器上分别安装redis,三台服务器redis配置为方便可配置一致,可以参考Redis(二)------centos7上安装单机版redis

第二步:添加主从配置项

主机(192.168.1.6) 不做任何修改,两台从机配置文件分配添加一下内容

# replicaof <masterip> <masterport>
replicaof 192.168.1.6 6379

如果主机添加了密码,需要在从机添加masterauth 参数,否则提示验证失败。
在这里插入图片描述

#主master的redis密码
masterauth 123456

第三步:启动服务,测试配置是否正确

启动三台服务器上redis服务。

向主机(192.168.1.6) 添加数据,连接Redis

#redis没有设置密码
./redis-cli
#redis 设置密码
./redis-cli -a "123456"

在这里插入图片描述

在1两台从机上分别连接redis后。执行

get k1

可以看到结果为主机上写入的name1的值,表示主从复制配置正确。

或者通过info replication 指定来查看主从配置信息

主节点中 cli中执行 info replication

./redis-cli
info replication

获取以下信息内容

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.4,port=6379,state=online,offset=1078,lag=1
master_replid:485ffa2cd3755449a7d16e0a279d60dae51bf9f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1078
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1078

  • connected_slaves:1(说明master node存在一个连接的slave node节点)
  • slave0 (slave0是关于第一个子节点的配置信息)

子节点中 cli中执行 info replication

获取以下信息内容

# Replication
role:slave
master_host:192.168.1.6
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:560
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:485ffa2cd3755449a7d16e0a279d60dae51bf9f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:560
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:560

  • role:slave (表明这个是子节点)
  • master_host:192.168.1.6 (显示master node的IP信息)
  • master_port:6379 (端口号)
  • master_link_status:up (表明是否连接上,up表示连接中,down表示连接失败)

第四步:master_link_status:down,即主从复制失败问题解决

如果master_link_status:up 跳过此步骤

down大概有以下几种情况,具体情况查看日志文件

1、protected-mode配置成了yes

replicaof 192.168.1.6 6379
masterauth 123456
#开启该参数后,redis只会本地进行访问,拒绝外部访问
protected-mode no

2、如果设置在主中设置了密码,从中应该配置密码

3、bind ip地址 表示可以那些服务器可以访问

设置为 0.0.0.0 表示都可以访问
如果是127.0.0.1 表示localhost访问

4、client-output-buffer-limit slave这个参数配置不当

从机日志文件:“I/O error trying to sync with MASTER:connection lost’”

原因:负责发数据给slave的client,如果buffer超过256m或者连续60秒超过64m,就会被立刻强行关闭!!! Traffic大的话一定要设大一点。否则就会出现一个很悲剧的循环,Master传输一个大的RDB给Slave,Slave努力的装载,但还没装载完,Master对client的缓存满了,再来一次。

#主机修改参数项值
client-output-buffer-limit slave 1024mb  256mb 0

5、端口,防火墙问题

#防火墙添加6379端口:firewall-cmd --permanent --zone=public --add-port=6379/tcp

#重启防火墙:firewall-cmd --reload

#查看默认防火墙状态(关闭后显示notrunning,开启后显示running)firewall-cmd --state

二、单台服务器上配置主从复制

单台服务器也可以实现主从复制,本质上是同时启动几个redis实例来实现。

具体配置可以参考Redis(二)------centos7上安装单机版redis

区别在于复制几个redis.conf,每个实例具有一个不同的redis.conf文件。其余配置与多级一致

启动redis服务,redis.conf 改位每个实例对应的配置文件名称,或者每个实例新建一个不同名称的服务
./redis-server redis.conf
服务器 用途 redis端口号 备注 redis配置文件 redis服务
centos7 192.168.1.6 主机Master(写)实例1 6379 redis5.0 redis6379.conf redis6379.service
centos7 192.168.1.6 从机Slave(读)实例2 6380 redis5.0 redis6380.conf redis6380.service
centos7 192.168.1.6 从机Slave(读)实例3 6381 redis5.0 redis6381.conf redis6381.service

三、总结

redis主从复制主要作用读写分离和数据备份的作用。主机负责写入数据,从机负责读取数据。

如果主机节点崩溃了,造成redis服务关闭,需要认为手动启动redis服务。

后续集成哨兵模式来实现解决这个问题,实现redis的高可用作用。

四、本实例中redis.conf 文件内容

下面是从机redis.conf 文件内容

如果是主机的话,删除replicaof 192.168.1.7 6379 即可


#bind 127.0.0.1

protected-mode no

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile "/var/run/redis_6379.pid"

loglevel notice

logfile "/var/log/redis/redis.log"

databases 16

always-show-logo yes

save 900 1
save 300 10
save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename "dump.rdb"

dir "/"

replicaof 192.168.1.7 6379
masterauth "123456"

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass "123456"

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

appendonly no

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

stream-node-max-bytes 4096
stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes






如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!

技术在交流中进步,知识在分享中传播

发布了166 篇原创文章 · 获赞 212 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/qq_29914837/article/details/103587556