提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 应用场景
- 部署
- 1. 单点部署
- 2. 主从部署
- 2.1 实例化部署
- 2.2 docker容器化部署
- 3. 哨兵部署
- 4. 集群部署
- docker部署
应用场景
-
ELK分布式日志管理系统-brocker
logstash采集数据量大时,直接传输到indexer进行加工处理会有性能瓶颈;此时需要一个中间缓冲层(brocker),提高性能。ELK官方推荐redis来实现brocker
缺点:redis不容易持久化,突然断电容易导致数据丢失的问题,可以用kafka来实现brocker解决这个问题
-
web缓存
作为缓存对象加速web访问
在该场景下,有一些存储于数据库中的数据会被频繁访问,如果频繁的访问数据库,数据库负载会升高,同时由于数据库IO比较慢,应用程序的响应会比较差。此时,如果引入Redis来存储这些被频繁访问的数据,就可以有效的降低数据库的负载,同时提高应用程序的请求响应。
-
会话存储(session)
使用Redis来存储会话(Session)数据,可以实现在无状态的服务器之间共享用户相关的状态数据数据。
当用户登录Web应用时候,将会话数据存储于Redis,并将唯一的会话ID(Session ID)返回到客户端的Cookie中。当用户再向应用发送请求时,会将此会话ID包含在请求中。无状态的Web服务器,根据这个会话ID从Redis中搜索相关的会话数据来进一步请求处理。
部署
实验版本:6.0.19
暂不使用高版本,高版本依赖python3,需要安装python3和相关编译环境,增加系统复杂性
单点服务器带来的问题
- 单点故障,服务不可用
- 无法处理大量的并发数据
- 数据丢失----大灾难
1. 单点部署
-
下载:Index of /releases/ (redis.io)
-
上传服务器并解压
tar -zxvf /data/pkg/redis-6.0.19.tar.gz -C /data/
-
编译安装
cd /data/redis-6.0.19 make && make install # 安装目录为 /usr/local/bin/
-
验证
cd /usr/local/bin/ redis-server
-
迁移
# 打包 cd /usr/local/ tar -czf redis.tar.gz bin/ # 解压 tar -zxvf redis.tar.gz -C /data/ # 启动 cd /data/redis ./redis-server /data/redis/redis.conf
2. 主从部署
在Redis节点上,存在主节点和从节点。假设2个redis服务器,我们分别部署一个redis-server进程,此时此刻,我们将一个节点作为主节点,另外两个作为从节点,从此从节点上的数据需要跟随主节点而改变,从节点是主节点的复制品,只能接收主节点的复制命令。
-
主节点(Master):
主节点是数据的原始来源,负责处理客户端的写操作(写入数据)。
主节点会将自己的写操作记录(写命令)发送给所有从节点,使得所有从节点都能保持与主节点的数据同步。 -
从节点(Slave):
从节点是主节点的复制品,它们通过复制主节点的数据来实现与主节点的数据同步。
从节点只能接收来自主节点的复制命令,并且不能接收客户端的写请求(只读)。
从节点可以处理客户端的读请求,因此可以用来扩展读性能。
优点:单点模式,如果单个redis服务器挂了,整个服务将不可用,导致系统中断或者数据不可访问。但是主从节点,节点数目多,因此除非全世界停电,不然不可能数据不可访问!
2.1 实例化部署
每个节点单机部署后,**调整一下配置文件启动就行**,具体配置详见 2.2中redis.conf配置
2.2 docker容器化部署
3. 哨兵部署
哨兵模式是在主从模式的基础上添加了故障检测和自动故障转移的功能。在哨兵模式中,一个或多个哨兵进程监视Redis节点的运行状况。如果主节点发生故障,哨兵会检测到这一情况并自动将其中一个从节点提升为新的主节点。这个过程是自动的,所以不需要人为干预。哨兵模式提高了Redis集群的可靠性,确保即使主节点发生故障,Redis服务也能够继续运行。
4. 集群部署
简介
优缺点
docker部署
-
实验环境
IP 端口 部署路径 说明 192.168.56.52 6381,16381 /data/redis-cluster/server1/redis-master redis-master1 192.168.56.52 6382,16382 /data/redis-cluster/server1/redis-slave redis-slave1 192.168.56.52 6383,16383 /data/redis-cluster/server2/redis-master redis-master2 192.168.56.52 6384,16384 /data/redis-cluster/server2/redis-slave redis-slave2 192.168.56.52 6385,16385 /data/redis-cluster/server3/redis-master redis-master3 192.168.56.52 6386,16386 /data/redis-cluster/server3/redis-slave redis-slave3 -
镜像准备(见主从部署)
-
注意事项
- 部署采用host模式,直接使用主机的端口,所以不用配置端口映射,配了也没用
- 那么每个conf文件就要使用真实的ip和端口进行配置
- 主从关系不用自己编排,初始化的时候redis自动编排
-
开始部署
-
创建文件夹
mkdir -p /data/redis-cluster/redis-638{1..2}/{data,config}
-
编辑docker-compose.yml
vi /data/redis-cluster/redis-compose.yml ----------------------------------------------------- version: "2.17" # 版本号:要和docker-compose版本相同 services:redis-6381:image: redis:5.0.8network_mode: "host" # 配置为host模式直接使用主机网络volumes:- ./redis-6381/config:/opt/config- ./redis-6381/data:/datacommand: - "redis-server" - "/opt/config/redis.conf"container_name: redis-cluster-6381 # 定义容器名称redis-6382:image: redis:5.0.8network_mode: "host"volumes:- ./redis-6382/config:/opt/config- ./redis-6382/data:/datacommand: - "redis-server" - "/opt/config/redis.conf"container_name: redis-cluster-6382 # 定义容器名称redis-6383:image: redis:5.0.8network_mode: "host"volumes:- ./redis-6383/config:/opt/config- ./redis-6383/data:/datacommand: - "redis-server" - "/opt/config/redis.conf"container_name: redis-cluster-6383 # 定义容器名称redis-6384:image: redis:5.0.8network_mode: "host"volumes:- ./redis-6384/config:/opt/config- ./redis-6384/data:/datacommand: - "redis-server" - "/opt/config/redis.conf"container_name: redis-cluster-6384 # 定义容器名称redis-6385:image: redis:5.0.8network_mode: "host"volumes:- ./redis-6385/config:/opt/config- ./redis-6385/data:/datacommand: - "redis-server" - "/opt/config/redis.conf"container_name: redis-cluster-6385 # 定义容器名称redis-6386:image: redis:5.0.8network_mode: "host"volumes:- ./redis-6386/config:/opt/config- ./redis-6386/data:/datacommand: - "redis-server" - "/opt/config/redis.conf"container_name: redis-cluster-6386 # 定义容器名称
-
编辑redis.conf(所有节点)
- 创建
redis-cluster.tmpl
模板,方便一次性生成多个
vi redis-cluster.tmpl --------------------------------------------- bind 0.0.0.0 # redis端口 port ${PORT} tcp-backlog 511 timeout 0 tcp-keepalive 300 supervised no pidfile /var/run/redis_${PORT}.pid databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 dir /data/ repl-disable-tcp-nodelay no slave-priority 100 maxclients 60000 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no #redis 访问密码 requirepass rEi4s!p.a8sW6rAc #redis 访问Master节点密码 masterauth rEi4s!p.a8sW6rAc # 关闭保护模式 protected-mode no # 开启集群 cluster-enabled yes # 集群节点配置 cluster-config-file nodes_${PORT}.conf # 超时 cluster-node-timeout 5000 # 集群节点IP host模式为宿主机IP,远程服务器的公网IP cluster-announce-ip ${IP} # 集群节点端口 6791 - 6796 cluster-announce-port ${PORT} cluster-announce-bus-port 1${PORT} # 日志配置 # debug:会打印生成大量信息,适用于开发/测试阶段 # verbose:包含很多不太有用的信息,但是不像debug级别那么混乱 # notice:适度冗长,适用于生产环境 # warning:仅记录非常重要、关键的警告消息 loglevel notice # 日志文件路径 logfile "/data/redis.log"
- 创建
redis-cluster-config.sh
脚本生成所有配置文件
shell vi redis-cluster-config.sh --------------------------------------------------------- #!/bin/bash# 配置文件模板 TEMPLATE="redis-cluster.tmpl"BASE_DIR="/data/redis/redis-cluster"# 端口范围 START_PORT=6381 END_PORT=6386# ip eth = "eth0" IP=$(ip -o -4 addr list $eth | awk '{print $4}' | cut -d/ -f1)# 创建目标目录(如果不存在) for PORT in $(seq $START_PORT $END_PORT); do# 生成配置文件的目录TARGET_DIR="$BASE_DIR/redis-$PORT/config"mkdir -p "$TARGET_DIR"# 生成配置文件名CONF_FILE="$TARGET_DIR/redis.conf"# 复制模板文件并替换端口cp "$TEMPLATE" "$CONF_FILE"sed -i "s/\${PORT}/$PORT/" "$CONF_FILE"sed -i "s/\${IP}/$IP/" "$CONF_FILE"echo "生成配置文件: $CONF_FILE"echo "复制成功" done
启动集群
docker-compose -f ./redis-compose.yml up -d docker-compose -f ./redis-compose.yml down
docker ps -a
启动成功
- 创建
-
初始化集群
# 清空数据 rm -f /data/redis/redis-63{79,80}/data/* docker exec -it redis-cluster-6379 /bin/bashredis-cli --cluster create 10.43.118.47:6379 10.43.118.47:6380 10.43.118.48:6379 10.43.118.48:6380 10.43.118.49:6379 10.43.118.49:6380 --cluster-replicas 1 -a 'rEi4s!p.a8sW6rAc'
这里输入yes
初始化成功!!!
-
验证
-