1.1.1 安装说明
Redis Cluster是社区版推出的Redis分布式集群解决方案,主要解决Redis分布式方面的需求,比如当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster能起到很好的负载均衡的目的。Redis Cluster集群节点最小配置6个节点以上(3主3从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
1.1.2 操作系统
Red Hat 7.5(64位)
1.1.3 主机规划
服务类型 | IP地址 | 端口 |
---|---|---|
Redis | 172.10.0.11 | 6370 |
Redis | 172.10.0.11 | 6371 |
Redis | 172.10.0.11 | 6372 |
Redis | 172.10.0.12 | 6370 |
Redis | 172.10.0.12 | 6371 |
Redis | 172.10.0.12 | 6372 |
1.1.4 系统配置说明
Redis服务和哨兵服务需要占用端口,请先按照上面主机规划设置防火墙开放端口
1.1.5 Redis版本号说明
Redis版本为5.0.5。
Redis的安装步骤为:下载、解压、编译、配置、启动。
以下以11服务器安装为例,其他类似。
2.1.1 SSH登录Redis主机
ssh [email protected]
2.1.2 安装所需环境和工具
yum -y install wget vim tcl gcc make
2.1.3 下载Redis
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
或者通过FTP将redis-5.0.5.tar.gz上传
2.1.4 解压
tar -zxvf redis-5.0.5.tar.gz
2.1.5 编译
cd redis-5.0.5/
make install PREFIX=/opt/yusys/redis/redis-5.0.5
拷贝配置文件到Redis程序目录
cp redis.conf /opt/yusys/redis/redis-5.0.5/bin
redis.conf是Redis服务的配置文件;sentinel.conf是哨兵服务的配置文件。
2.1.6 配置内核参数
内核参数overcommit_memory
它是 内存分配策略
可选值:0,1,2。
0,:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。
配置 vm.overcommit_memory 为1,这可以避免数据被截断
编辑vim /etc/sysctl.conf ,修改如下:
vm.overcommit_memory=1
sysctl -p
2.1.7 创建多实例目录,用于存放不同实例的配置文件
cd /opt/yusys/redis/redis-5.0.5
mkdir cluster
cd cluster
mkdir 6370
mkdir 6371
mkdir 6372
2.1.8 修改配置文件
vim /opt/yusys/redis/redis-5.0.5/bin/redis.conf
# 需要不同服务器的节点连通,就不能设置为 127.0.0.1
bind 172.16.90.41
# 需要不同服务器的节点连通,这个就要设置为 no
protected-mode no
# 设置后台运行redis
daemonize yes
cluster-enabled yes
cluster-node-timeout 5000
appendonly yes
根据不同端口需要设置的地方
port 6370
pidfile /var/run/redis_6370.pid
logfile /var/log/redis/redis_6370.log
dbfilename dump_6370.rdb
appendfilename "appendonly_6370.aof"
cluster-config-file nodes_6370.conf
2.1.9 复制配置文件到各个实例文件夹,并修改相应端口号和参数
cp -f /opt/yusys/redis/redis-5.0.5/bin/redis.conf /opt/yusys/redis/redis-5.0.5/cluster/6370/
cp -f /opt/yusys/redis/redis-5.0.5/bin/redis.conf /opt/yusys/redis/redis-5.0.5/cluster/6371/
cp -f /opt/yusys/redis/redis-5.0.5/bin/redis.conf /opt/yusys/redis/redis-5.0.5/cluster/6372/
2.1.10 启动各个实例
cd /opt/yusys/redis/redis-5.0.5/bin
./redis-server /opt/yusys/redis/redis-5.0.5/cluster/6370/redis.conf &
./redis-server /opt/yusys/redis/redis-5.0.5/cluster/6371/redis.conf &
./redis-server /opt/yusys/redis/redis-5.0.5/cluster/6372/redis.conf &
使用 ps -ef|grep redis 查看是否都启动成功,IP和端口号都正确
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJ8BVEMT-1584259797431)(FDD4F632612C40F1B6CCA950D58D9DC5)]
2.1.11 防火墙开通端口号策略
必须开集群总线端口,集群总线端口=端口号+10000
例:6370的集群总线端口是16370。这个集群总线端口不开放,集群的时候外部服务器的节点添加不进来
firewall-cmd --zone=public --add-port=6370-6372/tcp --permanent
firewall-cmd --zone=public --add-port=16370-16372/tcp --permanent
firewall-cmd --reload
在6台机器中随意找一台使用redis-cli命令创建集群
cd /opt/yusys/redis/redis-5.0.5/bin
./redis-cli --cluster create 172.16.90.41:6370 172.16.90.41:6371 172.16.90.41:6372 172.16.90.42:6370 172.16.90.42:6371 172.16.90.42:6372 --cluster-replicas 1
cluster-replicas 1 表示: 一主一从配置,6个节点就是3主3从
遇到Can I set the above configuration? (type ‘yes’ to accept)提示时输入yes并回车。
输出信息如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.90.42:6372 to 172.16.90.41:6370
Adding replica 172.16.90.41:6372 to 172.16.90.42:6370
Adding replica 172.16.90.42:6371 to 172.16.90.41:6371
M: a40a5842c9e7ebdf8412e6a3f9bd8ae60f01cfc4 172.16.90.41:6370
slots:[0-5460] (5461 slots) master
M: 0c0059873a95135bf2be8c6259df6cf3c5a5616c 172.16.90.41:6371
slots:[10923-16383] (5461 slots) master
S: a12cdcc23637ddd4643993e3230f5abf55dc4c51 172.16.90.41:6372
replicates d5da76e1a6c4c0269eef4aa60d2a5629e270dc22
M: d5da76e1a6c4c0269eef4aa60d2a5629e270dc22 172.16.90.42:6370
slots:[5461-10922] (5462 slots) master
S: 772d84568290eb2e3eb57e710c761f906591c7ae 172.16.90.42:6371
replicates 0c0059873a95135bf2be8c6259df6cf3c5a5616c
S: 3bbb0f677dc92c10385e2cdd1bffd278b846cdba 172.16.90.42:6372
replicates a40a5842c9e7ebdf8412e6a3f9bd8ae60f01cfc4
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 172.16.90.41:6370)
M: a40a5842c9e7ebdf8412e6a3f9bd8ae60f01cfc4 172.16.90.41:6370
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 3bbb0f677dc92c10385e2cdd1bffd278b846cdba 172.16.90.42:6372
slots: (0 slots) slave
replicates a40a5842c9e7ebdf8412e6a3f9bd8ae60f01cfc4
M: d5da76e1a6c4c0269eef4aa60d2a5629e270dc22 172.16.90.42:6370
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 772d84568290eb2e3eb57e710c761f906591c7ae 172.16.90.42:6371
slots: (0 slots) slave
replicates 0c0059873a95135bf2be8c6259df6cf3c5a5616c
M: 0c0059873a95135bf2be8c6259df6cf3c5a5616c 172.16.90.41:6371
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: a12cdcc23637ddd4643993e3230f5abf55dc4c51 172.16.90.41:6372
slots: (0 slots) slave
replicates d5da76e1a6c4c0269eef4aa60d2a5629e270dc22
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据。输出了[OK] All 16384 slots covered.就说明集群配置好了
随意登录一台主机执行 cluster info命令,下面以连接41机器为例。
/opt/yusys/redis/redis-5.0.5/bin
./redis-cli -h 172.16.90.41 -c -p 6370 cluster info
输出信息如下:
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:390
cluster_stats_messages_pong_sent:398
cluster_stats_messages_sent:788
cluster_stats_messages_ping_received:393
cluster_stats_messages_pong_received:390
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:788
随意登录一台主机执行 cluster info命令,下面以连接41机器为例。
/opt/yusys/redis/redis-5.0.5/bin
./redis-cli -h 172.16.90.41 -c -p 6370 cluster nodes
输出信息如下:
3bbb0f677dc92c10385e2cdd1bffd278b846cdba 172.16.90.42:6372@16372 slave a40a5842c9e7ebdf8412e6a3f9bd8ae60f01cfc4 0 1566372554536 6 connected
d5da76e1a6c4c0269eef4aa60d2a5629e270dc22 172.16.90.42:6370@16370 master - 0 1566372554000 4 connected 5461-10922
772d84568290eb2e3eb57e710c761f906591c7ae 172.16.90.42:6371@16371 slave 0c0059873a95135bf2be8c6259df6cf3c5a5616c 0 1566372552503 5 connected
a40a5842c9e7ebdf8412e6a3f9bd8ae60f01cfc4 172.16.90.41:6370@16370 myself,master - 0 1566372552000 1 connected 0-5460
0c0059873a95135bf2be8c6259df6cf3c5a5616c 172.16.90.41:6371@16371 master - 0 1566372554745 2 connected 10923-16383
a12cdcc23637ddd4643993e3230f5abf55dc4c51 172.16.90.41:6372@16372 slave d5da76e1a6c4c0269eef4aa60d2a5629e270dc22 0 1566372553000 4 connected
从节点信息可以看出,42:6370、41:6371、41:6370这3个Redis服务被设置成了主服务,42:6372、42:6371、41:6372这3个Redis服务被设置成了从服务。至此说明,集群配置是成功的。
application.yml 添加Redis配置
spring:
redis:
cluster:
nodes:
- 172.16.90.41:6370
- 172.16.90.41:6371
- 172.16.90.41:6372
- 172.16.90.42:6370
- 172.16.90.42:6371
- 172.16.90.42:6372
timeout: 60000 #连接超时时间(毫秒)
集群配置时一直提示“Waiting for the cluster to join…”
两台Linux服务器搭建Redis集群(伪)