redis集群

Posted 徐大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis集群相关的知识,希望对你有一定的参考价值。

一、redis-cluster

1.介绍

高性能
1)在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
2)存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
3)根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
4)如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
高可用
在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

1)redis会有多组分片构成(3组)
2)redis cluster 使用固定个数的slot存储数据(一共16384slot)
3)每组分片分得1/3 slot个数(0-5500 5501-11000 11001-16383)
4)基于CRC16(key) % 16384 ====》值 (槽位号)。

2.规划搭建过程

准备
6个redis实例,一般会放到3台硬件服务器
注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。
端口号:7000-7005

技术图片
集群节点准备
mkdir -p /data/700{0,3}
mkdir -p /data/700{1,4}
mkdir -p /data/700{2,5}
cat > /data/7000/redis.conf <<EOF
port 7000
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode yes
#配置yes开启redis-cluster
cluster-enabled yes
#这个配置很重要,cluster开启必须重命名指定cluster-config-file,不能与别的节点相同,否则会启动失败,最好按主机+端口命名
cluster-config-file nodes-7000.conf
#配置节点之间超时时间
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7001/redis.conf <<EOF
port 7001
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode yes
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7002/redis.conf <<EOF
port 7002
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode yes
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 5000
appendonly yes
EOF


cat >>  /data/7003/redis.conf <<EOF
port 7003
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode yes
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
appendonly yes
EOF


cat >> /data/7004/redis.conf <<EOF
port 7004
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode yes
cluster-enabled yes
cluster-config-file nodes-7004.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7005/redis.conf <<EOF
port 7005
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode yes
cluster-enabled yes
cluster-config-file nodes-7005.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动节点
redis-server /data/7000/redis.conf 
redis-server /data/7001/redis.conf 
redis-server /data/7002/redis.conf 
redis-server /data/7003/redis.conf 
redis-server /data/7004/redis.conf 
redis-server /data/7005/redis.conf 
[root@db01 ~]# ps -ef |grep redis
root       8854      1  0 03:56 ?        00:00:00 redis-server *:7000 [cluster]     
root       8858      1  0 03:56 ?        00:00:00 redis-server *:7001 [cluster]     
root       8860      1  0 03:56 ?        00:00:00 redis-server *:7002 [cluster]     
root       8864      1  0 03:56 ?        00:00:00 redis-server *:7003 [cluster]     
root       8866      1  0 03:56 ?        00:00:00 redis-server *:7004 [cluster]     
root       8874      1  0 03:56 ?        00:00:00 redis-server *:7005 [cluster]  

创建集群管理
redis-cli --cluster create --cluster-replicas 1 10.0.0.250:7000 10.0.0.251:7001 10.0.0.252:7002 10.0.0.250:7003 10.0.0.251:7004 10.0.0.252:7005 -a 123456
然后输入yes

-a 123456表示输入密码
--cluster-replicas 1 表示每个创建的主服务器都有一个从服务器

创建完成之后,redis再进行连接时,加上一个-c参数就表示是连接集群操作了
redis-cli -h 10.0.0.250 -c -a 123456 -p 7000
连接进去后设置key-value时会自动切换
View Code

3.集群相应命令

技术图片
查看节点状态
cluster nodes
cluster info(查看集群信息)
增加新节点
mkdir -p /data/7006
mkdir -p /data/7007
cat > /data/7006/redis.conf <<EOF
port 7006
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >  /data/7007/redis.conf <<EOF
port 7007
daemonize yes
bind 0.0.0.0
requirepass 123456
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

redis-server /data/7006/redis.conf 
redis-server /data/7007/redis.conf 

添加新主节点
redis-cli --cluster add-node 10.0.0.253:7006 10.0.0.250:7000 -a 123456
重新分片
redis-cli --cluster reshard 10.0.0.250:7000 -a 123456
然后根据提示,输入要接收的槽数(看集群节点个数来分)4096
然后输入节点id号
然后输入all表示从各个节点进行接收

添加新从节点
redis-cli --cluster add-node 10.0.0.253:7007 10.0.0.250:7000 -a 123456 --cluster-slave --cluster-master-id 3d0aa317b7a44cb25d92e2884cdb9e694eff8772

删除节点
从节点可以直接删除,主节点不能直接删除,删除之后,该节点会被shutdown。
View Code

4.节点相关命令

技术图片
redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN   #创建集群
                 --cluster-replicas <arg>      #从节点个数
  check          host:port                     #检查集群
                 --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
  info           host:port                     #查看集群状态
  fix            host:port                     #修复集群
                 --cluster-search-multiple-owners #修复槽的重复分配问题
  reshard        host:port                     #指定集群的任意一节点进行迁移slot,重新分slots
                 --cluster-from <arg>          #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-to <arg>            #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-slots <arg>         #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
                 --cluster-yes                 #指定迁移时的确认输入
                 --cluster-timeout <arg>       #设置migrate命令的超时时间
                 --cluster-pipeline <arg>      #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
                 --cluster-replace             #是否直接replace到目标节点
  rebalance      host:port                                      #指定集群的任意一节点进行平衡集群节点slot数量 
                 --cluster-weight <node1=w1...nodeN=wN>         #指定集群节点的权重
                 --cluster-use-empty-masters                    #设置可以让没有分配slot的主节点参与,默认不允许
                 --cluster-timeout <arg>                        #设置migrate命令的超时时间
                 --cluster-simulate                             #模拟rebalance操作,不会真正执行迁移操作
                 --cluster-pipeline <arg>                       #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
                 --cluster-threshold <arg>                      #迁移的slot阈值超过threshold,执行rebalance操作
                 --cluster-replace                              #是否直接replace到目标节点
  add-node       new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
                 --cluster-slave                                #新节点作为从节点,默认随机一个主节点
                 --cluster-master-id <arg>                      #给新节点指定主节点
  del-node       host:port node_id                              #删除给定的一个节点,成功后关闭该节点服务
  call           host:port command arg arg .. arg               #在集群的所有节点执行相关命令
  set-timeout    host:port milliseconds                         #设置cluster-node-timeout
  import         host:port                                      #将外部redis数据导入集群
                 --cluster-from <arg>                           #将指定实例的数据导入到集群
                 --cluster-copy                                 #migrate时指定copy
                 --cluster-replace                              #migrate时指定replace
  help 
View Code

 

以上是关于redis集群的主要内容,如果未能解决你的问题,请参考以下文章

java怎么从多台redis集群取数据库

我在工作中遇到的redis集群使用

redis集群概念

python连接redis,redis集群

Python3 redis集群连接 (带密码验证)

c#程序怎么调用redis集群