015、Redis的分布式集群(Cluster)架构部署实战
本文最后更新于 66 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

Redis的分布式集群(Cluster)架构部署实战

一.Redis Cluster实验架构说明

    如下图所示,在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

    Redis数据分片原理说明:
        (1)redis会有多组分片构成,本篇笔记实验环境是3组;
        (2)redis cluster使用固定个数的slot存储数据,一共16384是slot;
        (3)每组分片分得1/3 slot个数,分别为"0-5460,5461-10921,10922-16383"
        (4)基于CRC16(key) % 16384公式会得到一个"槽位号"(该编号范围在"0-16383"之间);
        (5)根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上;
        (6)如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储;

    综上所述,我们来举个例子,在Redis分布式集群中,假设我们执行了"SET name JasonYin"这一条指令,那么数据该如何存储的呢?其大致的存储逻辑如下:
        (1)使用"CRC16(KEY_NAME)"进行校验计算一个值,假设"CRC16(name)"的计算结果为"1234567890";
        (2)再使用"CRC16(KEY_NAME)%16384"进行计算,从而得出该KEY_NAME被分配到哪个slot上,假设结果为"1234567890%16384=722",就表示数据被落到slot=722的分片上;
        (3)而slot=722恰好在第一个分片上,因为我们第一个分片的slot范围就是"0-5460"

image-20210730203935958

二.Redis Cluster部署实战

1.实验环境说明

    在生产环境中,如果部署6个redis实例,一般会放到3台硬件服务器。在企业规划中,一个分片被分配到两个不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。

    温馨提示:
        本案例为了实验方便,就直接将6个Redis实例放在同一个节点上,对应的端口号为:63790-63795。

2.安装ruby,rubygems软件,这个在EPEL软件源中就有支持哟~

    [root@redis201.oldboyedu.com ~]# yum -y install ruby rubygems

    温馨提示:
        总所周知,Redis已经更新到6版本了,但目前为止,Redis 3依旧是主流,原因之一是生产环境中Redis 3基本上能满足需求无需升级版本外,还有一个重要的原因就是Redis 3集群模式有开源的组件支撑。
        rubygems是Ruby社区的Gem托管服务。

3.切换"ruby"国内的软件源,目的是为了提速,gem是ruby语言的包管理工具,类似于python语言的pip。

[root@redis201.oldboyedu.com ~]# gem source -l
*** CURRENT SOURCES ***

https://rubygems.org/
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# gem source -a http://mirrors.aliyun.com/rubygems/
http://mirrors.aliyun.com/rubygems/ added to sources
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# gem source -l
*** CURRENT SOURCES ***

https://rubygems.org/
http://mirrors.aliyun.com/rubygems/
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# gem source --remove https://rubygems.org/
https://rubygems.org/ removed from sources
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# gem source -l
*** CURRENT SOURCES ***

http://mirrors.aliyun.com/rubygems/
[root@redis201.oldboyedu.com ~]# 

4.ruby语言安装redis驱动插件

[root@redis201.oldboyedu.com ~]# gem install redis -v 3.3.3
Fetching: redis-3.3.3.gem (100%)
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed
[root@redis201.oldboyedu.com ~]# 

5.创建多Redis实例使用的配置文件,数据,日志目录

[root@redis201.oldboyedu.com ~]# mkdir -pv /oldboyedu/softwares/redis1000{0..5}
mkdir: 已创建目录 "/oldboyedu/softwares/redis10000"
mkdir: 已创建目录 "/oldboyedu/softwares/redis10001"
mkdir: 已创建目录 "/oldboyedu/softwares/redis10002"
mkdir: 已创建目录 "/oldboyedu/softwares/redis10003"
mkdir: 已创建目录 "/oldboyedu/softwares/redis10004"
mkdir: 已创建目录 "/oldboyedu/softwares/redis10005"
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# mkdir -pv /oldboyedu/data/redis1000{0..5}
mkdir: 已创建目录 "/oldboyedu/data/redis10000"
mkdir: 已创建目录 "/oldboyedu/data/redis10001"
mkdir: 已创建目录 "/oldboyedu/data/redis10002"
mkdir: 已创建目录 "/oldboyedu/data/redis10003"
mkdir: 已创建目录 "/oldboyedu/data/redis10004"
mkdir: 已创建目录 "/oldboyedu/data/redis10005"
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# mkdir -pv /oldboyedu/logs/redis1000{0..5}
mkdir: 已创建目录 "/oldboyedu/logs/redis10000"
mkdir: 已创建目录 "/oldboyedu/logs/redis10001"
mkdir: 已创建目录 "/oldboyedu/logs/redis10002"
mkdir: 已创建目录 "/oldboyedu/logs/redis10003"
mkdir: 已创建目录 "/oldboyedu/logs/redis10004"
mkdir: 已创建目录 "/oldboyedu/logs/redis10005"
[root@redis201.oldboyedu.com ~]# 

