Redis单机主从

默认读写分离

当主服务器数据发生改变时,将数据发送给从服务器同步数据;

第一次同步数据时,发送当前数据快照;

之后的同步,当数据改变时,将指令发送给从;

单机主从操作注意事项

这里使用单机多实例方式部署Redis集群,生产环境使用多台服务器分别部署。

“单机多实例” 是指在一台物理服务器(或虚拟机)上同时运行同一个软件的多个独立副本(即 “实例”)的部署方式。这种方式在软件开发、测试、服务部署等场景中较为常见,其核心是通过隔离资源和配置,让多个实例在同一台机器上并行工作,同时避免相互干扰。

“单机多实例” 需要注意:服务端口号不能相同、配置文件、PID文件、数据文件路径(或名称)不同一样,否则服务无法正常启动。

复制文件redis.conf

 # 切换目录
 cd /usr/local/redis/etc
 ​
 # 复制配置文件
 cp redis.conf redis-7000.conf
 cp redis.conf redis-7001.conf
 cp redis.conf redis-7002.conf

创建所有数据目录

 # 切换目录
 cd /usr/local/redis
 ​
 # 创建数据目录
 mkdir -p /usr/local/redis/data/redis_7000
 mkdir -p /usr/local/redis/data/redis_7001
 mkdir -p /usr/local/redis/data/redis_7002
 ​
 # 确认目录是否存在
 ls -la /usr/local/redis/data/
 ls -la /usr/local/redis/logs/

配置主机

以redis-7000为主机

 # 切换目录
 cd /usr/local/redis/etc
 ​
 # 配置文件
 vim redis-7000.conf
 ​
 # 配置修改部分如下
 bind 127.0.0.1                          # 将bind注释掉 或 bind 0.0.0.0
 port 7000                               # 改变其服务端口
 daemonize yes                           # 修改服务为后台运行
 pidfile /var/run/redis_7000.pid         # 指定不同的pid文件,注意三份配置文件不同。
 logfile "/usr/local/redis/logs/redis_7000.log"      # 指定log日志路径,自己配,要求不同。
 dir /usr/local/redis/data/redis_7000    # 这个指定rdb文件和aof文件的路径配置,要求改成不同。
 ​
 ​
 # 如需设置密码可添加(测试环境可不添加)
 masterauth 123456                       # 都配上吧,从服务到主服务的认证密码。
 requirepass 123456                      # 三份文件都配置,客户端访问需要密码验证。
 ​
 # 主服务如果存在就注释(这个配置需要在从服务器设置)
 replicaof 127.0.0.1 7000

2.3、配置从机

以redis-7001,redis-7002为从机

 # 切换目录
 cd /usr/local/redis/etc
 ​
 # 配置文件
 vim redis-7001.conf
 ​
 # 配置修改部分如下
 bind 127.0.0.1                          # 将bind注释掉 或 bind 0.0.0.0
 port 7001                               # 改变其服务端口
 daemonize yes                           # 修改服务为后台运行
 pidfile /var/run/redis_7001.pid         # 指定不同的pid文件,注意三份配置文件不同。
 logfile "/usr/local/redis/logs/redis_7001.log"      # 指定log日志路径,自己配,要求不同。
 dir /usr/local/redis/data/redis_7001    # 这个指定rdb文件和aof文件的路径配置,要求改成不同。
 replicaof 127.0.0.1 7000                #从服务配置的两台需要开启。配置主服务的ip的port。
 ​
 ​
 # 如需设置密码可添加(测试环境可不添加)
 masterauth 123456                       # 都配上吧,从服务到主服务的认证密码。
 requirepass 123456                      # 三份文件都配置,客户端访问需要密码验证。
 ​
 ----------------------------------------------------------------
 ​
 # 切换目录
 cd /usr/local/redis/etc
 ​
 # 配置文件
 vim redis-7002.conf
 ​
 # 配置修改部分如下
 bind 127.0.0.1                          # 将bind注释掉 或 bind 0.0.0.0
 port 7002                               # 改变其服务端口
 daemonize yes                           # 修改服务为后台运行
 pidfile /var/run/redis_7002.pid         # 指定不同的pid文件,注意三份配置文件不同。
 logfile "/usr/local/redis/logs/redis_7002.log"      # 指定log日志路径,自己配,要求不同。
 dir /usr/local/redis/data/redis_7002    # 这个指定rdb文件和aof文件的路径配置,要求改成不同。
 replicaof 127.0.0.1 7000                # 从服务配置的两台需要开启。配置主服务的ip的port。
 ​
 ​
 # 如需设置密码可添加(测试环境可不添加)
 masterauth 123456                       # 都配上吧,从服务到主服务的认证密码。
 requirepass 123456                      # 三份文件都配置,客户端访问需要密码验证。
 ​
 # 注意:
 如果主从节点都在同一台机器上,IP地址必须使用 127.0.0.1 或者 机器的真实内网IP(例如 192.168.x.x)。

