主从复制实现Redis集群实验 (一主二从):
实验环境: 使用Docker 搭建 Redis 版本 5.0.5
打开一个终端窗口,在其中运行如下命令创建一个名为redis-master的Redis容器。注意,它的端口是6379 (本地的端口:映射到容器的端口)
docker run -itd--name redis-master -p 6379:6379 redis:5.0.5(冒号后可跟特定的版本号;不写的话, 默认latest,即最新的版本)
新开一个命令窗口,在其中运行如下命令创建一个名为redis·slave1的容器。注意,它的端口是6380。这里是在一台电脑端口号来区别一台主Redis容器和另外两台从Redis容器。在真实项目里,多台Redis会部署在不同的服务器上 可以通过命令来创建从服务器
docker run -itd --name redis-slave1 -p 6380:6380 redis:5.0.5
docker run -itd --name redis-slave2 -p 6381:6381 redis:5.0.5
查看redis-master容器的ip地址, 这里是172.17.0.2
docker inspect my_redis | grep IPAddress
在真实项目里,Redis服务器所在的IP地址是固定的 而容器启动的Redis服务器的IP地址是动态的,所以这里用上述命令来获取IP地址 在redis-master容器的命令窗口里,分别运行命令,进入命令行窗口
docker exec -it 容器id可以(头几个字母就行), names也可以(能唯一标识容器即可) /bin/bash
exit # 这个命令用于退出容器
可以使用redis-cli命令进入Redis的客户端命令行
redis-cli
因为还没有配置, 所以 显示的从节点连接数为0。
然后从服务器中, 可以到由于此时还没有通过命令行设置主从模式,因此输出结果里依然能看到当前服务器是“主服务器”,同时没有携带从服务器。在redis-slave1容器的命令窗口里运行如下的命令,指定当前Redis服务器为从服务器。该命令的格式是slaveof IP地址端口号
在从节点上执行下述指令, 使得与主节点建立关系
slaveof 172.17.0.2 6379
主从服务器建立关系
操作后, 主节点的状态
从节点的状态
主从复制模式能达到的效果: 主节点写东西, 从节点能够读取到数据
在项目里除了可以用slaveof命令搭建主从模式的集群外,还可以用配置参数的方式来搭建,具体的步骤如下: 搭建主服务器的命令不变,并且还是用6379端口
docker run -itd my_redis -p 6379:6379 redis:5.0.5
// 配置从节点的配置文件 如: cd /usr/server vim redisSlave1.conf
port 6380
slaveof 172.12.0.2 6379
修改完配置文件后, 启动容器时需要进行映射 (本地:容器里), 并在启动后读指定的配置文件 (docker logs 容器id -> 能看到报错信息)
docker run -itd --name redis-slave1 -v /usr/server/redisSlave1.conf:/redisConfig/
redisSlave1.conf -p 6380:6380 redis:5.0.5 redis-server /redisConfig/redisSlave1.conf
因为修改了端口 (配置文件中已修改), 所以从节点在启动 redis-cli的时候需要指定端口号
redis-cli -h 127.0.0.1 -p 6380
默认从节点只能读, 不能写
可以在配置文件中增加一行, 从而使得从节点可读可写
slave-read-only no # 指定该服务器可读可写
还有一些配置 能控制主从节点复制的操作
// 主节点的配置
min-slaves-to-write 2
min-slaves-max-1ag 15
第1行的参数表示实现主从复制的从服务器个数最少是2台,第2行的参数表示如果由第1行参数指定的从服务器个数(这里是2台)的心跳延迟时间(lag值)大于15秒,就不执行主从复制。
这两个条件是“或者”的关系,即只要出现从服务器个数小于2,或者2台从服务器的心跳延迟时间大于15秒,主服务器即停止主从复制的操作 (控制主从复制)