05. Redis架构-主从

本文详细介绍了Redis主从复制架构的工作原理,包括数据流向、角色分工(master的写入和slave的只读),以及如何规划、配置和验证主从关系,还涉及了故障处理和多从节点的扩展方法。
摘要由CSDN通过智能技术生成

简介

主从架构

在Redis主从复制架构中,通过定义主库(master)和从库(slave)的角色,实现数据的高效同步和备份

主从架构特点

  1. master的读写能力:

master是主从架构的数据中心,承担了所有的写入操作,也能处理读请求。
当master上执行任何改变数据的操作时,这些改动会自动同步到slave上。

  1. 单向数据流:

数据同步是单向的,数据只能从master同步到slave。
确保了数据同步的一致性和可靠性。

  1. slave的只读特性:

slave通常被配置为只读模式,slave接受并存储来着master的数据。
分散了Redis的读取压力,从而提高了主从架构的整体读取性能。

  1. 主slave的对应关系:

一个master可以对应多个slave,可以实现数据的冗余备份和读取压力的分散。
一个slave只能对应一个master,确保数据同步的一致性。

  1. slave的容错性:

如果某个slave出现故障,这个slave对Redis主从集群影响是非常小的。
一台slave出现故障,其他slave仍然可以提供读服务,master也能保证数据的正常写入操作。
当故障的slave恢复以后,它会从master自动同步丢失的数据。

  1. master故障的影响:

master故障会导致Redis暂时无法处理新的写入请求,但slave仍可以提供读取服务。
故障的master恢复以后Redis会重新提供完整的读写服务。

  1. master故障应对机制:

master发送故障时,主从集群中不会自动选举一个slave作为master。
可以使用集群模式或哨兵模式实现主节点的故障冗余。

主从复制原理

  1. 从库向主库发送sync命令,也就是从库向主库发送同步请求;
  2. 当主库接受到sync命令后,会执行bgsave命令保存此刻主库的快照;
  3. 创建的RDB文件期间主库上的执行命令会保存到缓冲区;
  4. 当主库执行bgsave以后,会向从库发送RDB文件;
  5. 从库接受RDB文件以后加载文件;
  6. 主库将缓冲区的所有写命令发送给从库执行;
  7. 至此Redis主从建立成功,之后主库每写一个命令都会传到从库上执行。

实现

一主一从

规划Redis

  • 主机规划
    | 主机名称 | 主机地址 | 主机规划 |
    | — | — | — |
    | redis-master | 192.168.108.129 | master主机 |
    | redis-slave | 192.168.108.130 | slave主机 |

  • 目录规划
    | 用途 | 目录 | 备注 |
    | — | — | — |
    | 家目录 | /usr/local/redis/ | |
    | 解压目录 | /usr/local/ | |
    | 日志目录 | /usr/local/redis/logs/ | |
    | 数据目录 | /usr/local/redis/data/ | |
    | 配置目录 | /usr/local/redis/conf/ | |
    | PID目录 | /usr/local/redis/pid/ | |

  • 检查主机

#检查防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
  • 拓扑图

安装Redis

涉及主机:redis-master和redis-slave

#解决依赖关系
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc

#下载Redis
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

#解压Redis
tar -zxvf redis-3.2.9.tar.gz -C /usr/local/

#重命名Redis文件
mv /usr/local/redis-3.2.9 /usr/local/redis

#安装Redis
cd /usr/local/redis
make
make PREFIX=/usr/local/redis MALLOC=libc install

#创建目录和用户
useradd redis
mkdir -p /usr/local/redis/{data,conf,logs,pid}
chown -R redis:redis /usr/local/redis/

#复制配置文件
cp /usr/local/redis/redis.conf /usr/local/redis/conf/

#命令加载至profile
cat >> /etc/profile << 'EOF'
export PATH=$PATH:/usr/local/redis/bin/
EOF

source /etc/profile

配置Redis

  • redis-master和redis-slave
cat > /usr/local/redis/conf/redis.conf << EOF
bind 0.0.0.0
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"

#数据保存路径
dir /usr/local/redis/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF

主从复制

命令实现
  • slave
192.168.108.130:6379> slaveof 192.168.108.129 6379
OK
  • 主动退出slave
192.168.108.130:6379> SLAVEOF no one
OK
配置实现
  • slave