配置模板常用参数介绍

 # ==================== 需要修改的配置 ====================
 ​
 # 【修改说明】绑定IP:127.0.0.1只允许本地,0.0.0.0允许所有,或指定具体IP
 bind 【本机IP地址,如:127.0.0.1 或 0.0.0.0 或 192.168.7.60】
 ​
 # 【修改说明】保护模式:yes开启(需配合bind或密码),no关闭
 protected-mode 【yes 或 no】
 ​
 # 【修改说明】服务端口,同一台机器多实例必须不同
 port 【端口号,如:6379、7000、7001】
 ​
 tcp-backlog 511
 timeout 0
 tcp-keepalive 300
 daemonize yes
 ​
 # 【修改说明】PID文件路径,每个实例必须不同
 pidfile /var/run/redis_【端口号】.pid
 ​
 loglevel notice
 ​
 # 【修改说明】日志文件路径,每个实例必须不同
 logfile "/usr/local/redis/logs/redis_【端口号】.log"
 ​
 databases 16
 always-show-logo no
 set-proc-title yes
 proc-title-template "{title} {listen-addr} {server-mode}"
 stop-writes-on-bgsave-error yes
 rdbcompression yes
 rdbchecksum yes
 dbfilename dump.rdb
 rdb-del-sync-files no
 ​
 # 【修改说明】数据存储目录,每个实例必须不同,建议绝对路径
 dir /usr/local/redis/data/redis_【端口号】
 ​
 replica-serve-stale-data yes
 replica-read-only yes
 repl-diskless-sync no
 repl-diskless-sync-delay 5
 repl-diskless-load disabled
 repl-disable-tcp-nodelay no
 replica-priority 100
 acllog-max-len 128
 lazyfree-lazy-eviction no
 lazyfree-lazy-expire no
 lazyfree-lazy-server-del no
 replica-lazy-flush no
 lazyfree-lazy-user-del no
 lazyfree-lazy-user-flush no
 oom-score-adj no
 oom-score-adj-values 0 200 800
 disable-thp yes
 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
 jemalloc-bg-thread yes
 ​
 # 【修改说明】客户端连接密码,主从节点保持一致,不设密码则注释掉
 requirepass 【密码,如:123456】
 ​
 # 【修改说明】从节点连接主节点的认证密码,必须与主节点requirepass一致
 # 主节点:注释掉或删除此行
 # 从节点:取消注释并填写密码
 masterauth 【密码,如:123456】
 ​
 # ==================== 主从复制专属配置(仅从节点需要) ====================
 ​
 # 【修改说明】主从复制:只有从节点需要配置,格式:replicaof 主IP 主端口
 # 主节点:整行注释掉或删除
 # 从节点:取消注释并填写主节点IP和端口
 replicaof 【主节点IP】 【主节点端口】

启动服务

开启服务(已设置环境变量操作)

 # 启动服务
 redis-server /usr/local/redis/etc/redis-7000.conf
 redis-server /usr/local/redis/etc/redis-7001.conf
 redis-server /usr/local/redis/etc/redis-7002.conf

查看服务是否启动

 # 查看服务器状态
 [root@Redis-1 redis]# ps -ef|grep redis
 root        3518       1  0 09:40 ?        00:00:00 ./bin/redis-server *:7000
 root        3524       1  0 09:40 ?        00:00:00 ./bin/redis-server *:7001
 root        3535       1  0 09:40 ?        00:00:00 ./bin/redis-server *:7002
 root        3558    1954  0 09:42 pts/0    00:00:00 grep --color=auto redis

开启三个客户端(已设置环境变量操作)

 # 开启三个客户端
 redis-cli -h 127.0.0.1 -p 7000 
 redis-cli -h 127.0.0.1 -p 7001 
 redis-cli -h 127.0.0.1 -p 7002 
 ​
 # 如果设置密码需要添加 -a 密码
 redis-cli -h 127.0.0.1 -p 7000 -a 123456
 ​
 # 或进入客户端后在验证密码
 redis-cli -h 127.0.0.1 -p 7000
 127.0.0.1:7000> AUTH 123456

查看主从信息info replication(确认连接)

 # 查看7000的主从信息
 # 执行指令info replication
 127.0.0.1:7000> info replication
 # Replication
 role:master
 connected_slaves:2
 slave0:ip=127.0.0.1,port=7001,state=online,offset=672,lag=0
 slave1:ip=127.0.0.1,port=7002,state=online,offset=672,lag=0
 master_failover_state:no-failover
 master_replid:060f15adcfd56ad4f33bb12a49cf749418bfee03
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:672
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:672
 ​
 # 查看7001的主从信息
 # 执行指令info replication
 127.0.0.1:7001> info replication
 # Replication
 role:slave
 master_host:127.0.0.1
 master_port:7000
 master_link_status:up
 master_last_io_seconds_ago:5
 master_sync_in_progress:0
 slave_read_repl_offset:756
 slave_repl_offset:756
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:060f15adcfd56ad4f33bb12a49cf749418bfee03
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:756
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:756
 ​
 # 查看7002的主从信息
 # 执行指令info replication
 127.0.0.1:7002> info replication
 # Replication
 role:slave
 master_host:127.0.0.1
 master_port:7000
 master_link_status:up
 master_last_io_seconds_ago:8
 master_sync_in_progress:0
 slave_read_repl_offset:882
 slave_repl_offset:882
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:060f15adcfd56ad4f33bb12a49cf749418bfee03
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:882
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:882