6.为各个Redis实例创建配置文件

    (1)创建"redis10000"实例的配置文件
        [root@redis201.oldboyedu.com ~]# cat > /oldboyedu/softwares/redis10000/redis.conf <<EOF
        > port 10000
        > daemonize yes
        > pidfile /oldboyedu/data/redis10000/redis.pid
        > loglevel notice
        > logfile /oldboyedu/logs/redis10000/redis.log
        > dbfilename dump.rdb
        > dir /oldboyedu/data/redis10000
        > bind 172.200.1.201 127.0.0.1
        > # 配置RDB持久化策略
        > save 900 1
        > save 300 10
        > save 60 10000
        > # 配置AOF持久化
        > appendonly yes
        > appendfsync everysec
        > # 配置Redis Cluster模式
        > protected-mode no
        > cluster-enabled yes
        > cluster-config-file nodes.conf
        > cluster-node-timeout 5000
        > EOF
        [root@redis201.oldboyedu.com ~]# 
        [root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis10000/redis.conf 
        port 10000
        daemonize yes
        pidfile /oldboyedu/data/redis10000/redis.pid
        loglevel notice
        logfile /oldboyedu/logs/redis10000/redis.log
        dbfilename dump.rdb
        dir /oldboyedu/data/redis10000
        bind 172.200.1.201 127.0.0.1
        # 配置RDB持久化策略
        save 900 1
        save 300 10
        save 60 10000
        # 配置AOF持久化
        appendonly yes
        appendfsync everysec
        # 配置Redis Cluster模式
        protected-mode no
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        [root@redis201.oldboyedu.com ~]# 

    (2)创建"redis10001"实例的配置文件
        [root@redis201.oldboyedu.com ~]# cat > /oldboyedu/softwares/redis10001/redis.conf <<EOF
        > port 10001
        > daemonize yes
        > pidfile /oldboyedu/data/redis10001/redis.pid
        > loglevel notice
        > logfile /oldboyedu/logs/redis10001/redis.log
        > dbfilename dump.rdb
        > dir /oldboyedu/data/redis10001
        > bind 172.200.1.201 127.0.0.1
        > # 配置RDB持久化策略
        > save 900 1
        > save 300 10
        > save 60 10000
        > # 配置AOF持久化
        > appendonly yes
        > appendfsync everysec
        > # 配置Redis Cluster模式
        > protected-mode no
        > cluster-enabled yes
        > cluster-config-file nodes.conf
        > cluster-node-timeout 5000
        > EOF
        [root@redis201.oldboyedu.com ~]# 
        [root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis10001/redis.conf 
        port 10001
        daemonize yes
        pidfile /oldboyedu/data/redis10001/redis.pid
        loglevel notice
        logfile /oldboyedu/logs/redis10001/redis.log
        dbfilename dump.rdb
        dir /oldboyedu/data/redis10001
        bind 172.200.1.201 127.0.0.1
        # 配置RDB持久化策略
        save 900 1
        save 300 10
        save 60 10000
        # 配置AOF持久化
        appendonly yes
        appendfsync everysec
        # 配置Redis Cluster模式
        protected-mode no
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        [root@redis201.oldboyedu.com ~]# 

    (3)创建"redis10002"实例的配置文件
        [root@redis201.oldboyedu.com ~]# cat > /oldboyedu/softwares/redis10002/redis.conf <<EOF
        > port 10002
        > daemonize yes
        > pidfile /oldboyedu/data/redis10002/redis.pid
        > loglevel notice
        > logfile /oldboyedu/logs/redis10002/redis.log
        > dbfilename dump.rdb
        > dir /oldboyedu/data/redis10002
        > bind 172.200.1.201 127.0.0.1
        > # 配置RDB持久化策略
        > save 900 1
        > save 300 10
        > save 60 10000
        > # 配置AOF持久化
        > appendonly yes
        > appendfsync everysec
        > # 配置Redis Cluster模式
        > protected-mode no
        > cluster-enabled yes
        > cluster-config-file nodes.conf
        > cluster-node-timeout 5000
        > EOF
        [root@redis201.oldboyedu.com ~]# 
        [root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis10002/redis.conf 
        port 10002
        daemonize yes
        pidfile /oldboyedu/data/redis10002/redis.pid
        loglevel notice
        logfile /oldboyedu/logs/redis10002/redis.log
        dbfilename dump.rdb
        dir /oldboyedu/data/redis10002
        bind 172.200.1.201 127.0.0.1
        # 配置RDB持久化策略
        save 900 1
        save 300 10
        save 60 10000
        # 配置AOF持久化
        appendonly yes
        appendfsync everysec
        # 配置Redis Cluster模式
        protected-mode no
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        [root@redis201.oldboyedu.com ~]# 

    (4)创建"redis10003"实例的配置文件
        [root@redis201.oldboyedu.com ~]# cat > /oldboyedu/softwares/redis10003/redis.conf <<EOF
        > port 10003
        > daemonize yes
        > pidfile /oldboyedu/data/redis10003/redis.pid
        > loglevel notice
        > logfile /oldboyedu/logs/redis10003/redis.log
        > dbfilename dump.rdb
        > dir /oldboyedu/data/redis10003
        > bind 172.200.1.201 127.0.0.1
        > # 配置RDB持久化策略
        > save 900 1
        > save 300 10
        > save 60 10000
        > # 配置AOF持久化
        > appendonly yes
        > appendfsync everysec
        > # 配置Redis Cluster模式
        > protected-mode no
        > cluster-enabled yes
        > cluster-config-file nodes.conf
        > cluster-node-timeout 5000
        > EOF
        [root@redis201.oldboyedu.com ~]# 
        [root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis10003/redis.conf 
        port 10003
        daemonize yes
        pidfile /oldboyedu/data/redis10003/redis.pid
        loglevel notice
        logfile /oldboyedu/logs/redis10003/redis.log
        dbfilename dump.rdb
        dir /oldboyedu/data/redis10003
        bind 172.200.1.201 127.0.0.1
        # 配置RDB持久化策略
        save 900 1
        save 300 10
        save 60 10000
        # 配置AOF持久化
        appendonly yes
        appendfsync everysec
        # 配置Redis Cluster模式
        protected-mode no
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        [root@redis201.oldboyedu.com ~]# 

    (5)创建"redis10004"实例的配置文件
        [root@redis201.oldboyedu.com ~]# cat > /oldboyedu/softwares/redis10004/redis.conf <<EOF
        > port 10004
        > daemonize yes
        > pidfile /oldboyedu/data/redis10004/redis.pid
        > loglevel notice
        > logfile /oldboyedu/logs/redis10004/redis.log
        > dbfilename dump.rdb
        > dir /oldboyedu/data/redis10004
        > bind 172.200.1.201 127.0.0.1
        > # 配置RDB持久化策略
        > save 900 1
        > save 300 10
        > save 60 10000
        > # 配置AOF持久化
        > appendonly yes
        > appendfsync everysec
        > # 配置Redis Cluster模式
        > protected-mode no
        > cluster-enabled yes
        > cluster-config-file nodes.conf
        > cluster-node-timeout 5000
        > EOF
        [root@redis201.oldboyedu.com ~]# 
        [root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis10004/redis.conf 
        port 10004
        daemonize yes
        pidfile /oldboyedu/data/redis10004/redis.pid
        loglevel notice
        logfile /oldboyedu/logs/redis10004/redis.log
        dbfilename dump.rdb
        dir /oldboyedu/data/redis10004
        bind 172.200.1.201 127.0.0.1
        # 配置RDB持久化策略
        save 900 1
        save 300 10
        save 60 10000
        # 配置AOF持久化
        appendonly yes
        appendfsync everysec
        # 配置Redis Cluster模式
        protected-mode no
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        [root@redis201.oldboyedu.com ~]# 

    (6)创建"redis10005"实例的配置文件
        [root@redis201.oldboyedu.com ~]# cat > /oldboyedu/softwares/redis10005/redis.conf <<EOF
        > port 10005
        > daemonize yes
        > pidfile /oldboyedu/data/redis10005/redis.pid
        > loglevel notice
        > logfile /oldboyedu/logs/redis10005/redis.log
        > dbfilename dump.rdb
        > dir /oldboyedu/data/redis10005
        > bind 172.200.1.201 127.0.0.1
        > # 配置RDB持久化策略
        > save 900 1
        > save 300 10
        > save 60 10000
        > # 配置AOF持久化
        > appendonly yes
        > appendfsync everysec
        > # 配置Redis Cluster模式
        > protected-mode no
        > cluster-enabled yes
        > cluster-config-file nodes.conf
        > cluster-node-timeout 5000
        > EOF
        [root@redis201.oldboyedu.com ~]# 
        [root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis10005/redis.conf 
        port 10005
        daemonize yes
        pidfile /oldboyedu/data/redis10005/redis.pid
        loglevel notice
        logfile /oldboyedu/logs/redis10005/redis.log
        dbfilename dump.rdb
        dir /oldboyedu/data/redis10005
        bind 172.200.1.201 127.0.0.1
        # 配置RDB持久化策略
        save 900 1
        save 300 10
        save 60 10000
        # 配置AOF持久化
        appendonly yes
        appendfsync everysec
        # 配置Redis Cluster模式
        protected-mode no
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
        [root@redis201.oldboyedu.com ~]# 

    配置参数说明:
        cluster-enabled yes:
            开启集群功能。
        cluster-config-file nodes.conf:
            指定集群的配置文件,无需修改,这是由redis自行维护。
        cluster-node-timeout 5000:
            指定集群节点的超时时间为5000毫秒,即5秒钟。

    温馨提示:
        (1)Redis的端口号范围在10000~55535之间。这是因为当我们启动各个redis实例后,会监听在对应redis实例的端口上加10000;
        (2)由于上面我使用了"protected-mode no"指令,表示不开启安全模式,如果设置为"YES",尽管配置了"requirepass"和"masterauth"这两个配置项,我们在将redis节点加入到集群时依旧会报错哟!
        (3)Redis cluster模式无需像redis sentinel模式那样有一个专门的监控模式;

7.启动各个Redis实例

[root@redis201.oldboyedu.com ~]# ss -ntl
State       Recv-Q Send-Q                                                 Local Address:Port                                                                Peer Address:Port              
LISTEN      0      128                                                                *:22                                                                             *:*                  
LISTEN      0      128                                                             [::]:22                                                                          [::]:*                  
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-server /oldboyedu/softwares/redis10000/redis.conf 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-server /oldboyedu/softwares/redis10001/redis.conf 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-server /oldboyedu/softwares/redis10002/redis.conf 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-server /oldboyedu/softwares/redis10003/redis.conf 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-server /oldboyedu/softwares/redis10004/redis.conf 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-server /oldboyedu/softwares/redis10005/redis.conf 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# netstat -untalp | grep redis
tcp        0      0 127.0.0.1:10000         0.0.0.0:*               LISTEN      48987/redis-server  
tcp        0      0 172.200.1.201:10000     0.0.0.0:*               LISTEN      48987/redis-server  
tcp        0      0 127.0.0.1:10001         0.0.0.0:*               LISTEN      48905/redis-server  
tcp        0      0 172.200.1.201:10001     0.0.0.0:*               LISTEN      48905/redis-server  
tcp        0      0 127.0.0.1:10002         0.0.0.0:*               LISTEN      49069/redis-server  
tcp        0      0 172.200.1.201:10002     0.0.0.0:*               LISTEN      49069/redis-server  
tcp        0      0 127.0.0.1:10003         0.0.0.0:*               LISTEN      49151/redis-server  
tcp        0      0 172.200.1.201:10003     0.0.0.0:*               LISTEN      49151/redis-server  
tcp        0      0 127.0.0.1:10004         0.0.0.0:*               LISTEN      49233/redis-server  
tcp        0      0 172.200.1.201:10004     0.0.0.0:*               LISTEN      49233/redis-server  
tcp        0      0 127.0.0.1:10005         0.0.0.0:*               LISTEN      49315/redis-server  
tcp        0      0 172.200.1.201:10005     0.0.0.0:*               LISTEN      49315/redis-server  
tcp        0      0 127.0.0.1:20000         0.0.0.0:*               LISTEN      48987/redis-server  
tcp        0      0 172.200.1.201:20000     0.0.0.0:*               LISTEN      48987/redis-server  
tcp        0      0 127.0.0.1:20001         0.0.0.0:*               LISTEN      48905/redis-server  
tcp        0      0 172.200.1.201:20001     0.0.0.0:*               LISTEN      48905/redis-server  
tcp        0      0 127.0.0.1:20002         0.0.0.0:*               LISTEN      49069/redis-server  
tcp        0      0 172.200.1.201:20002     0.0.0.0:*               LISTEN      49069/redis-server  
tcp        0      0 127.0.0.1:20003         0.0.0.0:*               LISTEN      49151/redis-server  
tcp        0      0 172.200.1.201:20003     0.0.0.0:*               LISTEN      49151/redis-server  
tcp        0      0 127.0.0.1:20004         0.0.0.0:*               LISTEN      49233/redis-server  
tcp        0      0 172.200.1.201:20004     0.0.0.0:*               LISTEN      49233/redis-server  
tcp        0      0 127.0.0.1:20005         0.0.0.0:*               LISTEN      49315/redis-server  
tcp        0      0 172.200.1.201:20005     0.0.0.0:*               LISTEN      49315/redis-server  
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# ps -ef | grep redis | grep -v "grep"
root      50114      1  0 22:46 ?        00:00:00 redis-server 172.200.1.201:10000 [cluster]
root      50196      1  0 22:46 ?        00:00:00 redis-server 172.200.1.201:10001 [cluster]
root      50278      1  0 22:46 ?        00:00:00 redis-server 172.200.1.201:10002 [cluster]
root      50360      1  0 22:46 ?        00:00:00 redis-server 172.200.1.201:10003 [cluster]
root      50442      1  0 22:46 ?        00:00:00 redis-server 172.200.1.201:10004 [cluster]
root      50563      1  0 22:46 ?        00:00:00 redis-server 172.200.1.201:10005 [cluster]
[root@redis201.oldboyedu.com ~]# 

8.将节点加入集群管理

[root@redis201.oldboyedu.com ~]# redis-trib.rb create --replicas 1 172.200.1.201:10000 172.200.1.201:10001 172.200.1.201:10002 172.200.1.201:10003 172.200.1.201:10004 172.200.1.201:10005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.200.1.201:10000
172.200.1.201:10001
172.200.1.201:10002
Adding replica 172.200.1.201:10003 to 172.200.1.201:10000
Adding replica 172.200.1.201:10004 to 172.200.1.201:10001
Adding replica 172.200.1.201:10005 to 172.200.1.201:10002
M: 88e97940a7371296fb3d51589440dc43ea256599 172.200.1.201:10000
   slots:0-5460 (5461 slots) master
M: c907ac66c16daa720735e89addc5a854c3c40a0f 172.200.1.201:10001
   slots:5461-10922 (5462 slots) master
M: c1146f293fca9207a60358b849be8ae6af7c6e2f 172.200.1.201:10002
   slots:10923-16383 (5461 slots) master
S: 022fdb712d56996201a0e892bf9547d0ede1dd3b 172.200.1.201:10003
   replicates 88e97940a7371296fb3d51589440dc43ea256599
S: a0f75a28e4b9b60b2c1910a20c15fc92e02c2d67 172.200.1.201:10004
   replicates c907ac66c16daa720735e89addc5a854c3c40a0f
S: d973719a920e2b1d8a14d43213bab3bad43cbc8a 172.200.1.201:10005
   replicates c1146f293fca9207a60358b849be8ae6af7c6e2f
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.200.1.201:10000)
M: 88e97940a7371296fb3d51589440dc43ea256599 172.200.1.201:10000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: c1146f293fca9207a60358b849be8ae6af7c6e2f 172.200.1.201:10002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: a0f75a28e4b9b60b2c1910a20c15fc92e02c2d67 172.200.1.201:10004
   slots: (0 slots) slave
   replicates c907ac66c16daa720735e89addc5a854c3c40a0f
M: c907ac66c16daa720735e89addc5a854c3c40a0f 172.200.1.201:10001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 022fdb712d56996201a0e892bf9547d0ede1dd3b 172.200.1.201:10003
   slots: (0 slots) slave
   replicates 88e97940a7371296fb3d51589440dc43ea256599
S: d973719a920e2b1d8a14d43213bab3bad43cbc8a 172.200.1.201:10005
   slots: (0 slots) slave
   replicates c1146f293fca9207a60358b849be8ae6af7c6e2f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@redis201.oldboyedu.com ~]# 

参数说明:
    (1)我们使用"--replicas 1"指定了集群的replica节点(也就是slave节点)数量是1,即一个master节点对应一个replica节点;
    (2)在执行上述命令操作时,会弹出一行交互式界面,输出"(type 'yes' to accept):",我们手动输入"yes"即可;

温馨提示:
    根据上面输出的结果也不难发现,我手动输入6个redis实例,但"redis-trib.rb"工具默认会将前3个设置为master节点,将后3个设置为slave节点。
    综上所述,生产环境中我们在规划集群时,千万不要把"同一组主从"放在同一个物理机上,避免因为物理机器宕机而导致整个分片数据丢失!

image-20210730191700591

9.查看集群的状态

[root@redis201.oldboyedu.com ~]# redis-cli -p 10005 CLUSTER NODES
88e97940a7371296fb3d51589440dc43ea256599 172.200.1.201:10000 master - 0 1614869987763 1 connected 0-5460
c1146f293fca9207a60358b849be8ae6af7c6e2f 172.200.1.201:10002 master - 0 1614869987260 3 connected 10923-16383
022fdb712d56996201a0e892bf9547d0ede1dd3b 172.200.1.201:10003 slave 88e97940a7371296fb3d51589440dc43ea256599 0 1614869986757 4 connected
c907ac66c16daa720735e89addc5a854c3c40a0f 172.200.1.201:10001 master - 0 1614869986253 2 connected 5461-10922
a0f75a28e4b9b60b2c1910a20c15fc92e02c2d67 172.200.1.201:10004 slave c907ac66c16daa720735e89addc5a854c3c40a0f 0 1614869988268 5 connected
d973719a920e2b1d8a14d43213bab3bad43cbc8a 172.200.1.201:10005 myself,slave c1146f293fca9207a60358b849be8ae6af7c6e2f 0 0 6 connected
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-cli -p 10005 CLUSTER NODES | grep master  # 只查看Master节点
88e97940a7371296fb3d51589440dc43ea256599 172.200.1.201:10000 master - 0 1614870017001 1 connected 0-5460
c1146f293fca9207a60358b849be8ae6af7c6e2f 172.200.1.201:10002 master - 0 1614870016497 3 connected 10923-16383
c907ac66c16daa720735e89addc5a854c3c40a0f 172.200.1.201:10001 master - 0 1614870016497 2 connected 5461-10922
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# 
[root@redis201.oldboyedu.com ~]# redis-cli -p 10005 CLUSTER NODES | grep slave  # 只查看Slave节点
022fdb712d56996201a0e892bf9547d0ede1dd3b 172.200.1.201:10003 slave 88e97940a7371296fb3d51589440dc43ea256599 0 1614870019521 4 connected
a0f75a28e4b9b60b2c1910a20c15fc92e02c2d67 172.200.1.201:10004 slave c907ac66c16daa720735e89addc5a854c3c40a0f 0 1614870017506 5 connected
d973719a920e2b1d8a14d43213bab3bad43cbc8a 172.200.1.201:10005 myself,slave c1146f293fca9207a60358b849be8ae6af7c6e2f 0 0 6 connected
[root@redis201.oldboyedu.com ~]# 

每项的含义如下:
    id: 
        节点ID,是一个40字节的随机字符串,这个值在节点启动的时候创建,并且永远不会改变(除非使用CLUSTER RESET HARD命令)。
    ip:port: 
        客户端与节点通信使用的地址.
    flags: 
        逗号分割的标记位,可能的值有: myself, master, slave, fail?, fail, handshake, noaddr, noflags. 下一部分将详细介绍这些标记.
    master: 
        如果节点是slave,并且已知master节点,则这里列出master节点ID,否则的话这里列出”-“。
    ping-sent: 
        最近一次发送ping的时间,这个时间是一个unix毫秒时间戳,0代表没有发送过.
    pong-recv: 
        最近一次收到pong的时间,使用unix时间戳表示.
    config-epoch: 
        节点的epoch值(or of the current master if the node is a slave)。每当节点发生失败切换时,都会创建一个新的,独特的,递增的epoch。如果多个节点竞争同一个哈希槽时,epoch值更高的节点会抢夺到。
    link-state: 
        node-to-node集群总线使用的链接的状态,我们使用这个链接与集群中其他节点进行通信.值可以是 connected 和 disconnected.
    slot: 
        哈希槽值或者一个哈希槽范围. 从第9个参数开始,后面最多可能有16384个 数(limit never reached)。代表当前节点可以提供服务的所有哈希槽值。如果只是一个值,那就是只有一个槽会被使用。如果是一个范围,这个值表示为起始槽-结束槽,节点将处理包括起始槽和结束槽在内的所有哈希槽。

各flags的含义 (上面所说数据项3):
    myself: 
        当前连接的节点.
    master: 
        节点是master.
    slave: 
        节点是slave.
    fail?: 
        节点处于PFAIL 状态。 当前节点无法联系,但逻辑上是可达的 (非 FAIL 状态).
    fail: 
        节点处于FAIL 状态. 大部分节点都无法与其取得联系将会将改节点由 PFAIL 状态升级至FAIL状态。
    handshake: 
        还未取得信任的节点,当前正在与其进行握手.
    noaddr: 
        没有地址的节点(No address known for this node).
    noflags: 
        连个标记都没有(No flags at all).

    参考链接:
        http://www.redis.cn/commands/cluster-nodes.html

温馨提示:
    (1)如果有"myself"字样,说明你正在连接的是哪个节点;
    (2)注意观察槽位编号信息,比如"172.200.1.201:10000 master"被分配到的槽位号是"0-5460",而"172.200.1.201:10001"被分配到的槽位号是"5461-10922","172.200.1.201:10002 master"被分配到的槽位号是"10923-16383";
    (3)每个redis实例都有其独有的id编号,比如"172.200.1.201:10000 master"的编号为"88e97940a7371296fb3d51589440dc43ea256599",这有点类似于MySQL的"server_uuid";

image-20210730192402544

三.跨节点集群配置

一.所有节点操作
    (1)安装ruby环境
yum -y install ruby rubygems

    (2)切换软件源
gem source -l
gem source -a http://mirrors.aliyun.com/rubygems/
gem source --remove https://rubygems.org/
gem source -l

    (3)安装redis的驱动
gem install redis -v 3.3.3

二.配置redis cluster
    (1)集群规划
    10.0.0.106:
        10601
        10602

    10.0.0.107:
        10701
        10702

    10.0.0.108:
        10801
        10802

    (2)10.0.0.106创建配置文件
install -d /oldboyedu/{data,logs}/{redis10601,redis10602}
cat > /oldboyedu/softwares/redis/redis10601.conf <<EOF
port 10601
daemonize yes
pidfile /oldboyedu/data/redis10601/redis.pid
loglevel notice
logfile /oldboyedu/logs/redis10601/redis.log
dbfilename oldboyedu_linux.rdb
dir /oldboyedu/data/redis10601
bind 10.0.0.106
# 配置RDB持久化策略
save 900 1
save 300 10
save 60 10000
# 配置Redis Cluster模式
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

cat > /oldboyedu/softwares/redis/redis10602.conf <<EOF
port 10602
daemonize yes
pidfile /oldboyedu/data/redis10602/redis.pid
loglevel notice
logfile /oldboyedu/logs/redis10602/redis.log
dbfilename oldboyedu_linux.rdb
dir /oldboyedu/data/redis10602
bind 10.0.0.106
# 配置RDB持久化策略
save 900 1
save 300 10
save 60 10000
# 配置Redis Cluster模式
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

    (2)10.0.0.107创建配置文件
install -d /oldboyedu/{data,logs}/{redis10701,redis10702}
cat > /oldboyedu/softwares/redis/redis10701.conf <<EOF
port 10701
daemonize yes
pidfile /oldboyedu/data/redis10701/redis.pid
loglevel notice
logfile /oldboyedu/logs/redis10701/redis.log
dbfilename oldboyedu_linux.rdb
dir /oldboyedu/data/redis10701
bind 10.0.0.107
# 配置RDB持久化策略
save 900 1
save 300 10
save 60 10000
# 配置Redis Cluster模式
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

cat > /oldboyedu/softwares/redis/redis10702.conf <<EOF
port 10702
daemonize yes
pidfile /oldboyedu/data/redis10702/redis.pid
loglevel notice
logfile /oldboyedu/logs/redis10702/redis.log
dbfilename oldboyedu_linux.rdb
dir /oldboyedu/data/redis10702
bind 10.0.0.107
# 配置RDB持久化策略
save 900 1
save 300 10
save 60 10000
# 配置Redis Cluster模式
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

    (2)10.0.0.108创建配置文件
install -d /oldboyedu/{data,logs}/{redis10801,redis10802}
cat > /oldboyedu/softwares/redis/redis10801.conf <<EOF
port 10801
daemonize yes
pidfile /oldboyedu/data/redis10801/redis.pid
loglevel notice
logfile /oldboyedu/logs/redis10801/redis.log
dbfilename oldboyedu_linux.rdb
dir /oldboyedu/data/redis10801
bind 10.0.0.108
# 配置RDB持久化策略
save 900 1
save 300 10
save 60 10000
# 配置Redis Cluster模式
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

cat > /oldboyedu/softwares/redis/redis10802.conf <<EOF
port 10802
daemonize yes
pidfile /oldboyedu/data/redis10802/redis.pid
loglevel notice
logfile /oldboyedu/logs/redis10802/redis.log
dbfilename oldboyedu_linux.rdb
dir /oldboyedu/data/redis10802
bind 10.0.0.108
# 配置RDB持久化策略
save 900 1
save 300 10
save 60 10000
# 配置Redis Cluster模式
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

三.启动服务并测试
    (1)10.0.0.106
redis-server /oldboyedu/softwares/redis/redis10601.conf
redis-server /oldboyedu/softwares/redis/redis10602.conf

    (2)10.0.0.107
redis-server /oldboyedu/softwares/redis/redis10701.conf
redis-server /oldboyedu/softwares/redis/redis10702.conf

    (1)10.0.0.108
redis-server /oldboyedu/softwares/redis/redis10801.conf
redis-server /oldboyedu/softwares/redis/redis10802.conf

四.配置redis cluster集群
(1)将redis实例加入集群
redis-trib.rb create --replicas 1 10.0.0.106:10601 10.0.0.106:10602 10.0.0.107:10701 10.0.0.107:10702 10.0.0.108:10801 10.0.0.108:10802

(2)查看集群状态
redis-cli -h 10.0.0.107 -p 10701 CLUSTER NODES

五.测试
    略!

作业:
    调研"redis  codis"集群部署!

四.可能会遇到的错误

1.[ERR] Sorry, can't connect to node 127.0.0.1:10001

错误原因:
    无法连接到集群,很有可能是防火墙未关闭,如果使用redis-cli命令可以正常连接。还有另外一个可能,即配置了redis密码。

解决方案:
    将"protected-mode"的设置为no,即"protected-mode no"。

image-20210730191327082

2.zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

解决方案:
    make MALLOC=libc
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