美文网首页
Redis 集群★★★

Redis 集群★★★

作者: 鄙人_阿K | 来源:发表于2021-12-01 21:01 被阅读0次

    Redis6总纲

    https://www.jianshu.com/p/901dc5a0c683

    目录

    1、搭建
    2、故障恢复
    3、jredis开发

    阿K须知点:

    操作集群的添加,查询(对应的插槽机),查看节点(cluseer nodes)都必须在主机上面操作。

    一、搭建

    1、解决两个问题

    (1)容量不够,redis如何进行扩容?
    (2)并发写操作, redis如何分摊?

    另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。

    之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置

    2、什么是集群

    (1)Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
    (2)Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

    3、开撸(制作6个实例,6379,6380,6381,6389,6390,6391)

    (1)删除持久化数据:将rdb,aof文件都删除掉。
    rm -rf dump63*.rdb

    [root@VM-0-13-centos ~]# cd /myredis
    [root@VM-0-13-centos myredis]# ls
    dump6379.rdb  dump6381.rdb    redis6380.conf  redis.conf
    dump6380.rdb  redis6379.conf  redis6381.conf  sentinel.conf
    [root@VM-0-13-centos myredis]# rm -rf dump63*.rdb
    [root@VM-0-13-centos myredis]# ls
    redis6379.conf  redis6380.conf  redis6381.conf  redis.conf  sentinel.conf
    
    

    (2)配置基本信息

    [root@VM-0-13-centos myredis]# cat redis6379.conf
    include /myredis/redis.conf
    pidfile "/var/run/redis_6379.pid"
    port 6379
    dbfilename "dump6379.rdb"
    

    (3)添加配置信息
    cluster-enabled yes 打开集群模式

    cluster-config-file nodes-6379.conf 设定节点配置文件名

    cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

    [root@VM-0-13-centos myredis]# cat redis6379.conf
    include /myredis/redis.conf
    pidfile "/var/run/redis_6379.pid"
    port 6379
    dbfilename "dump6379.rdb"
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
    
    

    (4)复制出其他五个节点的配置文件

    cp redis6379.conf redis6380.conf
    ......
    cp redis6379.conf redis6391.conf
    

    (5)全局替换配置的端口号
    vi 下运行 %s/6379/6380,其他几个以此类推

    image.png

    (6)启动6个节点服务

    [root@VM-0-13-centos myredis]# redis-server redis6379.conf
    [root@VM-0-13-centos myredis]# redis-server redis6380.conf
    [root@VM-0-13-centos myredis]# redis-server redis6381.conf
    [root@VM-0-13-centos myredis]# redis-server redis6389.conf
    [root@VM-0-13-centos myredis]# redis-server redis6390.conf
    [root@VM-0-13-centos myredis]# redis-server redis6391.conf
    
    

    (7)组合之前先确定6个节点实例启动成功,nodes-xxxx.conf文件都生成正常(合体前的检查)

    [root@VM-0-13-centos myredis]# ll
    total 144
    -rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6379.conf
    -rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6380.conf
    -rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6381.conf
    -rw-r--r-- 1 root root   114 Dec  1 23:13 nodes-6389.conf
    -rw-r--r-- 1 root root   114 Dec  1 23:14 nodes-6390.conf
    -rw-r--r-- 1 root root   114 Dec  1 23:14 nodes-6391.conf
    -rw-r--r-- 1 root root   181 Dec  1 22:55 redis6379.conf
    -rw-r--r-- 1 root root   181 Dec  1 23:01 redis6380.conf
    -rw-r--r-- 1 root root   181 Dec  1 23:01 redis6381.conf
    -rw-r--r-- 1 root root   181 Dec  1 23:02 redis6389.conf
    -rw-r--r-- 1 root root   181 Dec  1 23:02 redis6390.conf
    -rw-r--r-- 1 root root   181 Dec  1 23:03 redis6391.conf
    -rw-r--r-- 1 root root 92223 Nov 30 21:50 redis.conf
    -rw-r--r-- 1 root root   392 Dec  1 20:27 sentinel.conf
    
    

    (8)查看是否有 rb环境(合体前的检查)
    切换到 cd /opt/redis-6.2.1/src

    image.png

    redis6.2.1及其以上是有封装这个环境,以下的版本需要自己装

    (9)将6个节点合成一个集群(合体!)
    以下命令要在cd /opt/redis-6.2.1/src目录下才能执行

    redis-cli --cluster create --cluster-replicas 1 172.16.0.13:6379 172.16.0.13:6380 172.16.0.13:6381 172.16.0.13:6389 172.16.0.13:6390 172.16.0.13:6391
    

    此处不要用127.0.0.1, 请用真实IP地址
    --replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组。


    image.png

    (10)登录:此时不能已普通方式登录,插入等操作会出重定向的问题
    -c 采用集群策略连接,设置数据会自动切换到相应的写主机
    redis-cli -c -p 6379

    image.png

    这里需要注意,保证6个端口都是开放的,否则运行后会超时

    (11)通过 cluster nodes 命令查看集群信息

    127.0.0.1:6380> CLUSTER NODES
    e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638458289000 1 connected
    ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638458289779 1 connected 0-5460
    a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 myself,master - 0 1638458288000 2 connected 5461-10922
    4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638458290000 3 connected 10923-16383
    bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 slave a907d625a8b92a9ba429722cca79c94ad344ad88 0 1638458291806 2 connected
    f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638458290781 3 connected
    
    

    二、集群原理

    (1)redis cluster 如何分配这六个节点?

    一个集群至少要有三个主节点。

    选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。(一对一)

    分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

    (2)什么是slots
    一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
    集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

    集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
    节点 A 负责处理 0 号至 5460 号插槽。
    节点 B 负责处理 5461 号至 10922 号插槽。
    节点 C 负责处理 10923 号至 16383 号插槽。

    image.png

    (3)在集群中录入值

    在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

    redis-cli客户端提供了 –c 参数实现自动重定向。

    如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。

    不在一个slot下的键值,是不能使用mget,mset等多键操作。

    127.0.0.1:6380> mset k1 v1 k2 v2 ke v3
    (error) CROSSSLOT Keys in request don't hash to the same slot
    

    可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。

    127.0.0.1:6380> mset name{user} jack age{user} 20
    OK
    

    (4)查询集群中的值
    CLUSTER GETKEYSINSLOT <slot><count> 返回 count 个 slot 槽中的键。

    127.0.0.1:6380> CLUSTER KEYSLOT user
    (integer) 5474
    127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 5474
    (integer) 2
    127.0.0.1:6380> CLUSTER GETKEYSINSLOT 5474 2
    1) "age{user}"
    2) "name{user}"
    

    三、故障恢复

    1、如果主节点下线?

    从节点能否自动升为主节点?注意:15秒超时
    原本是 6380主机的 从机 6389上位了

    [root@VM-0-13-centos ~]# redis-cli -c -p  6380
    127.0.0.1:6380> shutdown
    not connected> exit
    [root@VM-0-13-centos ~]# ps -ef|grep redis
    root     19658     1  0 14:40 ?        00:00:50 redis-server *:6381 [cluster]
    root     19664     1  0 14:40 ?        00:00:49 redis-server *:6389 [cluster]
    root     19670     1  0 14:41 ?        00:00:49 redis-server *:6390 [cluster]
    root     19676     1  0 14:41 ?        00:00:49 redis-server *:6391 [cluster]
    root     19686     1  0 14:42 ?        00:00:50 redis-server *:6379 [cluster]
    root     19739 19610  0 14:57 pts/1    00:00:00 redis-cli -c -p 6379
    root     24776 24515  0 23:34 pts/0    00:00:00 grep --color=auto redis
    [root@VM-0-13-centos ~]# redis-cli -c -p  6381
    127.0.0.1:6381> cluster nodes
    ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459347964 1 connected 0-5460
    4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 myself,master - 0 1638459348000 3 connected 10923-16383
    f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459348000 3 connected
    bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 master - 0 1638459348989 7 connected 5461-10922
    e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459347000 1 connected
    a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 master,fail - 1638459257471 1638459254000 2 disconnected
    
    

    2、主节点恢复后,主从关系会如何?

    主节点回来变成从机。

    [root@VM-0-13-centos ~]# redis-server /myredis/redis6380.conf
    [root@VM-0-13-centos ~]# redis-cli -c -p 6389
    127.0.0.1:6389> cluster nodes
    a907d625a8b92a9ba429722cca79c94ad344ad88 :0@0 master,fail,noaddr - 1638459258445 1638459254000 2 disconnected
    e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459799000 1 connected
    ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459798000 1 connected 0-5460
    4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638459800592 3 connected 10923-16383
    f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459799578 3 connected
    bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 myself,master - 0 1638459799000 7 connected 5461-10922
    
    

    3、如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

    如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉

    如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储,但是整个集群还可以用。

    redis.conf中的参数 cluster-require-full-coverage

    查看 参数情况:config get cluster-require-full-coverage

    127.0.0.1:6389> config get cluster-require-full-coverage
    1) "cluster-require-full-coverage"
    2) "yes"
    

    四、jredis开发

    1、说明

    即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。
    无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。

    2、代码

        public static void main(String[] args) {
            // 创建对象
            HostAndPort hostAndPort = new HostAndPort ("172.16.0.13",6390);
            JedisCluster jedisCluster = new JedisCluster (hostAndPort);
    
            // 操作
            jedisCluster.set ("bb1","vv1");
            String value = jedisCluster.get ("bb1");
            System.out.println (value );
    
            jedisCluster.close ();
        }
    

    3、Redis 集群提供了以下好处

    (1)实现扩容
    (2)分摊压力
    (3)无中心配置相对简单

    4、缺点

    (1)多键操作是不被支持的
    (2)多键的Redis事务是不被支持的。lua脚本不被支持
    (3)由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

    端口开放

    1、开启防火墙 
        systemctl start firewalld
    
    2、开放指定端口
          firewall-cmd --zone=public --add-port=1935/tcp --permanent
     命令含义:
    --zone #作用域
    --add-port=1935/tcp  #添加端口,格式为:端口/通讯协议
    --permanent  #永久生效,没有此参数重启后失效
    
    3、重启防火墙
          firewall-cmd --reload
    
    4、查看端口号
    netstat -ntlp   //查看当前所有tcp端口·
    
    netstat -ntulp |grep 1935   //查看所有1935端口使用情况·
    

    搭建遇到的问题参考的博客

    使用rb合体:https://blog.csdn.net/weixin_42350858/article/details/108229438

    发现rb运行不了:https://blog.csdn.net/fly910905/article/details/85274463

    开放端口:https://www.cnblogs.com/sxmny/p/11224842.html

    cluster-require-full-coverage 参数:https://blog.51cto.com/liuzhanbin/1871514

    节点重新加入集群:https://blog.csdn.net/qq_35613498/article/details/105523536

    相关文章

      网友评论

          本文标题:Redis 集群★★★

          本文链接:https://www.haomeiwen.com/subject/zulexrtx.html