分庫分表帶來的問題及解決方案


一.理解分庫分表的意義

1.什么情況下不分表

阿里巴巴java開發手冊嵩山版p14

 1.1、能不分就別分

 1.2、長期規划(3~5年)

二.什么情況下分表

2.1數據庫性能瓶頸的出現:連接、速度、存儲

2.2數據庫優化的層次

1、SQL與索引(合格的sql和索引)
2、表與存儲引擎(表選擇正確的存儲引擎)
3、數據庫與應用架構(應用設計是否合理,是否利用了redis等緩存等)
4、數據庫與操作系統配置
5、硬件
6、分庫分表

三.分庫分表的類型和特點

3.1水平切分

3.2垂直切分

 四.分庫分表帶來的問題

4.1、跨庫關聯查詢
4.2、分布式事務
4.3、排序、翻頁、函數計算
4.4、全局主鍵

五.多數據源(動態數據源)的解決方案(datasource)

六全局id問題

server.xml中配置

0、文件方式1、數據庫方式2、本地時間戳3、ZK方式 4.uuid 5雪花算法

<property name="sequnceHandlerType">0</property>

使用本地方式作為數據庫自增: 需設置 sequence_conf.properties配置文件

SCHEMATABLE.HISIDS=
SCHEMATABLE.MINID=1001
SCHEMATABLE.MAXID=100000000 最大值
SCHEMATABLE.CURID=1000 當前數據庫的索引值
<property name="sequnceHandlerType">1</property>

使用的是本地數據庫的方式,需要在一個分節點創建表和存儲過程,其中MYCAT_SEQUENCE必須為大寫

>CREATE TABLE MYCAT_SEQUENCE (
`name` VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
remark varchar(100),  -- remark 並不是必須的,在這里我是為了讓每一個表都對應一個全局的自增,在Remark中配置自增項對應的表名。方便后期維護
PRIMARY KEY(name)) ENGINE=InnoDB;
<br>-- – 獲取當前sequence的值(返回當前值,增量)
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval ;
END
;;
DELIMITER ;
 
-- 設置sequence值
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
-- 獲取下一個sequence值
DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;

配置sequence_db_conf.properties ,加入Schemazhon中的table

<property name="sequnceHandlerType">2</property>

自動生成64為的時間戳,故設計主鍵是,要考慮其長度

日志:

1、wrapper.log2、mycat.log

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM