Redis单机主从
默认读写分离
当主服务器数据发生改变时,将数据发送给从服务器同步数据;
第一次同步数据时,发送当前数据快照;
之后的同步,当数据改变时,将指令发送给从;
单机主从操作注意事项
这里使用单机多实例方式部署Redis集群,生产环境使用多台服务器分别部署。
“单机多实例” 是指在一台物理服务器(或虚拟机)上同时运行同一个软件的多个独立副本(即 “实例”)的部署方式。这种方式在软件开发、测试、服务部署等场景中较为常见,其核心是通过隔离资源和配置,让多个实例在同一台机器上并行工作,同时避免相互干扰。
“单机多实例” 需要注意:服务端口号不能相同、配置文件、PID文件、数据文件路径(或名称)不同一样,否则服务无法正常启动。
复制文件redis.conf
在/usr/local/redis/etc目下,将redis.conf复制成三份分别取名为:redis-7000.conf、redis-7001.conf、redis-7002.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
# 创建日志目录
mkdir -p /usr/local/redis/logs
# 确认目录已创建
ls -la /usr/local/redis/data/
ls -la /usr/local/redis/logs/配置主机
以redis-7000为主机
# 切换目录
cd /usr/local/redis/etc
# 配置文件
vim redis-7000.conf
# 配置修改部分如下
bind 0.0.0.0 # 将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 # 三份文件都配置,客户端访问需要密码验证。2.3、配置从机
以redis-7001,redis-7002为从机
# 切换目录
cd /usr/local/redis/etc
# 配置文件
vim redis-7001.conf
# 配置修改部分如下
bind 0.0.0.0 # 将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 0.0.0.0 # 将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】 【主节点端口】启动服务
开启服务
# 切换目录
cd /usr/local/redis
# 启动服务
./bin/redis-server ./etc/redis-7000.conf
./bin/redis-server ./etc/redis-7001.conf
./bin/redis-server ./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开启三个客户端
# 切换目录
cd /usr/local/redis
# 开启三个客户端
./bin/redis-cli -h 127.0.0.1 -p 7000 -a 123456
./bin/redis-cli -h 127.0.0.1 -p 7001 -a 123456
./bin/redis-cli -h 127.0.0.1 -p 7002 -a 123456
# 开启三个客户端(进入后在验证密码)
./bin/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测试读写分离
主机写入信息
# 登录客户端
./bin/redis-cli -h 127.0.0.1 -p 7000 -a 123456
# 写入数据
# 执行指令set str helloworld
127.0.0.1:7000> set str helloworld
OK从机查看信息
# 登录客户端
./bin/redis-cli -h 127.0.0.1 -p 7001 -a 123456
# 查看数据
# 执行指令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.
# 注:报错原因从节点是只读的,不能执行写操作
# 登录客户端
./bin/redis-cli -h 127.0.0.1 -p 7002 -a 123456
# 查看数据
# 执行指令get str
127.0.0.1:7002> get str
"helloworld"
# 执行指令set h 123
127.0.0.1:7002> set h 123
(error) READONLY You can't write against a read only replica.
# 注:报错原因从节点是只读的,不能执行写操作设置systemd 服务管理 开机自启
创建 service 文件
创建Redis 7000服务
# 创建Redis 7000服务
vim /etc/systemd/system/redis_7000.service [Unit]
Description=Redis 7000 - Single Master
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-7000.conf
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7000 -a 123456 shutdown
ExecReload=/bin/kill -s HUP $MAINPID
PIDFile=/var/run/redis_7000.pid
Restart=on-failure
RestartSec=10s
User=root
Group=root
PrivateTmp=true
[Install]
WantedBy=multi-user.target创建Redis 7001服务
# 创建Redis 7001服务
vim /etc/systemd/system/redis_7001.service [Unit]
Description=Redis 7001 - Slave
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-7001.conf
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7001 -a 123456 shutdown
ExecReload=/bin/kill -s HUP $MAINPID
PIDFile=/var/run/redis_7001.pid
Restart=on-failure
RestartSec=10s
User=root
Group=root
PrivateTmp=true
[Install]
WantedBy=multi-user.target创建Redis 7002服务
# 创建Redis 7002服务
vim /etc/systemd/system/redis_7002.service [Unit]
Description=Redis 7002 - Slave
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-7002.conf
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7002 -a 123456 shutdown
ExecReload=/bin/kill -s HUP $MAINPID
PIDFile=/var/run/redis_7002.pid
Restart=on-failure
RestartSec=10s
User=root
Group=root
PrivateTmp=true
[Install]
WantedBy=multi-user.target2. 重载 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这是 Redis 系统服务(systemd)配置文件的逐行注释说明:
[Unit]
# 单元描述:定义该服务的名称和用途
Description=Redis 7000 - Single Master
# 指定服务启动顺序:在网络服务启动完成后再启动本服务
After=network.target
[Service]
# 服务类型:forking 表示主进程启动后会通过 fork() 创建子进程,父进程退出
Type=forking
# 服务启动命令:使用指定的配置文件启动 Redis 服务
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-7000.conf
# 服务停止命令:通过 redis-cli 连接本地 7000 端口,使用密码 123456 执行 shutdown
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 7000 -a 123456 shutdown
# 服务重载命令:向主进程发送 HUP 信号,重新加载配置文件(不重启进程)
ExecReload=/bin/kill -s HUP $MAINPID
# PID 文件路径:用于跟踪 Redis 主进程的进程 ID
PIDFile=/var/run/redis_7000.pid
# 重启策略:仅当服务异常退出(非正常退出码)时自动重启
Restart=on-failure
# 重启延迟:失败后等待 10 秒再尝试重启
RestartSec=10s
# 运行身份:以 root 用户身份运行(生产环境建议使用专用账号)
User=root
# 运行组:以 root 组身份运行
Group=root
# 私有临时目录:为服务提供独立的 /tmp 目录,增强安全性
PrivateTmp=true
[Install]
# 安装配置:定义该服务属于 multi-user.target 运行级别,即系统多用户模式时自动启动
WantedBy=multi-user.target
原创
Redis单机主从
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法