成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

基于代理的數(shù)據(jù)庫(kù)分庫(kù)分表框架 Mycat實(shí)踐

el09xccxy / 1227人閱讀

摘要:文章共字,閱讀大約需要分鐘概述在如今海量數(shù)據(jù)充斥的互聯(lián)網(wǎng)環(huán)境下,分庫(kù)分表的意義我想在此處就不用贅述了。

文章共 1796字,閱讀大約需要 4分鐘 !

概 述

在如今海量數(shù)據(jù)充斥的互聯(lián)網(wǎng)環(huán)境下,分庫(kù)分表的意義我想在此處就不用贅述了。而分庫(kù)分表目前流行的方案最起碼有兩種:

方案一:基于應(yīng)用層的分片,即應(yīng)用層代碼直接完成分片邏輯

方案二:基于代理層的分片,即在應(yīng)用代碼和底層數(shù)據(jù)庫(kù)中間添加一層代理層,而分片的路由規(guī)則則由代理層來(lái)進(jìn)行處理

而本文即將要實(shí)驗(yàn)的 MyCAT框架就屬于第二種方案的代表作品。

注: 本文首發(fā)于  My Personal Blog:CodeSheep·程序羊,歡迎光臨 小站

環(huán)境規(guī)劃

在本文中,我拿出了三臺(tái) Linux主機(jī)投入試驗(yàn),各節(jié)點(diǎn)的角色分配如下表所示:

節(jié)點(diǎn) 部署組件 角色
192.168.199.75 MySQL 、 MyCAT master
192.168.199.74 MySQL slave
192.168.199.76 MySQL standby master

如果說(shuō)上面這張表不足以說(shuō)明實(shí)驗(yàn)?zāi)P?,那接下?lái)再給一張圖好了,如下所示:

我想這樣看來(lái)的話,各個(gè)節(jié)點(diǎn)布了哪些組件,節(jié)點(diǎn)間的角色關(guān)系應(yīng)該一目了然了吧

實(shí)驗(yàn)環(huán)境規(guī)劃好了以后,接下來(lái)進(jìn)行具體的部署與實(shí)驗(yàn)過(guò)程,首先當(dāng)然是 MyCAT代理的部署

MyCAT 部署

關(guān)于該部分,網(wǎng)上教程實(shí)在太多了,但最好還是參考官方文檔來(lái)吧,下面也簡(jiǎn)述一下部署過(guò)程

下載 MyCAT并解壓安裝

這里安裝的是 MyCAT 1.5

wget https://raw.githubusercontent.com/MyCATApache/Mycat-download/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
tar -zxvf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
mv mycat /usr/local/

啟動(dòng) MyCAT

./mycat start

MyCAT連接測(cè)試

mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB


MyCAT 配置

官網(wǎng)上對(duì)于這一部分的描述是非常詳細(xì)的,MyCAT 配置主要涉及三個(gè) XML配置文件:

server.xml:MyCAT框架的系統(tǒng)參數(shù)/用戶參數(shù)配置文件

schema.xml: MyCAT框架的邏輯庫(kù)表與分片的配置文件

rule.xml :MyCAT框架的邏輯庫(kù)表分片規(guī)則的配置文件

用如下圖形可以形象地表示出這三個(gè) XML配置文件的配置內(nèi)容和相互關(guān)系:

下面來(lái)進(jìn)入具體的實(shí)驗(yàn)環(huán)節(jié) ,這也是圍繞 MyCAT提供的幾大主要功能展開(kāi)的,主要涉及三個(gè)方面

分庫(kù)分表

讀寫分離

主備切換

實(shí)驗(yàn)之前,我們先給出公共的 server.xml文件的配置,這部分后續(xù)實(shí)驗(yàn)過(guò)程中并不修改,其也就是定義了系統(tǒng)參數(shù)和用戶參數(shù):




    
    druidparser
      
    
    
        test
        TESTDB
    

    
        user
        TESTDB
        true
    


分庫(kù)分表實(shí)驗(yàn)
預(yù)期實(shí)驗(yàn)效果:通過(guò) MyCAT代理往一張邏輯表中插入的多條數(shù)據(jù),在后端自動(dòng)地分配在不同的物理數(shù)據(jù)庫(kù)表上

我們按照本文 第二節(jié)【環(huán)境規(guī)劃】中給出的實(shí)驗(yàn)?zāi)P蛨D來(lái)給出如下的 MyCAT邏輯庫(kù)配置文件 `
schema.xml 和 分庫(kù)分表規(guī)則配置文件 rule.xml`

準(zhǔn)備配置文件

schema.xml





    
        
    
    
    
        select user()
        
                
        
        
        
    


其中定義了實(shí)驗(yàn)用到的 hostM1、hostS1 和 hostM2

