在实际项目里,一般不会简单地只在一台服务器上部署Redis服务器,因为单台Redis服务器不能满足高并发的压力,另外如果该服务器或Redis服务器失效,整个系统就可能崩溃。项目里一般会用主从复制的模式来提升性能,用集群模式来提升吞吐量并提升可用性
本次将使用Docker容器来模拟服务器,用启动多个Docker容器的方法来模拟
“在多个服务器上安装Redis”的效果在实际项目里,一般不会简单地只在一台服务器上部署Redis服务器,因为单台Redis服务器不能满足高并发的压力,另外如果该服务器或Redis服务器失效,整个系统就可能崩溃。项目里一般会用主从复制的模式来提升性能,用集群模式来提升吞吐量并提升可用性
本次将使用Docker容器来模拟服务器,用启动多个Docker容器的方法来模拟
“在多个服务器上安装Redis”的效果在实际项目里,一般不会简单地只在一台服务器上部署Redis服务器,因为单台Redis服务器不能满足高并发的压力,另外如果该服务器或Redis服务器失效,整个系统就可能崩溃。项目里一般会用主从复制的模式来提升性能,用集群模式来提升吞吐量并提升可用性
本次将使用Docker容器来模拟服务器,用启动多个Docker容器的方法来模拟
“在多个服务器上安装Redis”的效果
在主从复制模式的集群里,主节点一般是一个,从节点一般是两个或多个,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统就能切换到从节点去读写数据,提升系统的可用性。
再采用主从复制模式里默认的读写分离机制,就能提升系统的缓存读写性能。在实际应用中,如果有相应的设置,在向一台Redis服务器里写数据后,这个数据可以复制到另外一台(或多台) Redis服务器,这里数据源服务器叫主服务器(Master Server),复制数据目的地所在的服务器叫从服务器(Slave Server) 。
可以把写操作集中到主服务器上,把读操作集中到从服务器上,以提升读写性能
由于出现了数据备份,因此能提升数据的安全性,比如当主Redis服务器失效后,能很快切换到从服务器上读数据。
这里将用Docker容器来搭建一主二从模式的集群,在配置主从关系时,需要在从节点上使用slaveof命 令,具体的步骤如下。
打开一个命令窗口,在其中运行如下命令创建一个名为redis-master的Redis容器。注意,它的端口是 6379。
docker run -itd --name redis-master -p 6379:6379 redis:6.2.13
新开一个命令窗口,在其中运行如下命令创建一个名为redis-slave1的容器。注意,它的端口是6380。 这里是在一台电脑上运行,所以用端口号来区别一台主Redis容器和另外两台从Redis容器。在真实项目 里,多台Redis会部署在不同的服务器上,所以可以都用6379端口。
- docker run -itd --name redis-slave1 -p 6380:6380 redis:6.2.13
- docker run -itd --name redis-slave2 -p 6381:6381 redis:6.2.13
回到包含redis-master容器的命令窗口,在其中运行docker inspect redis-master命令,查看redis master容器的信息
在其中能通过IPAddress项看到该容器的IP地址,这里是172.17.0.2。在真实项目里,Redis服务器所在 的IP地址是固定的,而通过Docker容器启动的Redis服务器的IP地址是动态的,所以这里要用上述命令来 获取IP地址。
docker inspect redis-master | grep IPAddress
- docker exec -it redis-master /bin/bash
- info replication
通过info replication命令查看当前的主从模式状态,能看到如下所示的部分结果。
role:master表示当前redis-master容器在主从模式里的角色是“主服务器”。 connected_slaves表示当前该主服务器没有携带从服务器。
再到redis-slave1容器的命令窗口里,通过docker exec -it redis-slave1/bin/bash命令进入容器的命令行 窗口
docker exec -it redis-slave1 /bin/bash
由于此时还没有通过命令行设置主从模式,因此输出结果里依然能看到当前服务器是“主服务器”,同时 没有携带从服务器。 在redis-slave1容器的命令窗口里运行如下的slaveof命令,指定当前Redis服务器为从服务器。该命令的 格式是slaveof IP地址端口号,这里是指向172.17.0.2:6379所在的主服务器。
slaveof 172.17.0.2 6379
主节点
至此,配置完成一主二从模式的主从模式。 注:现在没有配置文件的情况下,从redis的默认端口仍然是6379,即使我们对端口做了映射,因此我们需要使用指定配置文件的方式,创建redis集群
到redis-master容器所在的命令行窗口运行set name renge后,再到两台从服务器里运行get name命 令,就能看到返回值。 这说明主从模式配置成功,主服务器里的数据会自动同步到各从服务器上。
在项目里除了可以用slaveof命令搭建主从模式的集群外,还可以用配置参数的方式来搭建,具体的步骤 如下。
搭建主服务器redis-master的命令不变,并且还是用6379端口。 用
docker run -itd --name redis-master -p 6379:6379 redis:6.2.13
docker inspect redis-master命令确认该Redis服务器所在容器的IP地址依然是172.17.0.2。 在/opt/server下编写配置文件redisSlave1.conf,并在其中编写如下内容。
port 6380
slaveof 172.17.0.2 6379
通过第1行的命令设置该Redis的端口为6380,通过第2行的slaveof配置把该Redis服务器设置成“从模 式”,并连接到redis-master所在的主服务器上。 在新的命令窗口里运行如下的命令,创建名为redis-slave1的Redis服务器。该服务器的工作端口是 6380,并且用redis-server后的参数指定在启动Redis服务器时加载redisSlave1.conf配置文件。
docker run -itd --name redis-slave1 -v /opt/redisSlave1.conf:/redisConfig/redisSlave1.conf -p 6380:6380 redis:6.2.13 redis-server /redisConfig/redisSlave1.conf
随后通过docker exec -it redis-slave1 /bin/bash命令进入到该容器的命令行
docker exec -it redis-slave1 /bin/bash
由于Redis工作端口已经变成6380(配置文件中指定了端口),所以需要通过redis-cli -h 127.0.0.1 -p 6380命令进入Redis客户端。在其中运行info replication命令 以同样的方式创建redis-slave2,将端口绑定到6381即可
在上文里配置的redis-slave1和redis-slave2这两台从服务器里运行info replication命令,还能看到
“slave_read_only:1”这项配置,说明从服务器默认是“只读”的。
到redis-slave1的Redis客户端命令行里输入set val 1,就会看到如下面第2行所示的错误,从而能进一步
验证该Redis服务器的“只读”属性。
对于Redis从服务器而言,建议采用默认的“只读”配置,因为在项目里一般不会向作为数据同步目的地的
“从服务器”上写数据。如果业务上确实需要,可以通过如下步骤设置“可读可写”的效果。
在上文提到的redisSlave2.conf配置文件里再加入一行“slave-read-only no”的配置,指定该服务器可读可写。
在Redis主从复制模式里,如果主从服务器之间有数据同步的情况,那么从服务器会默认以一秒一次的频 率向主服务器发送REPLCONF ACK命令,依次来确保两者间连接通畅。这种定时交互命令确保连接的机 制就叫“心跳”机制。 在上文开启的redis-master这个主服务器的命令行里,运行info replication命令,就能看到它从属服务 器的“心跳”状况。 通过lag表示该从属服务器发送REPLCONF ACK命令的时间,这里均是1秒,表示两台从服务器和主服务 器的连接均属通畅。 这里大家可以想象一下,如果从服务器宕机,那么主从复制就没有意义了。对此,可以通过如下的步骤 来关联心跳机制和主动复制的动作。 在/usr/server下新建redisMaster.conf文件,在其中编写如下的代码。
min-slaves-to-write 2
min-slaves-max-lag 15