Redis多机主从

准备工作

开启三台虚拟主机Redis-1、Redis-2、Redis-3,分别安装redis;

 # 关闭主机防火墙
 systemctl status firewalld          #查看防火墙状态
 systemctl stop firewalld            #关闭防火墙
 systemctl disable firewalld         #关闭防火墙

配置主机和从机

Redis-1为主机,修改配置文件redis.conf

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

Redis-2为从机、Redis-3,为从机修改配置文件redis.conf

 # 编辑配置文件
 vim /usr/local/redis/etc/redis.conf
 ​
 # 从机配置
 bind 127.0.0.1 192.168.7.62                 # Redis-3 写(bind 127.0.0.1 192.168.7.63)
 protected-mode yes
 port 6379
 daemonize yes
 pidfile /var/run/redis_6379.pid
 logfile "/usr/local/redis/logs/redis.log"
 dir /usr/local/redis/data
 replicaof 192.168.7.61 6379     # 主节点真实IP和端口
 ​
 # 如需设置密码可添加(测试环境可不添加)
 masterauth 123456                       # 都配上吧,从服务到主服务的认证密码。
 requirepass 123456                      # 三份文件都配置,客户端访问需要密码验证。

设置开机自启

 # 编辑配置文件
vim /etc/systemd/system/redis.service

# 添加以下内容
[Unit]
Description=Redis 6379 - Production Server
After=network.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/redis_6379.pid

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

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

# 优雅关闭 Redis(假设无密码,如有密码需加 -a)
ExecStop=/usr/local/redis/bin/redis-cli shutdown

# 重载配置(将运行时配置持久化到文件)
ExecReload=/usr/local/redis/bin/redis-cli CONFIG REWRITE

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

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

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

[Install]
WantedBy=multi-user.target

设置刷新配置和启动服务

 # 重新加载 systemd
 systemctl daemon-reload
 ​
 # 停掉当前手动运行的 Redis
 pkill redis-server
 ​
 # 用 systemctl 启动
 systemctl start redis
 ​
 # 设置开机自启
 systemctl enable redis
 ​
 # 检查状态
 systemctl status redis

启动服务

分别启动三台主机的redis服务器端服务

 # 启动服务
 redis-server /usr/local/redis/etc/redis.conf
 ​
 # 查询是否成功
 ps -ef|grep redis

分别启动三台主机客户端服务

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

查看主从信息info replication

 # 执行命令查看主从信息
 info replication

信息提示

 # 主信息显示
 127.0.0.1:6379> info replication
 # Replication
 role:master
 connected_slaves:2
 slave0:ip=192.168.7.62,port=6379,state=online,offset=518,lag=0
 slave1:ip=192.168.7.63,port=6379,state=online,offset=518,lag=0
 master_failover_state:no-failover
 master_replid:d11575ecef74664b7242de53c710020c5402b471
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:518
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:518
 ​
 # 从1信息显示
 127.0.0.1:6379> info replication
 # Replication
 role:slave
 master_host:192.168.7.61
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:4
 master_sync_in_progress:0
 slave_read_repl_offset:518
 slave_repl_offset:518
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:d11575ecef74664b7242de53c710020c5402b471
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:518
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:518
 ​
 # 从2信息显示
 127.0.0.1:6379> info replication
 # Replication
 role:slave
 master_host:192.168.7.61
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:2
 master_sync_in_progress:0
 slave_read_repl_offset:518
 slave_repl_offset:518
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:d11575ecef74664b7242de53c710020c5402b471
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:518
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:518

读写分离测试

Redis-1为Master,Redis-2、Redis-3为Slave

Master为写

 127.0.0.1:6379> set str helloworld
 OK

Slave为读

 127.0.0.1:6379> get str
 "helloworld"
 127.0.0.1:6379> set ss fdfd
 (error) READONLY You can't write against a read only replica.

手动设置主从

当Redis-1虚拟机死机后,如何去手动设置我们的主从,Redis-2为主,Redis-3为从

Redis-2执行slaveof no one

执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

 127.0.0.1:6379> slaveof no one
 OK
 127.0.0.1:6379> info replication
 # Replication
 role:master
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:169110a988897f74bea06927edd2419526af24b6
 master_replid2:77997787def8422f9c759d966bd42fdabd8c28ff
 master_repl_offset:9176
 second_repl_offset:9177
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:9176

Redis-3执行slaveof host port

执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

 127.0.0.1:6379> slaveof 192.168.7.62 6379
 OK
 127.0.0.1:6379> info replication
 # Replication
 role:slave
 master_host:192.168.7.62
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:5
 master_sync_in_progress:0
 slave_read_repl_offset:9176
 slave_repl_offset:9176
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:169110a988897f74bea06927edd2419526af24b6
 master_replid2:77997787def8422f9c759d966bd42fdabd8c28ff
 master_repl_offset:9176
 second_repl_offset:9177
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:9176