rule.xml

    
        
            create_date
            partbymonth
        
    

    
        yyyy-MM-dd
        2018-11-01
    
這里配置了 sharding-by-month的分庫(kù)分表規(guī)則,即按照表中的 create_date字段進(jìn)行分割,從 2018-11-01日期開(kāi)始,月份不同的數(shù)據(jù)落到不同的物理數(shù)據(jù)庫(kù)表中

在三個(gè)物理節(jié)點(diǎn)數(shù)據(jù)庫(kù)上分別創(chuàng)建兩個(gè)庫(kù) db1和 db2

create database db1;
create database db2;

連接 MyCAT

mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB

通過(guò) MyCAT來(lái)創(chuàng)建數(shù)據(jù)庫(kù) travelrecord

create table travelrecord (id bigint not null primary key,city varchar(100),create_date DATE);

通過(guò) MyCAT來(lái)往travelrecord表中插入兩條數(shù)據(jù)

insert into travelrecord(id,city,create_date)  values(1,"NanJing","2018-11-3");
insert into travelrecord(id,city,create_date)  values(2,"BeiJing","2018-12-3");

由于插入的這兩條記錄的 create_date分別是 2018-11-32018-12-3,而我們配的分庫(kù)分表的規(guī)則即是根據(jù) 2018-11-01這個(gè)日期為起始來(lái)進(jìn)行遞增的,按照前面我們配的分片規(guī)則,理論上這兩條記錄按照 create_date日期字段的不同,應(yīng)該分別插入到 hostM1的 db1和 db2兩個(gè)不同的數(shù)據(jù)庫(kù)中。

驗(yàn)證一下數(shù)據(jù)分片的效果

由于 hostM1hostS1組成了 主-從庫(kù) 關(guān)系,因此剛插入的兩條數(shù)據(jù)也應(yīng)該相應(yīng)自動(dòng)同步到 hostS1db1db2兩個(gè)數(shù)據(jù)庫(kù)中,不妨也來(lái)驗(yàn)證一下:


讀寫分離實(shí)驗(yàn)
預(yù)期實(shí)驗(yàn)效果:開(kāi)啟了 MyCAT的讀寫分離機(jī)制后,讀寫數(shù)據(jù)操作各行其道,互不干擾

此節(jié)實(shí)驗(yàn)用到的配置文件 schema.xmlrule.xml基本和上面的【分庫(kù)分表】實(shí)驗(yàn)沒(méi)什么不同,只是我們需要關(guān)注一下 schema.xml配置文件中 標(biāo)簽里的 balance字段,它是與讀寫分離息息相關(guān)的配置:

因此我們就需要弄清楚 標(biāo)簽中 balance參數(shù)的含義:

balance="0":不開(kāi)啟讀寫分離機(jī)制,即讀請(qǐng)求僅分發(fā)到 writeHost上

balance="1":讀請(qǐng)求隨機(jī)分發(fā)到當(dāng)前 writeHost對(duì)應(yīng)的 readHost和 standby writeHost上

balance="2":讀請(qǐng)求隨機(jī)分發(fā)到當(dāng)前 dataHost內(nèi)所有的 writeHost / readHost上

balance="3":讀請(qǐng)求隨機(jī)分發(fā)到當(dāng)前 writeHost對(duì)應(yīng)的 readHost上

我們驗(yàn)證一下 balance="1"的情況,即開(kāi)啟讀寫分離機(jī)制,且讀請(qǐng)求隨機(jī)分發(fā)到當(dāng)前 writeHost對(duì)應(yīng)的 readHost和 standby writeHost上,而對(duì)于本文來(lái)講,也即:hostS1 和 hostM2 上

我們來(lái)做兩次數(shù)據(jù)表的 SELECT讀操作:

mysql> select * from travelrecord limit 6;
+----+----------+-------------+
| id | city     | create_date |
+----+----------+-------------+
|  3 | TianJing | 2018-11-04  |
|  5 | ShenYang | 2018-11-05  |
|  4 | Wuhan    | 2018-12-04  |
|  6 | Harbin   | 2018-12-05  |
+----+----------+-------------+
4 rows in set (0.08 sec)

mysql> select * from travelrecord limit 6;
+----+---------+-------------+
| id | city    | create_date |
+----+---------+-------------+
|  2 | BeiJing | 2018-12-03  |
|  8 | WuXi    | 2018-12-06  |
|  1 | NanJing | 2018-11-03  |
|  7 | SuZhou  | 2018-11-06  |
+----+---------+-------------+
4 rows in set (0.01 sec)

然后我們?nèi)〕?mycat.log日志查看一下具體詳情,我們發(fā)現(xiàn)第一次 select讀操作分發(fā)到了 hostM2上:

而第二次 select讀操作分發(fā)到了 hostS1上:


