來源:Lu-Yu 發(fā)布時(shí)間:2018-11-03 16:43:20 閱讀量:880
分庫分表
分庫分表也稱作分片技術(shù),主要作用是將存放在一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)按照特定的方法進(jìn)行拆分,分散存放在多個(gè)數(shù)據(jù)庫中,以達(dá)到分散多臺(tái)設(shè)備實(shí)現(xiàn)負(fù)載均衡
垂直分割
縱向切分,把一個(gè)表的表結(jié)構(gòu)拆分開來,形成多個(gè)表
實(shí)質(zhì)上就是把一個(gè)表的表結(jié)構(gòu)中的多個(gè)字段拆成多個(gè)組合,每個(gè)組合都自成一個(gè)表
水平分割
橫向切分,把一個(gè)表的表記錄切分成多個(gè)表
實(shí)質(zhì)上吧一個(gè)表中的數(shù)據(jù)拆成多個(gè)模塊,而表結(jié)構(gòu)沒有變化。
Mycat
mycat是基于java的分布式數(shù)據(jù)庫系統(tǒng),為高并發(fā)環(huán)境的分布式訪問提供解決方案
工作流程
Mycat有很多算法,每個(gè)算法都有專屬的標(biāo)識(shí)字段,根據(jù)這些字段,mycat可以找到數(shù)據(jù)具體存儲(chǔ)的位置。
搭建mycat服務(wù)器
1. 裝包
1.1 安裝jdk,也就是java相關(guān)的軟件包
1.2 安裝 mycat-server 服務(wù)軟件包
2. 配置
修改配置文件server.xml
<user name="用戶名">
<property name="password">密碼</property>
<property name="schemas">邏輯庫名(用戶看到的庫名)</property>
<property name="readOnly">true(只讀權(quán)限設(shè)定,不寫這一行默認(rèn)為讀寫權(quán)限)</property>
</user>
配置文件schema.xml
<table name="travelrecord" dataNode="dn1,dn2(結(jié)點(diǎn)名,根據(jù)自己的數(shù)據(jù)庫個(gè)數(shù)決定)" rule="auto-sharding-long" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2(這兩行也是根據(jù)數(shù)據(jù)庫個(gè)數(shù)決定)" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- 指定數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)庫名,以及這個(gè)數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的庫名 -->
<dataNode name="dn1(結(jié)點(diǎn)名)" dataHost="localhost1(數(shù)據(jù)庫名)" database="db1" />
<!-- 給每個(gè)數(shù)據(jù)庫指定相應(yīng)的信息 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="數(shù)據(jù)庫服務(wù)器IP:端口號(hào)(3306)" user="連接使用的用戶名"
password="密碼">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
3. 對(duì)數(shù)據(jù)庫服務(wù)器進(jìn)行相關(guān)操作
sed -i '/lower_case_table_names/d' /etc/my.cnf
sed -i '/\[mysqld\]/alower_case_table_names = 1' /etc/my.cnf
systemctl restart mysqld
4. 啟動(dòng)服務(wù)
mycat start
netstat -ntlup | grep :8066
注意:
1. 客戶端連接的時(shí)候,發(fā)現(xiàn)有很多空表,這些都是要自己修改創(chuàng)建的
2. 不過創(chuàng)建的時(shí)候,需要根據(jù)數(shù)據(jù)庫的具體算法進(jìn)行,創(chuàng)建算法要求的字段(列)
系統(tǒng)優(yōu)化
設(shè)置最大并發(fā)數(shù)
# 查看設(shè)定的最大并發(fā)數(shù):
show variables like 'max_connections';
# 修改最大并發(fā)數(shù)
set max_connections=值;
# 查看歷史訪問最大并發(fā)數(shù):
show global status like 'max_used_connections';
設(shè)置的最優(yōu)值:
max_connections = max_used_connections / 0.85
設(shè)定的最大并發(fā)值 = 歷史最大并發(fā)數(shù) / 0.85
查看連接的詳細(xì)信息:
show processlist;
連接超時(shí)(單位秒)
connect_timeout 等待連接超時(shí),當(dāng)用戶在TCP三次握手連接的時(shí)候相應(yīng)時(shí)間太久就會(huì)自動(dòng)登出,一般時(shí)間不宜太高,默認(rèn)10s
wait_timeout 等待關(guān)閉連接不活動(dòng)超時(shí),當(dāng)從最后一次SQL語句操作開始計(jì)時(shí),到下一個(gè)SQL語句間隔時(shí)間,過長久斷開,不過為了讓SQL語句能完整的執(zhí)行完,不宜太短,默認(rèn)8小時(shí)
緩存控制(單位字節(jié))
key_buffer_size 用于MyISAM引擎的關(guān)鍵索引緩存大小
show global status like 'key_read%'; 如果查出來的值較低的時(shí)候提高這個(gè)緩存值
sort_buffer_size 為每個(gè)排序的線程分配此大小的緩存空間
提高此值可以提高order的group的執(zhí)行速度
read_buffer_size 為排序讀取表記錄保留的緩存大小
影響SQL查詢的相應(yīng)速度,此值越大查詢?cè)娇?/span>
tread_buffer_size 允許保存在緩存中的被重用的線程數(shù)量
show gloabal status like 'threads_%'; 查看線程狀態(tài),以這個(gè)值的常值為線程數(shù)最優(yōu)
table_open_cache 為所有線程緩存的打開的表的數(shù)量
show global status like 'open%tables'; 查看已經(jīng)打開的表,是理想比例<=95%
優(yōu)化查詢緩存設(shè)置
show variables like 'query_cache%';
query_cache_limit 緩存最大存儲(chǔ)限制
query_cache_min_res_unit 緩存最小存儲(chǔ)單元
query_cache_wlock_invalidate 是否開啟寫鎖,如果開啟,當(dāng)數(shù)據(jù)修改,就會(huì)自動(dòng)把緩存中的數(shù)據(jù)刪除,下次用戶查看的時(shí)候就是到磁盤中找
優(yōu)化后作用表現(xiàn)(命中情況越高說明優(yōu)化的越好)
show global status like 'qcache%';
Qcache_hits 查詢緩存中的命中情況
Qcache_inserts 查詢請(qǐng)求總數(shù)
優(yōu)化思路
1. 查看硬件使用情況(cpu 內(nèi)存 存儲(chǔ)空間)
2. 查看網(wǎng)絡(luò)接口流量
3. 查看數(shù)據(jù)庫服務(wù)運(yùn)行時(shí),參數(shù)配置
show variables;
show global status;
并發(fā)連接數(shù)量 超時(shí)時(shí)間 重復(fù)使用的線程數(shù)量
多個(gè)線程同時(shí)打開表的數(shù)量
查詢緩存配置 索引緩存
處理不同查詢方式mysql存儲(chǔ)使用緩存設(shè)置
錯(cuò)誤日志
默認(rèn)已經(jīng)開啟,記錄數(shù)據(jù)庫所有錯(cuò)誤信息
查詢?nèi)罩?/span>
記錄mysql數(shù)據(jù)庫中所有執(zhí)行的命令
啟動(dòng)查詢?nèi)罩?,修改配置文?etc/my.cnf
sed -i '/\[mysqld\]/ageneral_log' /etc/my.cnf
不修改存儲(chǔ)位置,默認(rèn)存在 /var/lib/myql/主機(jī)名.log 文件內(nèi)
如果需要修改查詢?nèi)罩镜奈恢?/span>
sed -i '/\[mysqld\]/ageneral_log_file=存儲(chǔ)位置' /etc/my.cnf
慢查詢?nèi)罩?/span>
記錄耗時(shí)較長或不使用索引的查詢操作
啟動(dòng)慢查詢?nèi)罩?,修改配置文?etc/my.cnf
sed -i '/\[mysqld\]/alog-queries-not-using-indexes' /etc/my.cnf
sed -i '/\[mysqld\]/aslow-query-log' /etc/my.cnf
默認(rèn)存儲(chǔ)在 /var/lib/myql/主機(jī)名-slow.log
如果想修改存儲(chǔ)位置
sed -i '/\[mysqld\]/aslow-query-log-file=存儲(chǔ)位置' /etc/my.cnf
默認(rèn)統(tǒng)計(jì)的是查詢時(shí)間超過 10s的查詢記錄,如果想修改,命令如下
sed -i '/\[mysqld\]/along-query-time=數(shù)字' /etc/my.cnf
統(tǒng)計(jì)查看慢查詢?nèi)罩居涗浀膕ql命令
mysqldumpslow /var/lib/mysql/mysql51-slow.log
---------------------
作者:Lu-Yu
來源:CSDN
原文:https://blog.csdn.net/Yu1543376365/article/details/83450821
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信