Redis 6.0 部署指南(Ubuntu)
一、前期准备
1.1 环境要求
- 操作系统:Ubuntu 18.04 LTS / 20.04 LTS(64位)
- GCC版本:5.3+(Ubuntu 18.04默认7.5,20.04默认9.3,均满足要求)
- 依赖工具:
build-essential
、tcl
、wget
、curl
1.2 依赖安装
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install -y build-essential tcl wget curl
1.3 Redis安装(两种方式)
方式一:通过官方PPA安装(推荐)
# 添加Redis官方GPG密钥
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
# 添加PPA源
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
# 安装Redis 6.x
sudo apt update && sudo apt install -y redis-server
# 验证版本
redis-server --version # 应显示6.x.x
方式二:源码编译安装
# 下载源码
wget http://download.redis.io/releases/redis-6.0.16.tar.gz
tar xzf redis-6.0.16.tar.gz
cd redis-6.0.16
# 编译(若失败尝试make MALLOC=libc)
make && make test && sudo make install
# 创建配置目录
sudo mkdir -p /etc/redis /var/lib/redis
sudo cp redis.conf /etc/redis/
1.4 系统优化
# 调整内核参数
sudo sysctl -w vm.overcommit_memory=1
sudo sysctl -w net.core.somaxconn=1024
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
echo "net.core.somaxconn=1024" | sudo tee -a /etc/sysctl.conf
# 调整文件描述符限制
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf
1.5 防火墙配置
# 开放Redis端口(主从/集群)
sudo ufw allow 6379/tcp # Redis服务端口
sudo ufw allow 26379/tcp # 哨兵端口
sudo ufw allow 16379/tcp # 集群总线端口(6379+10000)
sudo ufw reload
二、主从部署
2.1 配置主节点(master)
# 编辑配置文件
sudo vim /etc/redis/redis.conf
# 修改以下参数
bind 0.0.0.0 # 允许所有IP访问
protected-mode no # 关闭保护模式
port 6379 # 端口
daemonize yes # 后台运行
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis # 数据目录
requirepass your_password # 设置密码(可选)
masterauth your_password # 从节点认证密码(与requirepass一致)
2.2 配置从节点(slave)
# 复制配置文件
sudo cp /etc/redis/redis.conf /etc/redis/redis_6380.conf
# 编辑从节点配置
sudo vim /etc/redis/redis_6380.conf
# 修改以下参数
port 6380
pidfile /var/run/redis_6380.pid
logfile /var/log/redis/redis_6380.log
replicaof 192.168.1.100 6379 # 主节点IP:端口
2.3 启动服务
# 启动主节点
sudo redis-server /etc/redis/redis.conf
# 启动从节点
sudo redis-server /etc/redis/redis_6380.conf
# 设置开机自启(systemd)
sudo tee /etc/systemd/system/redis-master.service <<EOF
[Unit]
Description=Redis Master
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
Restart=always
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable redis-master
2.4 验证主从复制
# 主节点状态
redis-cli -h 192.168.1.100 -p 6379 -a your_password info replication
# 应显示 role:master, connected_slaves:1
# 从节点状态
redis-cli -h 192.168.1.101 -p 6380 -a your_password info replication
# 应显示 role:slave, master_host:192.168.1.100
# 数据同步测试
redis-cli -h 192.168.1.100 -p 6379 -a your_password set test_key "hello world"
redis-cli -h a192.168.1.101 -p 6380 -a your_password get test_key # 应返回"hello world"
2.5 手动主从切换
# 停止主节点
redis-cli -h 192.168.1.100 -p 6379 -a your_password shutdown
# 从节点提升为主节点
redis-cli -h 192.168.1.101 -p 6380 -a your_password replicaof no one
# 验证新主节点
redis-cli -h 192.168.1.101 -p 6380 -a your_password info replication # role:master
三、哨兵部署(Sentinel)
3.1 配置哨兵(至少3个实例)
# 创建哨兵配置文件(示例为26379端口)
sudo tee /etc/redis/sentinel_26379.conf <<EOF
port 26379
daemonize yes
pidfile /var/run/redis-sentinel_26379.pid
logfile /var/log/redis/sentinel_26379.log
dir /tmp
sentinel monitor mymaster 192.168.1.100 63792 # quorum=2(至少2个哨兵同意故障)
sentinel auth-pass mymaster your_password # 主节点密码
sentinel down-after-milliseconds mymaster 5000 # SDOWN判定时间(5秒)sentinel parallel-syncs mymaster1 # 故障转移时并行同步的从节点数
sentinel failover-timeout mymaster 15000 # 故障转移超时时间(15秒)
EOF
# 复制配置文件并修改端口(26380、26381)
sudo cp /etc/redis/sentinel_26379.conf /etc/redis/sentinel_26380.conf
sudo sed -i 's/26379/26380/g' /etc/redis/sentinel_26380.conf
sudo cp /etc/redis/sentinel_26379.conf /etc/redis/sentinel_26381.confsudo sed -i 's/26379/26381/g' /etc/redis/sentinel_26381.conf
3.2启动哨兵
# 启动3个哨兵实例
sudo redis-sentinel /etc/redis/sentinel_26379.conf
sudo redis-sentinel /etc/redis/sentinel_26380.conf
sudo redis-sentinel /etc/redis/sentinel_26381.conf# 验证哨兵状态
redis-cli -p 26379 info sentinel
# 应显示 sentinel_masters:1, sentinel_tilt:0
3.3 自动故障转移测试
# 1. 查看当前主节点
redis-cli -p 26379 sentinel masters | grep "name m"
# 2. 停止主节点
redis-cli -h 192.168.1.100 -p6379 -a your_password shutdown
# 3. 观察哨兵日志
tail -f /var/log/redis/sentinel_26379.log
# 应出现 "+switch-master mymaster 192.168.1.100 6379 192.168.1.1016380"
# 4. 验证新主节点
redis-cli -p 26379 sentinel masters | grep addr # 地址变为从节点IP:端口
##四、分布式集群部署(Redis Cluster)###4.1 节点规划(6节点:3主3从)| 节点角色 | IP |端口 | 数据目录 |
|----------|----------|------|----------------|主节点1 |192.168.1.100 |7000 | /var/lib/redis/7000 |
| 主节点2 |192.168.1.101 |7001 | /var/lib/redis/7001 |
| 主节点3 |192.168.1.102 |7002 | /var/lib/redis/7002 |
| 从节点1 |192.168.1.100 |7003 | /var/lib/redis/7003 |
| 从节点2 |192.168.1.101 |7004 | /var/lib/redis/7004 |
|从节点3 |192.168.1.102 |7005 | /var/lib/redis/7005 |
###4.2 配置集群节点
# 创建配置脚本(以7000端口为例)
for port in $(seq7000 7005); do
sudo mkdir -p /var/lib/redis/$port
sudo tee /etc/redis/redis_$port.conf <<EOF
port $port
cluster-enabled yescluster-config-file nodes_$port.conf
cluster-node-timeout5000
daemonize yes
pidfile /var/run/redis_$port.pidlogfile /var/log/redis/redis_$port.log
dir /var/lib/redis/$port
bind 0.0.0.0protected-mode no
requirepass your_password
masterauth your_passwordEOF
done
###4.3 启动所有节点
sudo redis-server /etc/redis/redis_$port.confdone# 验证进程
ps aux | grep redis-server | grep -v grep #应显示6个进程
###4.4 创建集群```bash
Redis 6.x需使用redis-cli创建集群
redis-cli --cluster create
192.168.1.100:7000192.168.1.101:7001
192.168.1.102:7002 \192.168.1.100:7003 \192.168.1.101:7004
192.168.1.102:7005 --cluster-replicas1
-a your_password# 确认分配方案时输入 yes
###4.5 添加从节点(可选)
```bash
# 获取主节点ID
redis-cli -c -h192.168.1.100 -p7000 -a your_password cluster nodes | grep master
# 添加新从节点(示例:将7006添加为7000的从节点)
redis-cli --cluster add-node \--cluster-slave \--cluster-master-id <master-node-id> \192.168.1.100:7006 \192.168.1.100:7000 \
-a your_password
###4.6 验证集群状态
# 集群信息
redis-cli -c -h192.168.1.100 -p7000 -a your_password cluster info
# 应显示 cluster_state:ok# 节点状态
redis-cli -c -h192.168.1.100 -p7000 -a your_password cluster nodes
# 哈希槽分布
redis-cli -c -h192.168.1.100 -p7000 -a your_password cluster slots
# 数据测试
redis-cli -c -h192.168.1.100 -p7000 -a your_password set test_key "cluster"
redis-cli -c -h192.168.1.101 -p7001 -a your_password get test_key # 自动路由到对应节点
###4.7 故障转移测试
# 1. 停止一个主节点(如7000)
redis-cli -h192.168.1.100 -p7000 -a your_password shutdown
# 2. 观察从节点是否自动提升
redis-cli -c -h192.168.1.100 -p7003 -a your_password cluster nodes | grep master
# 7003应变为master
# 3. 重启原主节点(自动变为从节点)
sudo redis-server /etc/redis/redis_7000.conf
redis-cli -c -h192.168.1.100 -p7000 -a your_password cluster nodes | grep slave
五、常见问题解决
1.** 编译错误 :若make
失败,尝试make MALLOC=libc
或升级GCC。
2. 主从同步失败 :检查masterauth
是否一致,网络是否互通。
3. 哨兵无法自动切换**:确保quorum
值小于哨兵数量的一半+1,日志中查看+odown
状态。
4.** 集群槽位未分配 **:使用redis-cli --cluster reshard
重新分配槽位。