主備切換實(shí)驗(yàn)
預(yù)期實(shí)驗(yàn)效果:開(kāi)啟 MyCAT的主備機(jī)制后,當(dāng)主庫(kù)宕機(jī)時(shí),自動(dòng)切換到備用機(jī)進(jìn)行操作

關(guān)于主備切換,則需要弄清楚 標(biāo)簽中 switchType參數(shù)的含義:

switchType="-1":不自動(dòng)切換主備數(shù)據(jù)庫(kù)

switchType="1":自動(dòng)切換主備數(shù)據(jù)庫(kù)

switchType="2":基于MySQL主從復(fù)制的狀態(tài)來(lái)決定是否切換,需修改heartbeat語(yǔ)句:show slave status

switchType="3":基于Galera(集群多節(jié)點(diǎn)復(fù)制)的切換機(jī)制,需修改heartbeat語(yǔ)句:show status like "wsrep%"

此處驗(yàn)證一下 Mycat的主備自動(dòng)切換效果。為此首先我們將 switchType="-1" 設(shè)置為 switchType="1",并重啟 MyCat服務(wù):

在本實(shí)驗(yàn)環(huán)境中,在 hostM1hostM2均正常時(shí),默認(rèn)寫數(shù)據(jù)時(shí)是寫到 hostM1

接下來(lái)手動(dòng)停止 hostM1 上的 MySQL數(shù)據(jù)庫(kù)來(lái)模擬 hostM1 宕機(jī):

systemctl stop mysqld.service

接下來(lái)再通過(guò) MyCat插入如下兩條數(shù)據(jù):

insert into travelrecord(id,city,create_date)  values(3,"TianJing","2018-11-4");
insert into travelrecord(id,city,create_date)  values(4,"Wuhan","2018-12-4");

效果如下:

此時(shí),我們恢復(fù) hostM1,但接下來(lái)的數(shù)據(jù)寫入依然進(jìn)入 hostM2

insert into travelrecord(id,city,create_date)  values(5,"ShenYang","2018-11-5");
insert into travelrecord(id,city,create_date)  values(6,"Harbin","2018-12-5");

接下來(lái)手動(dòng)讓 hostM2宕機(jī),看 hostM1 是否能升級(jí)為主寫節(jié)點(diǎn)

再插入兩條數(shù)據(jù):

insert into travelrecord(id,city,create_date)  values(7,"SuZhou","2018-11-6");
insert into travelrecord(id,city,create_date)  values(8,"WuXi","2018-12-6");

很明顯,答案是肯定的


后 記
由于能力有限,若有錯(cuò)誤或者不當(dāng)之處,還請(qǐng)大家批評(píng)指正,一起學(xué)習(xí)交流!

My Personal Blog:CodeSheep 程序羊

我的半年技術(shù)博客之路



文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/17859.html

相關(guān)文章

  • 分庫(kù)分表" ?選型和流程要慎重,否則會(huì)失控

    摘要:但你是否知道分庫(kù)分表需要哪些要素拆分過(guò)程是復(fù)雜的,提前計(jì)劃,不要等真正開(kāi)工,各種意外的工作接踵而至,以至失控。在實(shí)施分庫(kù)分表策略時(shí),這些個(gè)性會(huì)造成策略過(guò)大不好維護(hù)。 更多文章關(guān)注微信公眾號(hào)《小姐姐味道》 https://mp.weixin.qq.com/s?__... 數(shù)據(jù)庫(kù)中間件之分庫(kù)分表 恭喜你,貴公司終于成長(zhǎng)到一定規(guī)模,需要考慮高可用,甚至分庫(kù)分表了。但你是否知道分庫(kù)分表需要哪...

    archieyang 評(píng)論0 收藏0
  • springboot+mycat 分表分庫(kù)

    摘要:而在分布式系統(tǒng)中,分表分庫(kù)也是常用的一種解決此類瓶頸的手段。支持?jǐn)?shù)據(jù)的多片自動(dòng)路由與聚合,支持等常用的聚合函數(shù)支持跨庫(kù)分頁(yè)。支持通過(guò)全局表,關(guān)系的分片策略,實(shí)現(xiàn)了高效的多表查詢。支持多租戶方案。 前言 對(duì)于業(yè)務(wù)量越來(lái)越大的時(shí)候,單表數(shù)據(jù)超過(guò)幾千萬(wàn),甚至上億時(shí),一張表里面查詢真的會(huì)很費(fèi)時(shí)。而在分布式系統(tǒng)中,分表分庫(kù)也是常用的一種解決此類瓶頸的手段。今天就選用springboot+myca...

    lakeside 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<th id="a6g2i"></th>
  • <strike id="a6g2i"><menu id="a6g2i"></menu></strike>
      <th id="a6g2i"></th>
      <ul id="a6g2i"><tbody id="a6g2i"></tbody></ul>
      <