虚拟机要提前安装docke和下载redis镜像
一、主从模式
1、什么是主从模式:
主从模式中,会将几台服务器划分成主服务器和从服务器,一般来说,从服务器的数量会多于主服务器。在主从模式中,主服务器负责写操作,从服务器负责读操作,进行读写分离,减轻单台redis服务器的访问压力,在向主服务器添加数据时,也需要向从服务器同步数据,不然会导致主从服务器的数据不一致。Redis使用了两种同步策略,分别是全量复制和增量复制。当从服务器连接主服务器时,先执行全量复制,主服务器会将RDB文件发送到从服务器上进行数据导入。之后,主服务器再发生数据变化时,需要将指令同步给从服务器,从服务器就会和主服务器执行相同的操作。
2、主从模式的实现:
(1)启动主服务器:
docker run -d --name redis6379 \
--net host \
--restart=always \
redis
-d :让容器进入后台运行模式
run:启动容器
--name:给该容器自定义名字,本次定义的名字为redis6379
--restart host:让容器直接使用宿主机的网络和端口
--restart=always:让容器随着docker一起启动,类似于开机自启动
redis:容器的名字 (未设置端口号,则使用默认的端口号)
注意:每个“ \ ”和前面字符之间要有一个空格。
(2)启动从服务器:
docker run -d --name redis6380 \
--net host \
--restart=always \
redis redis-server --port 6380 \
--slaveof 192.168.64.140 6379
redis-server:是在启动redis 的命令
--slaveof:将该服务器设置为从服务器,后面跟的IP和端口为主服务器的端口
3、结果演示:
(1)启动服务:
(2)向主服务添加数据:set b 222
(3)在从服务器读取数据,并且在从服务器上添加数据失败:
(1)命令如下:
docker exec -it redis6379 redis-cli 进入到某一个容器
info replication 查看信息
注:我们也可以借用其他工具来查看服务器的角色,例如ARDN
4、主从模式的优缺点:
优点:读写分离,减轻单台redis服务器的压力
缺点:一旦主服务器由于故障不能提供服务,从服务器也不能自动升级为主服务器,提供主服务的服务,而是需要人工手动改变主从角色,将某台从服务器升级为主服务器,其他从服务器也要更改主服务器配置。同时,还要通知应用方更新主服务器节点。
二、哨兵模式:
1、什么是哨兵模式:
由于主从模式中,主从服务器不能自动转换角色。所以,redis在2.8版本以后,提供了redis Sentinel架构,也就是哨兵模式来解决这个问题。哨兵模式是在主从模式的基础上,增加了哨兵集群,哨兵也是需要使用多个,防止单哨兵出现故障而不能监控主从服务器。哨兵集群会监视所有的主服务器和从服务器,当主服务器出现故障下线时,由哨兵对主服务器下线状态进行确认,具体需要几台哨兵确认,这个是可以设置的,我们一般是按照少数服从多数的机制,当超过一半的哨兵确认主服务器状态为下线时,才可正式确认主服务器下线,然后从从服务器中挑选某个从服务器升级为主服务器。
2、哨兵模式的实现:
(1)本次以三个哨兵为例。我们需要先准备三个哨兵的配置文件,先创建文件夹:
mkdir /opt/sentinel/
cd /opt/sentinel/
(2)创建文件夹并写入配置项:
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.140 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.140 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.140 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF<<EOF:当在文件中写入信息时,遇到EOF字符,立即保存退出。
sentinel monitor mymaster 192.168.64.140 6379 2:
6379:监视的端口
2:最后的数字2,需要两个哨兵确认才可以正式下线。
(3)启动三个哨兵服务:
docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net host \
--restart=always \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5001 \
-v /opt/sentinel/5001.conf:/sentinel.conf \
--net host \
--restart=always \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5002 \
-v /opt/sentinel/5002.conf:/sentinel.conf \
--net host \
--restart=always \
redis redis-sentinel /sentinel.conf
(4)接下来测试主服务器宕机,会不会有新的主服务提供服务:
docker stop redis6379 将主服务器停掉,同时在redis6380添加数据成功
info replicatio 查看服务器的角色信息
三、Cluster集群模式:
1、什么是Cluster集群:
redis Cluster集群模式要求至少需要3个master才能组成一个集群,同时每个master至少需要一个slave节点,各节点之间保持TCP通信。当master节点发生宕机,redis Cluster自动将对应的slave节点提拔为master,来重新对外提供服务。当使用cluster集群提供服务时,怎么知道请求落到那台服务器上。Redis集群采用哈希槽算法来确认由哪台服务器提供服务,哈希槽槽位义工有16384个,假设有3个master节点,则这些槽位会平均的分配给3个节点,每个节点覆盖一段哈希槽。在添加key时,首先用哈希槽算法计算该key存放的哈希槽,然后存放到对应的主机。
2、Cluster集群的实现(本次以3个master各带一个slave节点讲解):
(1)先准备配置文件,至少是6个,然后向各文件添加配置,如下:
kdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
(2)启动服务:
docker run -d --name redis7000 --restart=always \
--net host -v /opt/redis/7000/redis.conf:/redis.conf \
redis redis-server /redis.conf
docker run -d --name redis7001 --restart=always \
--net host -v /opt/redis/7001/redis.conf:/redis.conf \
redis redis-server /redis.conf
docker run -d --name redis7002 --restart=always \
--net host -v /opt/redis/7002/redis.conf:/redis.conf \
redis redis-server /redis.conf
docker run -d --name redis7003 --restart=always \
--net host -v /opt/redis/7003/redis.conf:/redis.conf \
redis redis-server /redis.conf
docker run -d --name redis7004 --restart=always \
--net host -v /opt/redis/7004/redis.conf:/redis.conf \
redis redis-server /redis.conf
docker run -d --name redis7005 --restart=always \
--net host -v /opt/redis/7005/redis.conf:/redis.conf \
redis redis-server /redis.conf
(3)组成集群,组成集群前,添加数据都是失败的:
docker exec -it redis7000 redis-cli --cluster create \
192.168.64.140:7000 192.168.64.140:7001 \
192.168.64.140:7002 192.168.64.140:7003 \
192.168.64.140:7004 192.168.64.140:7005 \
--cluster-replicas 1
(4) 向服务器添加数据进行测试:
注:从结果可以得知,value相同,key不同,它们存储到的服务器是不一样的,就算在在某个服务器下执行添加操作,还是会跳到其他服务器上。这是因为key经过哈希槽算法计算后,才确定具体存储到哪台服务器。