简介
主从架构
在Redis主从复制架构中,通过定义主库(master)和从库(slave)的角色,实现数据的高效同步和备份
主从架构特点
- master的读写能力:
master是主从架构的数据中心,承担了所有的写入操作,也能处理读请求。
当master上执行任何改变数据的操作时,这些改动会自动同步到slave上。
- 单向数据流:
数据同步是单向的,数据只能从master同步到slave。
确保了数据同步的一致性和可靠性。
- slave的只读特性:
slave通常被配置为只读模式,slave接受并存储来着master的数据。
分散了Redis的读取压力,从而提高了主从架构的整体读取性能。
- 主slave的对应关系:
一个master可以对应多个slave,可以实现数据的冗余备份和读取压力的分散。
一个slave只能对应一个master,确保数据同步的一致性。
- slave的容错性:
如果某个slave出现故障,这个slave对Redis主从集群影响是非常小的。
一台slave出现故障,其他slave仍然可以提供读服务,master也能保证数据的正常写入操作。
当故障的slave恢复以后,它会从master自动同步丢失的数据。
- master故障的影响:
master故障会导致Redis暂时无法处理新的写入请求,但slave仍可以提供读取服务。
故障的master恢复以后Redis会重新提供完整的读写服务。
- master故障应对机制:
master发送故障时,主从集群中不会自动选举一个slave作为master。
可以使用集群模式或哨兵模式实现主节点的故障冗余。
主从复制原理
- 从库向主库发送sync命令,也就是从库向主库发送同步请求;
- 当主库接受到sync命令后,会执行bgsave命令保存此刻主库的快照;
- 创建的RDB文件期间主库上的执行命令会保存到缓冲区;
- 当主库执行bgsave以后,会向从库发送RDB文件;
- 从库接受RDB文件以后加载文件;
- 主库将缓冲区的所有写命令发送给从库执行;
- 至此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"