cat >> /usr/local/redis/conf/redis.conf << EOF
##添加主库信息
#主库地址和端口
slaveof 192.168.108.129 6379
#主库密码
masterauth 1qaz!QAZ
EOF

验证Redis

  • 启动Redis
redis-server /usr/local/redis/conf/redis.conf
  • 查看slave信息
192.168.108.130:6379> AUTH 1qaz!QAZ
OK
192.168.108.130:6379> info replication
# Replication
role:slave
master_host:192.168.108.129
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:302
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
  • 查看master信息
192.168.108.129:6379> AUTH 1qaz!QAZ
OK
192.168.108.129:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.108.130,port=6379,state=online,offset=344,lag=1
master_repl_offset:344
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:343
  • 验证读写
#从库写入
192.168.108.130:6379> set age 18
(error) READONLY You can't write against a read only slave.

#主库写入
192.168.108.129:6379> set age 18
OK

#从库查询
192.168.108.130:6379> get age
"18"

一主多从

规划Redis

  • 主机规划
    | 主机名称 | 主机地址 | 主机规划 |
    | — | — | — |
    | redis-master | 192.168.108.129 | master主机 |
    | redis-slave-1 | 192.168.108.130 | slave主机 |
    | redis-slave-2 | 192.168.108.131 | slave主机 |

  • 目录规划
    | 用途 | 目录 | 备注 |
    | — | — | — |
    | 家目录 | /usr/local/redis/ | |
    | 解压目录 | /usr/local/ | |
    | 日志目录 | /usr/local/redis/logs/ | |
    | 数据目录 | /usr/local/redis/data/ | |
    | 配置目录 | /usr/local/redis/conf/ | |
    | PID目录 | /usr/local/redis/pid/ | |

  • 检查主机

#检查防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
  • 拓扑图

安装Redis

涉及主机:redis-master和redis-slave

#解决依赖关系
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc

#下载Redis
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

#解压Redis
tar -zxvf redis-3.2.9.tar.gz -C /usr/local/

#重命名Redis文件
mv /usr/local/redis-3.2.9 /usr/local/redis

#安装Redis
cd /usr/local/redis
make
make PREFIX=/usr/local/redis MALLOC=libc install

#创建目录和用户
useradd redis
mkdir -p /usr/local/redis/{data,conf,logs,pid}
chown -R redis:redis /usr/local/redis/

#复制配置文件
cp /usr/local/redis/redis.conf /usr/local/redis/conf/

#命令加载至profile
cat >> /etc/profile << 'EOF'
export PATH=$PATH:/usr/local/redis/bin/
EOF

source /etc/profile

配置Redis

  • redis-master和redis-slave
cat > /usr/local/redis/conf/redis.conf << EOF
bind 0.0.0.0
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"

#数据保存路径
dir /usr/local/redis/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF

主从复制

命令实现
  • slave
192.168.108.130:6379> slaveof 192.168.108.129 6379
OK
  • 主动退出slave
192.168.108.130:6379> SLAVEOF no one
OK
配置实现
  • slave

从节点扩容便利,只需要添加主库信息,重启redis即可。

cat >> /usr/local/redis/conf/redis.conf << EOF
##添加主库信息
#主库地址和端口
slaveof 192.168.108.129 6379
#主库密码
masterauth 1qaz!QAZ
EOF

验证Redis

  • 启动Redis
redis-server /usr/local/redis/conf/redis.conf
  • 查看redis-slave-1信息
192.168.108.130:6379> AUTH 1qaz!QAZ
OK
192.168.108.130:6379> info replication
# Replication
role:slave
master_host:192.168.108.129
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:302
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
  • 查看redis-slave-2信息
192.168.108.131:6379> INFO replication
# Replication
role:slave
master_host:192.168.108.129
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:883
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
  • 查看master信息
192.168.108.129:6379> AUTH 1qaz!QAZ
OK
192.168.108.129:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.108.130,port=6379,state=online,offset=344,lag=1
master_repl_offset:344
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:343
  • 验证读写
#从库写入
192.168.108.130:6379> set age 18
(error) READONLY You can't write against a read only slave.

192.168.108.131:6379> set age 18
(error) READONLY You can't write against a read only slave.

#主库写入
192.168.108.129:6379> set age 18
OK

#从库查询
192.168.108.130:6379> get age
"18"

192.168.108.131:6379> get age
"18"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值