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.target

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

这是 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