redis主从配置
环境说明
系统 | 角色ip | 应用 |
---|---|---|
centos7/redhat7 | 主master:192.168.100.100 | redis |
centos7/redhat7 | 从slave:192.168.100.99 | redis |
首先两台主机都需要部署安装redis,这里就不演示安装了,安装请看上一遍文章redis安装
1. 为什么需要主从复制
从以下三点说明:
-
redis单机一旦故障,可用通过从服务器上进行恢复数据;
-
redis要达到高可用、高并发,只有单个redis是不够的,单个redis也就只能支持几万的QPS,所以必须以集群的形式提供服务,而集群中又以多个主从组成。
-
主从是以多个redis集合在一起,以一个master多个slave为模式对外提供服务,master主要以写为主,slave提供读,即是读写分离的情况,以读多写少为准。比如电商网站中的商品,读的多,写的少
2. 主从复制原理
- 从服务器向主服务器发送SYNC命令
- 主服务器收到SYNC命令后,执行BGSAVE命令,在后台生成RDB文件,使用缓冲区记录从现在开始执行的所有的写命令。
- 当主服务器的BGSAVE命令执行完毕后,将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
- 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
3. 安装后配置
# 编辑配置文件,修改或添加参数值:
[root@100 ~]# vim /usr/local/etc/redis/redis.conf
# 如需要在后台运行,把该项的值改为yes
daemonize yes
# 从主机同样的操作修改
4. 主节点配置
[root@100 ~]# vim /usr/local/etc/redis/redis.conf
daemonize yes
port 6379
logfile 6379.log
dir ./
requirepass 123456
masterauth 123456
bind 192.168.100.100 127.0.0.1
5. 从节点配置
# 添加主节点的IP和端口号,使其成为master的从机
[root@99 ~]# vim /usr/local/etc/redis/redis.conf
port 6379
daemonize yes
logfile 6379.log
dir ./
requirepass 123456
slaveof 192.168.100.100 6379
masterauth 123456
bind 192.168.100.99 127.0.0.1
6. 启动服务
# 先启动主redis服务,再启动从redis服务
# 切换到redis安装目录
[root@100 ~]# cd /usr/local/bin/
[root@100 bin]# redis-server ../etc/redis/redis.conf
5110:C 06 Sep 21:02:00.109 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5110:C 06 Sep 21:02:00.109 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=5110, just started
5110:C 06 Sep 21:02:00.109 # Configuration loaded
[root@100 bin]# ps -ef |grep redis
root 5111 1 0 21:01 ? 00:00:00 redis-server 192.168.100.100:6379
root 5116 5035 0 21:02 pts/1 00:00:00 grep --color=auto redis
# 启动从服务
[root@99 ~]# cd /usr/local/bin/
[root@99 bin]# ./redis-server ../etc/redis/redis.conf
6467:C 06 Sep 20:55:14.956 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6467:C 06 Sep 20:55:14.957 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=6467, just started
6467:C 06 Sep 20:55:14.957 # Configuration loaded
[root@99 bin]# ps -ef |grep redis
root 5653 1 0 15:55 ? 00:00:18 redis-server 127.0.0.1:6379
root 6470 6451 0 20:55 pts/1 00:00:00 grep --color=auto redis
7. 验证主从同步:
#(master可写可读,slave仅可读,配置文件默认配置)
# 在主从节点同时连接redis客户端
[root@100 ~]# /usr/local/bin/redis-cli -p 6379 -a 123456
127.0.0.1:6379>
[root@99 ~]# /usr/local/bin/redis-cli -p 6379 -a 123456
127.0.0.1:6379>
# 在主节点set一个key value,并get测试
127.0.0.1:6379> set 123 789
OK
127.0.0.1:6379> get 123
"789"
127.0.0.1:6379>
# 在从节点验证,通过key 123可以获取到value为789,证明主从同步成功
127.0.0.1:6379> get 123
"789"
127.0.0.1:6379>
redis主从有一个问题就是如果redis主从复制的master服务器挂掉了,那么整体redis就崩溃了,因为master无法进行写数据,导致slave中无法更新数据,那么为了解决这个问题我们就需要有一种方案让redis宕机后可以自动进行故障转移,还好redis给我们提供一种高可用解决方案 Redis-Sentinel。