/// <summary> /// 获取分区id号 分区id号,规则1+数据节点编号+表分区编号 /// </summary> /// <param name="info"></param> /// <returns></returns> public static int GetPartitionID(PartitionIDInfo info) { //PartitionIDInfo info = new PartitionIDInfo();string example = "10101";string strid = id.ToString(); string id = "1" + PartitionNameRule(info.DataNodePartition) + PartitionNameRule(info.TablePartition); return(Convert.ToInt32(id)); }
private void CheckIfScanNewTable(tb_consumer_partition_model partition, MQIDInfo mqidinfo, string datanodeconnectstring, PartitionIDInfo partionidinfo) { var serverdate = Context.ManageServerTime.AddSeconds(-1);//此处延迟1秒,停顿消费者日分区表之间的切换 if (serverdate != null && serverdate.Date > mqidinfo.Day.Date)//服务器时间和消息时间对应不上 { SqlHelper.ExcuteSql(datanodeconnectstring, (c) => { DateTime t = mqidinfo.Day.Date.AddDays(1); while (serverdate.Date >= t)//查找最后的可用消息表,然后跳出 { string tablename = PartitionRuleHelper.GetTableName(partionidinfo.TablePartition, t); if (exsittablenames.ContainsKey(tablename) || c.TableIsExist(tablename)) { AddExsitTableNameCache(tablename); _lastpullququeiddic[partition.partitionid] = PartitionRuleHelper.GetMQID(new MQIDInfo() { AutoID = 0, DataNodePartition = mqidinfo.DataNodePartition, TablePartition = mqidinfo.TablePartition, Day = t });//重设第二天最小的id break; } t = t.AddDays(1); } }); } }
/// <summary> /// 获取分区id号隐藏的信息 /// </summary> /// <param name="id"></param> /// <returns></returns> public static PartitionIDInfo GetPartitionIDInfo(int id) { PartitionIDInfo info = new PartitionIDInfo(); string example = "10101"; string strid = id.ToString(); if (strid.Length != example.Length) { throw new Exception("分区Id格式不正确:" + id); } info.DataNodePartition = Convert.ToInt32(strid.Substring(1, 2)); info.TablePartition = Convert.ToInt32(strid.Substring(3, 2)); return(info); }
private List<tb_messagequeue_model> GetMessagesOfPatition(tb_consumer_partition_model partition, long scanlastmqid, MQIDInfo mqidinfo, string datanodeconnectstring, PartitionIDInfo partionidinfo) { //从数据库取数据,检查数据时间,和数据状态,无问题则插入队列,并修改上一次扫描的mqid List<tb_messagequeue_model> messages = new List<tb_messagequeue_model>(); SqlHelper.ExcuteSql(datanodeconnectstring, (c) => { string tablename = PartitionRuleHelper.GetTableName(partionidinfo.TablePartition, mqidinfo.Day); if (exsittablenames.ContainsKey(tablename) || c.TableIsExist(tablename)) { AddExsitTableNameCache(tablename); tb_messagequeue_dal dal = new tb_messagequeue_dal(); dal.TableName = tablename; messages = dal.GetMessages(c, scanlastmqid, SystemParamConfig.Consumer_ReceiveMessageQuque_EVERY_PULL_COUNT); } }); return messages; }
private long StartMoveMQID(string fromtablename, PartitionIDInfo info, Dictionary<int, tb_datanode_model> datanodemodels, tb_partition_model p, DateTime tabletime) { long r = -1; SqlHelper.ExcuteSql(this.GetDataNodeConnectString(datanodemodels[info.DataNodePartition]), (c) => { bool exsit = c.TableIsExist(fromtablename); if (exsit == true) { tb_messagequeue_dal dal = new tb_messagequeue_dal(); dal.TableName = fromtablename; long maxid = dal.GetMaxID(c); long minid = dal.GetMinID(c); int findcount = 0; while (findcount<=30)//二分查找算法,超过30次意味着算法若对,查询过一亿的数据,说明算法有问题 { findcount++; KeyValuePair<long, DateTime> mininfo = dal.GetIDCreateTime(c, minid); KeyValuePair<long, DateTime> maxinfo = dal.GetIDCreateTime(c, maxid); if (mininfo.Value.Date <= tabletime.Date && maxinfo.Value.Date > tabletime.Date)//最小id小于等于当天,最大id>当天,说明中间有数据要迁移 { var midid = (long)((maxinfo.Key + mininfo.Key) / 2); KeyValuePair<long, DateTime> midinfo = dal.GetIDCreateTime(c, midid); if (midinfo.Value.Date <= tabletime.Date)//往大的查找 { minid = midid; } else//往小的查找 { maxid = minid; } System.Threading.Thread.Sleep(50);//避免给数据库大的压力 } else if (mininfo.Value.Date > tabletime.Date)//最小id的时间超过表当天 { r = mininfo.Key; return; } else if (maxinfo.Value.Date <= tabletime.Date)//最大id的时间小于或等同当天 { r = maxinfo.Key; return; } } if (findcount >= 30) throw new Exception("二分查找算法错误,查找次数超过30次"); } }); return r; }
/// <summary> /// 获取分区id号隐藏的信息 /// </summary> /// <param name="id"></param> /// <returns></returns> public static PartitionIDInfo GetPartitionIDInfo(int id) { PartitionIDInfo info = new PartitionIDInfo(); string example = "10101"; string strid = id.ToString(); if(strid.Length!=example.Length) throw new Exception("分区Id格式不正确:"+id); info.DataNodePartition = Convert.ToInt32(strid.Substring(1, 2)); info.TablePartition = Convert.ToInt32(strid.Substring(3, 2)); return info; }
/// <summary> /// 获取分区id号 分区id号,规则1+数据节点编号+表分区编号 /// </summary> /// <param name="info"></param> /// <returns></returns> public static int GetPartitionID(PartitionIDInfo info) { //PartitionIDInfo info = new PartitionIDInfo();string example = "10101";string strid = id.ToString(); string id = "1" + PartitionNameRule(info.DataNodePartition) + PartitionNameRule(info.TablePartition ); return Convert.ToInt32(id); }