一 背景
单个Redis支持的读写能力还是有限的,此时我们可以使用多个redis来提高redis的并发处理能力
二 主从架构
1.master 负责读写,并将数据同步到slave 中。
slave 为从节点,只负责读
2. 同步分为全量同步和增量同步
全量同步就是冷备份同步(RDB方式的持久化)
增量同步为指令同步
3.进行主从演示(基于redis,设计一主从架构,一个Master,两个Slave)
第一步:将redis01拷贝两份
cp -r redis01/ redis02
第二步:假如已有redis服务,先将原先所有redis服务停止(docker rm -f redis容器名),并启动新的redis容器
docker run -p 6379:6379 --name redis6379 \ -v /usr/local/docker/redis01/data:/data \ -v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf \ --appendonly yes
docker run -p 6380:6379 --name redis6380 \ -v /usr/local/docker/redis02/data:/data \ -v /usr/local/docker/redis02/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf \ --appendonly yes
docker run -p 6381:6379 --name redis6381 \ -v /usr/local/docker/redis03/data:/data \ -v /usr/local/docker/redis03/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf \ --appendonly yes
这三个端口不一样
第三步 检测redis服务角色
启动三个客户端,分别登陆三台redis容器服务,通过info指令进行角色查看,默认新启动的三个redis服务角色都为master.
127.0.0.1:6379> info replication
\# Replication role:master connected_slaves:0 master_repl_offset:3860 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:3859
第四步:检测redis6379的ip设置
docker inspect redis6379
…… "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "c33071765cb48acb1efed6611615c767b04b98e6e298caa0dc845420e6112b73", "EndpointID": "4c77e3f458ea64b7fc45062c5b2b3481fa32005153b7afc211117d0f7603e154", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } }
第五步:设置Master/Slave架构
分别登陆redis6380/redis6381,然后执行如下语句
slaveof 172.17.0.2 6379
第六步:再次登陆redis6379,然后检测info
[root@centos7964 ~]# docker exec -it redis6379 redis-cli 127.0.0.1:6379> info replication
\# Replication role:master connected_slaves:2 slave0:ip=172.17.0.3,port=6379,state=online,offset=2004,lag=1 slave1:ip=172.17.0.4,port=6379,state=online,offset=2004,lag=1 master_failover_state:no-failover master_replid:5baf174fd40e97663998abf5d8e89a51f7458488 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2004 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2004
第七步: 登陆redis6379测试,master读写都可以
第八步: 登陆redis6380测试,slave只能读。
三 Redis哨兵模式
1.背景
哨兵(Sentinel)是Redis的主从架构模式下,实现高可用性(high availability)的一种机制。 由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
2.哨兵服务的配置
第一步:
分别进入3台redis容器内部进行配置,在容器指定目录/etc/redis创建sentinel.conf文件,文件内容为:
sentinel monitor redis6379 172.17.0.2 6379 1
如上指令表示要的监控的master, redis6379为服务名, 172.17.0.2和6379为master的ip和端口,1表示多少个sentinel认为一个master失效时,master才算真正失效.
这里如果出现 bash: vi: command not found,可依次执行如下两个指令
1、apt-get update 2、apt-get install vim
第二步
在每个redis容器内部的/etc/redis目录下执行如下指令(最好是在多个客户端窗口执行),启动哨兵服务
redis-sentinel sentinel.conf
第三步
打开一个新的客户端连接窗口,关闭redis6379服务(这个服务是master服务)
docker stop redis6379
其它客户端窗口,检测日志输出
以上步骤是为了检测master主节点宕机之后,哨兵是否会从从节点中选出一个主节点
3.对于sentinel.conf文件中的内容,我们还可以基于实际需求,进行增强配置
sentinel monitor redis6379 172.17.0.2 6379 1 daemonize yes #后台运行 logfile "/var/log/sentinel_log.log" #运行日志 sentinel down-after-milliseconds redis6379 30000 #默认30秒
其中: 1)daemonize yes表示后台运行(默认为no) 2)logfile 用于指定日志文件位置以及名字 3)sentinel down-after-milliseconds 表示master失效了多长时间才认为失效
四 Redis集群
1 概述
Redis单机模式可靠性保证不是很好,容易出现单点故障,同时其性能也受限于CPU的处理能力,实际开发中Redis必然是高可用的,所以单机模式并不是我们的终点,我们需要对目前redis的架构模式进行升级。 Sentinel模式做到了高可用,但是实质还是只有一个master在提供服务(读写分离的情况本质也是master在提供服务),当master节点所在的机器内存不足以支撑系统的数据时,就需要考虑集群了。 Redis集群架构实现了对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这N个redis节点中,每个节点存储总数据的1/N。redis集群通过分区提供一定程度的可用性,即使集群中有一部分节点失效或无法进行通讯,集群也可以继续处理命令请求。
2.创建集群的步骤
第一步:
准备网络环境(创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。)
docker network create redis-net
查看docker的网卡信息 docker network ls
查看docker网络详细信息 docker network inspect redis-net
第二步:
准备redis配置模板
mkdir -p /usr/local/docker/redis-cluster
cd /usr/local/docker/redis-cluster
vim redis-cluster.tmpl
在redis-cluster.tmpl中输入以下内容
port ${PORT} cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 192.168.227.131 cluster-announce-port ${PORT} cluster-announce-bus-port 1${PORT} appendonly yes
解释内容:
port:节点端口,即对外提供通信的端口 为 ${变量} cluster-enabled:是否启用集群 cluster-config-file:集群配置文件 cluster-node-timeout:连接超时时间 cluster-announce-ip:宿主机ip cluster-announce-port:集群节点映射端口 cluster-announce-bus-port:集群总线端口 appendonly:持久化模式
第三步:
在redis-cluser中执行以下命令
for port in $(seq 8010 8015); \ do \ mkdir -p ./${port}/conf \ && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \ && mkdir -p ./${port}/data; \ done
解释:
for 变量 in $(seq var1 var2);do …; done为linux中的一种shell 循环脚本,指令envsubst
通过cat指令查看配置文件内容
cat /usr/local/docker/redis-cluster/801{0..5}/conf/redis.conf
第四步:
创建集群中的redis节点容器
for port in $(seq 8010 8015); \ do \ docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \ --privileged=true -v /usr/local/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ --privileged=true -v /usr/local/docker/redis-cluster/${port}/data:/data \ --restart always --name redis-${port} --net redis-net \ --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \ done
解释:
--privileged=true表示让启动的容器用户具备真正root权限,
--sysctl net.core.somaxconn=1024 这是一个linux的内核参数,用于设置请求队列大小,默认为128,后续启动redis的启动指令需要先放到这个请求队列中,然后依次启动.
第五步:
创建redis-cluster集群配置
docker exec -it redis-8010 bash
redis-cli --cluster create 192.168.227.131:8010 192.168.227.131:8011 192.168.227.131:8012 192.168.227.131:8013 192.168.227.131:8014 192.168.227.131:8015 --cluster-replicas 1 解释:
1表示主从比例,当出现选择提示信息时,输入yes即可
第六步:
连接redis-cluster,并添加数据到redis
redis-cli -c -h 192.168.227.131 -p 8010
五 搭建过程出现错误,需要清除的步骤
1.批量停止docker 容器:
docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker stop
2.批量删除docker 容器:
docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker rm -f
3.批量删除文件
rm -rf 801{0..5}/conf/redis.conf