Redis集群搭建-3主3从

1 安装前准备

1.1 安装环境

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。

2 软件安装

Redis的安装步骤为:下载、解压、编译、配置、启动。

2.1 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

3 配置集群

在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.就说明集群配置好了

4 验证

4.1 查看集群信息

随意登录一台主机执行 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

4.2 查看节点信息

随意登录一台主机执行 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服务被设置成了从服务。至此说明,集群配置是成功的。

5 SpringBoot配置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 #连接超时时间(毫秒)

5 其他

5.1 异常处理

集群配置时一直提示“Waiting for the cluster to join…”

  • 删除/opt/yusys/redis/redis-5.0.5/bin目录下appendonly_.aof、dump.rdb、nodes-*.conf文件
  • 删除/var/run目录下redis_*.pid
  • 删除/var/log/redis目录下redis_*.log
  • 删除所有redis进程
  • 重新启动集群配置

5.2 参考资料

两台Linux服务器搭建Redis集群(伪)

你可能感兴趣的:(中间件,redis)