测试读写分离

主机写入信息

 # 登录客户端
 redis-cli -h 127.0.0.1 -p 7000
 ​
 # 写入数据
 # 执行指令set str helloworld
 127.0.0.1:7000> set str helloworld
 OK

从机查看信息

 # 登录客户端
 ./bin/redis-cli -h 127.0.0.1 -p 7001
 ./bin/redis-cli -h 127.0.0.1 -p 7002
 ​
 # 查看数据
 # 执行指令get str
 127.0.0.1:7001> get str
 "helloworld"
 ​
 # 执行指令set h 123
 127.0.0.1:7001> set h 123
 (error) READONLY You can't write against a read only replica.
 # 注:报错原因从节点是只读的,不能执行写操作

设置开机自启

创建 service 文件

Redis无密码配置

# 创建Redis 7000服务
vim /etc/systemd/system/redis_7000.service

# 添加内容
[Unit]
Description=Redis 7000 - Single Master
After=network.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/redis_7000.pid

# 启动 Redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-7000.conf

# 启动后检查 PID 文件是否生成(最多等待 2 秒)
ExecStartPost=/bin/bash -c 'for i in {1..20}; do [ -f /var/run/redis_7000.pid ] && exit 0; sleep 0.1; done; exit 1'

# 优雅关闭 Redis(无密码)
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7000 shutdown

# 重载配置(无密码)
ExecReload=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7000 CONFIG REWRITE

# 重启策略:非正常退出时重启,等待 10 秒防止频繁重启
Restart=on-failure
RestartSec=10s

# 资源限制:防止 OOM 或 FD 耗尽
LimitNOFILE=65536
LimitNPROC=65536

# 超时控制:避免卡死时无限等待
TimeoutStartSec=10s
TimeoutStopSec=30s

[Install]
WantedBy=multi-user.target

Redis有密码配置

 # 创建Redis 7000服务
vim /etc/systemd/system/redis_7000.service

# 添加内容
[Unit]
Description=Redis 7000 - Single Master
After=network.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/redis_7000.pid

# 启动 Redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-7000.conf

# 启动后检查 PID 文件是否生成(最多等待 2 秒)
ExecStartPost=/bin/bash -c 'for i in {1..20}; do [ -f /var/run/redis_7000.pid ] && exit 0; sleep 0.1; done; exit 1'

# 优雅关闭 Redis(带密码认证)
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7000 -a 123456 shutdown

# 重载配置(使用 CONFIG REWRITE,而非 kill -HUP)
ExecReload=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7000 -a 123456 CONFIG REWRITE

# 重启策略:非正常退出时重启,等待 10 秒防止频繁重启
Restart=on-failure
RestartSec=10s

# 资源限制:防止 OOM 或 FD 耗尽
LimitNOFILE=65536
LimitNPROC=65536

# 安全加固
PrivateTmp=true
ProtectSystem=full
ReadWritePaths=/var/lib/redis /var/log/redis /var/run
NoNewPrivileges=true

# 超时控制:避免卡死时无限等待
TimeoutStartSec=10s
TimeoutStopSec=30s

[Install]
WantedBy=multi-user.target

需要修改的参数清单

上面的模板修改参数就可以给7001、7002使用

参数

7000 示例

7001 示例

7002 示例

说明

1. Description

Redis 7000 - Single Master

Redis 7001 - Single Master

Redis 7002 - Single Master

服务描述,便于识别

2. PIDFile

/var/run/redis_7000.pid

/var/run/redis_7001.pid

/var/run/redis_7002.pid

PID 文件路径,必须唯一

3. ExecStart

.../redis-7000.conf

.../redis-7001.conf

.../redis-7002.conf

配置文件路径

4. ExecStop

-p 7000 shutdown

-p 7001 shutdown

-p 7002 shutdown

关闭命令中的端口号

5. ExecReload

-p 7000 CONFIG REWRITE

-p 7001 CONFIG REWRITE

-p 7002 CONFIG REWRITE

重载命令中的端口号

6. 文件名

redis-7000.service

redis-7001.service

redis-7002.service

systemd 服务文件名

2. 重载 systemd 并启用服务

 # 重载systemd配置
 systemctl daemon-reload
 ​
 # 分别启用三个服务(开机自启)
 systemctl enable redis_7000.service
 systemctl enable redis_7001.service
 systemctl enable redis_7002.service
 ​
 # 启动服务
 systemctl start redis_7000.service
 systemctl start redis_7001.service
 systemctl start redis_7002.service
 ​
 # 查看服务状态
 systemctl status redis_7000.service
 systemctl status redis_7001.service
 systemctl status redis_7002.service