目录
一、前言
二、集群规划
三、部署结果验证
3.1节点状态
3.2集群状态
3.3客户端验证
四、redis-cluster-proxy使用
4.1 前言
4.2说明
4.3环境依赖
4.4下载和编译
一、前言
redis集群化部署主要用于大型缓存架构,一般的小型架构,使用redis主从配置就行。
使用redis集群可以方便快捷地对集群进行动态扩容,动态的添加、删除节点,reshard、并带有自动故障恢复功能。
一般redis集群使用3主3从,并且尽量保证主服务器与从服务器不在同一台机器上,防止机器故障导致的集群瘫痪,每个主 服务器搭配一个从服务器,保证集群的高可用性。
官方地址:
Scaling with Redis Cluster | Redis
二、集群规划
三台服务器各部署一个主节点、一个从节点,同一台服务器上不是直接主从关系。
Redis-cluster | |||
编号 | 主从 1 | 主从 2 | 主从 3 |
1 | 192.168.2.211 | 192.168.2.212 | 192.168.2.213 |
2 | 192.168.2.214 | 192.168.2.152 | 192.168.2.153 |
软件版本:
- OS:CentOS7.6
- Redis:redis-6.2.6
编译依赖安装
yum -y install gcc tcl
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
下载编译安装
cd /opt
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar -xvf redis-6.2.6.tar.gz
cd redis-6.2.6
make MALLOC=libc
make install PREFIX=/app/software/redis-6.2.6 -j 4
创建文件夹
mkdir -p /app/software/redis-6.2.6/conf
mkdir -p /app/software/redis-6.2.6/log
mkdir -p /app/software/redis-6.2.6/data/
mkdir -p /app/software/redis-6.2.6/run/
cp redis.conf /app/software/redis-6.2.6/conf/
打开redis.conf文件,修改成以下内容:
其他服务器也是同样的配置文件,修改本机IP即可。
#添加本机的ip
bind 192.168.2.211
#端口
port 26379
#守护进程
daemonize yes
#pid存储目录
pidfile /app/software/redis-6.2.6/run/redis_26379.pid
#日志存储目录
logfile /app/software/redis-6.2.6/log/redis_26379.log
#数据存储目录,目录要提前创建好
dir /app/software/redis-6.2.6/data/
#开启集群
cluster-enabled yes
#集群节点的超时时间,单位:ms,超时后集群会认为该节点失败
cluster-node-timeout 15000
#集群节点配置文件,这个文件是不能手动编辑的。确保每一个集群节点的配置文件不同
cluster-config-file nodes_26379.conf
#->@wjw_note: 一下是根据实际情况来填写
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
loglevel warning
databases 16
# 设置Redis占用内存的大小
maxmemory 4gb
# 如果内存满了就需要按照如相应算法进行删除过期的/最老的
# volatile-lru (Redis3.0之前,默认的内存淘汰策略): 淘汰所有设置了过期时间的键值中,最久未使用的键值
# volatile-lfu (Redis4.0后新增的内存淘汰策略): 淘汰所有设置了过期时间的键值中,最少使用的键值
# allkeys-lru 淘汰整个键值中最久未使用的键值(包含那些未设置过期时间的key)
# allkeys-lfu (Redis4.0后新增的内存淘汰策略): 淘汰整个键值中最少使用的键值
# volatile-random/allkeys-random 随机淘汰设置了过期时间的任意键值/随机淘汰任意键值
# volatile-ttl 根据Time-To-Live移除即将过期的key
# noeviction 永不过期,而是报错
maxmemory-policy volatile-lru
# Redis并不是真正的LRU/TTL,而是基于采样进行移除的,即如采样10个数据移除其中最老的/即将过期的
maxmemory-samples 10
# AOF持久化
appendonly yes
appendfilename appendonly.aof
# 持久化策略,默认每秒fsync一次,也可以选择always即每次操作都进行持久化,或者no表示不进行持久化而是借助操作系统的同步将缓存区数据写到磁盘
appendfsync everysec
# AOF重写策略(同时满足如下两个策略进行重写)
# 当AOF文件大小占到初始文件大小的多少百分比时进行重写
auto-aof-rewrite-percentage 100
# 触发重写的最小文件大小
auto-aof-rewrite-min-size 1gb
# 为减少磁盘操作,暂缓重写阶段的磁盘同步
no-appendfsync-on-rewrite yes
# 慢查
# 下面的时间单位是微秒,所以1000000就是1秒.注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令.
slowlog-log-slower-than 10000
# 这个长度没有限制.只要有足够的内存就行.你可以通过 SLOWLOG RESET 来释放内存.(注:慢查日志是在内存里)
slowlog-max-len 128
masterauth 123456
requirepass 123456
启动
/app/software/redis-6.2.6/bin/redis-server /app/software/redis-6.2.6/conf/redis.conf
集群创建
三、部署结果验证
3.1节点状态
使用cluster nodes命令查看节点状态。
3.2集群状态
使用cluster info命令查看集群状态。
3.3客户端验证
使用客户端redis-cli二进制随便访问某个服务器的实例,执行set和get的测试。
注意事项
1、如果某一个主节点和他所有的从节点都下线的话,redis集群就会停止工作了。redis集群不保证数据的强一致性,在特定的情况下,redis集群会丢失已经被执行过的写命令
2、使用异步复制(asynchronous replication)是redis 集群可能会丢失写命令的其中一个原因,有时候由于网络原因,如果网络断开时间太长,redis集群就会启用新的主节点,之前发给主节点的数据就会丢失。
四、redis-cluster-proxy使用
4.1 前言
Redis Cluster 内部使用的是P2P中的Gossip协议,每个节点既可以从其他节点得到服务,也可以向其他节点提供服务,没有中心的概念,通过一个节点可以获取到整个集群的所有信息。所以如果应用连接Redis Cluster可以配置一个节点地址,也可以配置多个节点地址。但需要注意如果集群进行了上下节点的的操作,其应用也需要进行修改,这样会导致需要重启应用,非常的不友好。从Redis 6.0开始支持了Prxoy,可以直接用Proxy来管理各个集群节点。本文来介绍下如何使用官方自带的proxy:redis-cluster-proxy
4.2说明
通过使用 redis-cluster-proxy 可以与组成Redis集群的一组实例进行通讯,就像是单个实例一样。Redis群集代理是多线程的,使用多路复用通信模型,因此每个线程都有自己的与群集的连接,该连接由属于该线程本身的所有客户端共享。
在某些特殊情况下(例如MULTI事务或阻塞命令),多路复用将被禁用;并且客户端将拥有自己的集群连接。这样客户端仅发送诸如GET和SET之类的简单命令就不需要Redis集群的专有连接。
redis-cluster-proxy的主要功能:
- 路由:每个查询都会自动路由到集群的正确节点
- 多线程
- 支持多路复用和专用连接模型
- 在多路复用上下文中,可以确保查询执行和答复顺序
- 发生ASK | MOVED错误后自动更新集群的配置:当答复中发生此类错误时,代理通过获取集群的更新配置并重新映射所有插槽来自动更新集群。 更新完成后所有查询将重新执行,因此,从客户端的角度来看,一切正常进行(客户端将不会收到ASK | MOVED错误:他们将在收到请求后直接收到预期的回复) 群集配置已更新)。
- 跨槽/跨节点查询:支持许多命令,这些命令涉及属于不同插槽(甚至不同集群节点)的多个键。这些命令会将查询分为多个查询,这些查询将被路由到不同的插槽/节点。 这些命令的回复处理是特定于命令的。 某些命令(例如MGET)将合并所有答复,就好像它们是单个答复一样。 其他命令(例如MSET或DEL)将汇总所有答复的结果。 由于这些查询实际上破坏了命令的原子性,因此它们的用法是可选的(默认情况下禁用)。
- 一些没有特定节点/插槽的命令(例如DBSIZE)将传递到所有节点,并且将对映射的回复进行映射缩减,以便得出所有回复中包含的所有值的总和。
- 可用于执行某些特定于代理的操作的附加PROXY命令
4.3环境依赖
1. centos 7.x,需要手动安装 gcc+ 8 来支持 redis-cluster-proxy
2. 参考,如果是centos 8.0 版本,已经预安装了 gcc 8 的版本,可以通过 gcc -v 查看
yum install centos-release-scl -y
yum install devtoolset-8-gcc devtoolset-8-gcc-c++ -y
scl enable devtoolset-8 -- bash
4.4下载和编译
git clone https://github.com/RedisLabs/redis-cluster-proxy.git
cd redis-cluster-proxy
make && make install PREFIX=/opt/redis-cluster-proxy -j 4
启动
/app/software/redis-cluster-proxy/bin/redis-cluster-proxy -c /app/software/redis-cluster-proxy/conf/proxy.conf
客户端连接验证
官网:该项目目前是alpha代码,由社区进行缩进评估,以获得建议和贡献。我们不鼓励在任何生产环境中使用它。