前言
主从复制,主要优势在于实现了数据备份(主机和从机数据同步一致)、读写分离(主机主要负责写入数据,从机读数据,在读大于写的项目中提高了性能)。最后也为后续集成哨兵机制和集群的实现提供了依据。
一、多台服务器上配置主从复制
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
如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!
技术在交流中进步,知识在分享中传播