redis6 cluster redis6 cluster集群搭建_redis

目录

 一、前言

二、集群规划

三、部署结果验证

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


集群创建


redis6 cluster redis6 cluster集群搭建_redis6 cluster_02


三、部署结果验证


3.1节点状态

使用cluster nodes命令查看节点状态。

redis6 cluster redis6 cluster集群搭建_redis_03

3.2集群状态

使用cluster info命令查看集群状态。

redis6 cluster redis6 cluster集群搭建_服务器_04

3.3客户端验证

使用客户端redis-cli二进制随便访问某个服务器的实例,执行set和get的测试。

redis6 cluster redis6 cluster集群搭建_redis6 cluster_05

注意事项

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

redis6 cluster redis6 cluster集群搭建_redis_06

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

客户端连接验证

redis6 cluster redis6 cluster集群搭建_redis_07

官网:该项目目前是alpha代码,由社区进行缩进评估,以获得建议和贡献。我们不鼓励在任何生产环境中使用它。