十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
当分片索引不是纯整型的字符串时,只接受整型的内置 hash 算法是无法使用的。为此,stringhash 按照用户定义的起点和终点去截取分片索引字段中的部分字符,根据当中每个字符的二进制 unicode 值换算出一个长整型数值,然后就直接调用内置 hash 算法求解分片路由:先求模得到逻辑分片号,再根据逻辑分片号直接映射到物理分片。
创新互联-专业网站定制、快速模板网站建设、高性价比红旗网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式红旗网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖红旗地区。费用合理售后完善,10年实体公司更值得信赖。
用户需要在 rule.xml 中定义 partitionLength[] 和 partitionCount[] 两个数组和 hashSlice 二元组。
在 DBLE 的启动阶段,点乘两个数组得到模数,也是逻辑分片的数量
并且根据两个数组的叉乘,得到各个逻辑分片到物理分片的映射表(物理分片数量由 partitionCount[] 数组的元素值之和)
此外根据 hashSlice 二元组,约定把分片索引值中的第 4 字符到第 5 字符(字符串以 0 开始编号,编号 3 到编号 4 等于第 4 字符到第 5 字符)字符串用于 “字符串-整型”的转换
在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值会被提取出来,取当中的第 4 个字符到第 5 字符,送入下一步
设置一个初始值为 0 的累计值,逐个取字符,把累计值乘以 31,再把这个字符的 unicode 值当成长整型加入到累计值中,如此类推直至处理完截取出来的所有字符,此时的累计值就能够代表用户的分片索引值,完成了 “字符串-整型” 的转换
对上一步的累计值进行求模,得到逻辑分片号
再根据逻辑分片号,查映射表,直接得到物理分片号
与MyCat的类似分片算法对比
请点击输入图片描述
两种算法在string转化为int之后,和 hash 分区算法相同,区别也继承了 hash 算法的区别。
开发注意点
【分片索引】1. 必须是字符串
【分片索引】2. 最大物理分片配置方法是,让 partitionCount[] 数组和等于 2880
例如:
property name="partitionLength"1/propertyproperty name="partitionCount"2880/property
或
property name="partitionLength"1,1/propertyproperty name="partitionCount"1440,1440/property
【分片索引】3. 最小物理分片配置方法是,让 partitionCount[] 数组和等于 1
例如
property name="partitionLength"2880/propertyproperty name="partitionCount"1/property
【分片索引】4. partitionLength 和 partitionCount 被当做两个逗号分隔的一维数组,它们之间的点乘必须在 [1, 2880] 范围内
【分片索引】5. partitionLength 和 partitionCount 的配置对顺序敏感
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
和
property name="partitionLength"256,512/propertyproperty name="partitionCount"2,1/property
是不同的分片结果
【分片索引】6. 分片索引字段长度小于用户指定的截取长度时,截取长度会安全减少到符合分片索引字段长度
【数据分布】1. 分片索引字段截取越长则越有利于数据均匀分布
【数据分布】2. 分片索引字段的内容重复率越低则越有利于数据均匀分布
运维注意点
【扩容】1. 预先过量分片,并且不改变 partitionCount 和 partitionLength 点乘结果,也不改变截取设置 hashSlice 时,可以避免数据再平衡,只需进行涉及数据的迁移
【扩容】2. 若需要改变 partitionCount 和 partitionLength 点乘结果或改变截取设置 hashSlice 时,需要数据再平衡
【缩容】1. 预先过量分片,并且不改变 partitionCount 和 partitionLength 点乘结果,也不改变截取设置 hashSlice 时,可以避免数据再平衡,只需进行涉及数据的迁移
【缩容】2. 若需要改变 partitionCount 和 partitionLength 点乘结果或改变截取设置 hashSlice 时,需要数据再平衡
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为 property name="partitionLength" 、property name="partitionCount" 和 property name="hashSlice"
【配置项】2.在 rule.xml 中配置 property name="partitionLength" 标签
内容形式为:物理分片持有的虚拟分片数[,物理分片持有的虚拟分片数,...物理分片持有的虚拟分片数]
物理分片持有的虚拟分片数必须是整型,物理分片持有的虚拟分片数从左到右与同顺序的物理分片数对应,partitionLength 和partitionCount 的点乘结果必须在 [1, 2880] 范围内
【配置项】3. 在 rule.xml 中配置 property name="partitionCount" 标签内容形式为:物理分片数[,物理分片数,...物理分片数]
其中物理分片数必须是整型,物理分片数按从左到右的顺序与同顺序的物理分片持有的虚拟分片数对应,物理分片的编号从左到右连续递进,partitionLength 和 partitionCount 的点乘结果必须在 [1, 2880] 范围内
【配置项】4. partitionLength 和 partitionCount 的语义是:持有partitionLength[i] 个虚拟分片的物理分片有 partitionCount[i] 个
例如
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
语义是持有 512 个逻辑分片的物理分片有 1 个,紧随其后,持有 256 个逻辑分片的物理分片有 2 个
【配置项】5.partitionLength 和 partitionCount 都对书写顺序敏感,
例如
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
分片结果是第一个物理分片持有头512个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后256个逻辑分片,相对的
property name="partitionLength"256,512/propertyproperty name="partitionCount"2,1/property
分片结果则是第一个物理分片持有头 256 个逻辑分片,第二个物理分片持有紧接着的 256 个逻辑分片,第三个物理分片持有最后 512 个逻辑分片
【配置项】6.partitionLength[] 的元素全部为 1 时,这时候partitionCount 数组和等于 partitionLength 和 partitionCount 的点乘,物理分片和逻辑分片就会一一对应,该分片算法等效于直接取余
【配置项】7.在 rule.xml 中配置标签,从分片索引字段的第几个字符开始截取到第几个字符:
若希望从首字符开始截取 k 个字符( k 为正整数),配置的内容形式可以为“ 0 : k ”、“ k ”或“ : k ”;
若希望从末字符开始截取 k 个字符( k 为正整数),则配置的内容形式可以为“ -k : 0 ”、“ -k ”或“ -k : ”;
若希望从头第 m 个字符起算截取 n 个字符( m 和 n 都是正整数),则先计算出 i = m - 1 和 j = i + n - 1,配置的内容形式为“ i : j ”;
若希望从尾第 m 个字符起算截取从尾算起的 n 个字符( m 和 n 都是正整数),则先计算出 i = -m + n - 1,配置的内容形式可以为“ -m : i ”;
若希望不截取,则配置的内容形式可以为“ 0 : 0 ”、“ 0 : ”、“ : 0 ”或 “ : ”
直接在最外层分页就好了
SELECT
COUNT(1) AS NO,
base_id,
ycpersonal_id,
yc_cert_id,
ouid,
udepartmentID,
de_name,
cert_level,
cert_level_name,
cert_profession,
cert_profession_name,
cert_binding,
cert_binding_name,
three_classes,
three_classes_name
FROM
(
SELECT
cb.id AS base_id,
ct.id AS ycpersonal_id,
ce.id AS yc_cert_id,
cb.ouid,
cb.udepartmentID,
de.name AS de_name,
ce.cert_level,
gc.name AS cert_level_name,
ce.cert_profession,
gp.name AS cert_profession_name,
ce.cert_binding,
gb.name AS cert_binding_name,
ct.three_classes,
ge.name AS three_classes_name
FROM
`my_conm_base` AS cb
LEFT JOIN my_conm_ycpersonnel AS ct
ON cb.id = ct.conmid
LEFT JOIN my_conm_ycpersonnel_cert AS ce
ON ce.personnelid = ct.id
LEFT JOIN my_category AS gc
ON gc.id = ce.cert_level
LEFT JOIN my_category AS gp
ON gp.id = ce.cert_profession
LEFT JOIN my_category AS gb
ON gb.id = ce.cert_binding
LEFT JOIN my_category AS ge
ON ge.id = ct.three_classes
LEFT JOIN my_department AS de
ON de.id = cb.udepartmentID
WHERE cb.state 18
AND cb.udepartmentid IN (10001)
AND cb.stype = 961
AND ce.id 0
GROUP BY ce.personnelid
ORDER BY cb.id,
ce.cert_level DESC
) AS LIST
GROUP BY cert_level,
cert_profession,
cert_binding,
three_classes
ORDER BY cert_level limit 0,10
openfire设置的配置文件路径为:../openfire/conf/openfire.xml。打开xml文件发现安装设置完成后setup的值为true,setuptrue/setup。首先关闭openfire服务器,然后删除setup属性,然后重新启动Openfire并重新装入设置工具。