2) 路由计算算法
crc32/md5/基于字符串的各类hash算法
3) 路由信息格式
CREATETABLE `Mysql_shard_info` (
`appid` int(32) NOT NULL,
`begin` int(32) NOT NULL,
`end` int(32) NOT NULL,
`ip` varchar(20) NOT NULL DEFAULT '',
`port` int(11) NOT NULL DEFAULT '0',
`user` varchar(50) NOT NULL DEFAULT '',
`pwd` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`appid`,`begin`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据迁移:
STEP1:利用MySQL主备复制机制进行数据复制
STEP2:数据差异小于某一临界值,停止老分片写操作(read-only)
STEP3:等待新分片数据更新完毕
STEP4:更路由规则路由规则,Cluster Manager向所有access proxy更新路由信息
STEP5:删除老分片
自动扩展:
过程类似于数据迁移
六、Redis集群方案
1、异构读写分离-MySQL写,Redis读
1) 数据写操作在MySQL,读操作在Redis
2) 数据通过Sync系统对binlog进行解析从Mysql同步到Redis
3) 数据有同步延迟(小于100ms),实现最终一致性
适用场景:要求数据高可靠,且读量比较大,允许读数据短时间不一致,若期望一直读到最新数据,请使用get_with_version()接口从MySQL读取
2、独立的Redis集群服务
1)读写均在Redis,提供独立的KV存储服务
2) 用户不用关注扩容/缩容/故障恢复等问题
3) 集群内多业务混存,提高内存的使用率
适用场景:独立的Redis集群服务,类似twenproxy/codis
1、一致性hash
支持数据跨Redis实例拆分,固定Slot数进行拆分
2、单机多实例部署
1)每个物理机支持多Redis实例
2)每个Redis实例只服务单个业务
3)Redis实例内存大小取决于业务需求,同时考虑业务访问量和数据量
以RedisIP+port标示唯一实例,对于128G内存机器,
可配置3 Redis实例*每实例30G
或10 Redis实例*每实例10G
或20 Redis实例*每实例5G
拆分原则:单实例最大内存使用 < 本机剩余内存
3、以Slot为单位的平滑扩容/缩容
4、以Redis实例为单位的failover处理
主要步骤如下:
STEP1:确认扩容/缩容
Cluster manager通过对系统负载和数据量进行告警,进而确认进行扩容或者缩容
STEP2:修改路由表
1)修改路由表,将对应shard的状态修改为migrate状态,并将新路由推送到所有接入层
2)acc proxy会将写操作转到新的Redis实例中,读操作默认先读新Redis实例,key不存在会继续从老的Redis实例中读取
STEP3:数据迁移
1)Cluster manager通过自动数据迁移工具开始数据迁移,计划依赖Redis的scan命令将相关的key扫出来,通过MIGRATE进行数据迁移
2)多次扫描执行该过程,确认Slot中所有数据迁移完成
STEP4:修改路由表,迁移完成
Cluster manager将读写均切到新Redis实例,不再从老Redis中进行操作
来源: