Redis主从部署
原理介绍
Redis主从复制(Master-Slave Replication)是一种数据同步机制,允许从服务器(Slave)精确复制主服务器(Master)的数据。工作原理如下:
-
同步初始化:
-
当Slave启动或连接到Master时,会发送SYNC命令
-
Master执行BGSAVE生成RDB快照文件,同时缓存所有新写入命令
-
RDB文件生成完成后发送给Slave,Slave载入RDB
-
Master再将缓存的写命令发送给Slave执行
-
-
增量同步:
-
Redis 2.8+支持PSYNC命令,支持部分重同步
-
Master和Slave维护一个复制偏移量(replication offset)
-
如果Slave断开后重连,只需同步断开期间的数据
-
-
命令传播:
- 初始化同步完成后,Master每执行一个写命令就将其发送给Slave
优点
-
数据冗余:实现数据热备份,提高数据安全性
-
读写分离:Master写,Slave读,提高服务器负载能力
-
高可用基础:是哨兵和集群实现的基础
-
故障恢复:当Master出现问题时,可以快速切换到Slave
缺点
-
数据一致性问题:由于异步复制,主从数据可能存在延迟
-
写操作瓶颈:所有写操作仍在Master,无法解决写压力问题
-
故障切换复杂:原生主从模式不具备自动故障转移能力
-
全量同步开销大:首次同步或长时间断开后,全量同步消耗大量资源
-
存储能力受限:单机存储容量受限于Master内存
1、测试环境
硬件环境:N100 x86主机 Proxmox系统
软件环境:Ubuntu 22.04.3 LTS
软件版本:redis-7.4.0.tar.gz
主机环境:
192.168.0.150 redis-master
192.168.0.151 redis-node1
192.168.0.152 redis-node2
2、部署操作
2.1、主机IP及主机名调整
#配置静态IP
vi /etc/netplan/00-installer-config.yaml
#添加以下内容,静态IP根据个人需求调整
network:
version: 2
renderer: networkd
ethernets:
ens18:
addresses: [192.168.0.150/24] # 静态 IP 和子网掩码
dhcp4: false # 关闭 DHCP
routes:
- to: default # 默认路由
via: 192.168.0.1 # 网关地址
nameservers:
addresses: [192.168.0.1, 114.114.114.114] # DNS 服务器
#生效配置
netplan apply
#mast节点:192.168.0.150 k8smaster
hostnamectl set-hostname redis-master
#node节点:192.168.0.151
hostnamectl set-hostname redis-node1
#node节点:192.168.0.152
hostnamectl set-hostname redis-node2
2.2、调整hosts及时间同步
#添加host配置
cat >> /etc/hosts << EOF
192.168.0.150 redis-master
192.168.0.151 redis-node1
192.168.0.152 redis-node2
EOF
#node节点主机如果是使用master主机克隆时,注意调整/etc/hosts中127.0.1.1配置,克隆主机默认为原始master节点配置
#调整系统时区配置
timedatectl set-timezone Asia/Shanghai
#安装时间同步工具chrony
apt install chrony -y
#添加时间同步源/etc/chrony/chrony.conf
echo "server time1.aliyun.com iburst" >> /etc/chrony/chrony.conf
#启动服务
systemctl start chrony
systemctl enable chrony
#检查运行状态
chronyc sources -v
2.3、下载软件包并解压编译
#更新软件包,安装编译依赖
apt update
apt install build-essential tcl -y
#下载软件包,并编译安装
cd /opt
#redis官网:https://redis.io/,如果使用的是非x86架构CPU,可能需要自行编译
wget https://download.redis.io/releases/redis-7.4.0.tar.gz
tar -zxf redis-7.4.0.tar.gz
cd redis-7.4.0
#编译,未指定安装目录默认安装到/usr/local/bin/目录下,如果需要指定目录,需要添加参数配置
make && make install
#指定目录安装,youpath替换为安装目录,you_install_path替换为父父目录
mkdir -p /you_install_path/redis/
make && make PREFIX=/you_install_path/redis/ install
#检查安装版本
redis-server -v
Redis server v=7.4.0 sha=00000000:1 malloc=jemalloc-5.3.0 bits=64 build=5f5ca04f39aa8d40
#创建配置文件目录
mkdir /etc/redis/
cp /opt/redis-7.4.0/redis.conf /etc/redis/
2.4、主节点配置
#192.168.0.150主机
vi /etc/redis/redis.conf
#修改以下配置,允许Redis监听所有网络接口,以便从节点能够连接。
bind 127.0.0.1 -::1
#修改为
bind 0.0.0.0
#修改以下配置,关闭保护模式
protected-mode yes
#修改为
protected-mode no
#密码配置,建议加上,去掉requirepass配置前的#
requirepass your_master_password
#持久化配置(可选)
appendonly yes
save 900 1
2.5、从节点配置
#192.168.0.151、192.168.0.152主机
vi /etc/redis/redis.conf
#配置主节点IP:port,添加以下配置
#从节点同步主节点配置
slaveof 192.168.0.150 6379
#密码配置
masterauth 123456
#修改以下配置,允许Redis监听所有网络接口,以便从节点能够连接。
bind 127.0.0.1 -::1
#修改为
bind 0.0.0.0
#修改以下配置,关闭保护模式
protected-mode yes
#修改为
protected-mode no
#密码配置,建议加上,去掉requirepass配置前的#
requirepass your_master_password
#持久化配置(可选)
appendonly yes
save 900 1
2.6、测试
服务启动
#主节点启动
/usr/local/bin/redis-server /etc/redis/redis.conf
#从节点启动
/usr/local/bin/redis-server /etc/redis/redis.conf
执行info replication,检查redis-master主节点
#主节点检查
root@orangepi5:~# redis-cli -h192.168.0.150 -p6379
Unrecognized option or bad number of args for: '-h192.168.0.150'
root@orangepi5:~# redis-cli -h 192.168.0.150 -p 6379
192.168.0.150:6379> auth 123456
OK
192.168.0.150:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.151,port=6379,state=online,offset=210,lag=0
slave1:ip=192.168.0.152,port=6379,state=online,offset=210,lag=1
master_failover_state:no-failover
master_replid:7576868da40100fff107e4bc80fa83a4b83b689a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210
执行info replication检查从节点redis-node1,redis-node2检查同理
root@orangepi5:~# redis-cli -h 192.168.0.151 -p 6379
?
192.168.0.151:6379> info replication
# Replication
role:slave
master_host:192.168.0.150
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:336
slave_repl_offset:336
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:7576868da40100fff107e4bc80fa83a4b83b689a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:336
192.168.0.151:6379>
数据同步测试
#redis-master节点
root@orangepi5:~# redis-cli -h 192.168.0.150 -p 6379
192.168.0.150:6379> auth 123456
OK
192.168.0.150:6379> set test 123
OK
192.168.0.150:6379> get test
"123"
#redis-node1节点
root@orangepi5:~# redis-cli -h 192.168.0.151 -p 6379
192.168.0.151:6379> get test
"123"
#redis-node2节点
root@orangepi5:~# redis-cli -h 192.168.0.152 -p 6379
192.168.0.152:6379> get test
"123"