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时会自动切换
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。
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
世界最优美的情书