目录
一、前言
二、集群规划
三、部署结果验证
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代码,由社区进行缩进评估,以获得建议和贡献。我们不鼓励在任何生产环境中使用它。
GitHub – RedisLabs/redis-cluster-proxy: A proxy for Redis clusters.
Current status
This project is currently alpha code that is indented to be evaluated by the community in order to get suggestions and contributions. We discourage its usage in any production environment.
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net