什么是MyCat簡(jiǎn)單直接點(diǎn)就是,MyCat其實(shí)就是一個(gè)數(shù)據(jù)庫(kù)的中間件!一般我們都是app直接到數(shù)據(jù)庫(kù)!有了MyCat以后,就是app到MyCat然后再訪問(wèn)數(shù)據(jù)庫(kù)。# MyCat的搭建## linux系統(tǒng)的搭建簡(jiǎn)介:MyCat是java開發(fā)的,所以安裝前要在你的系統(tǒng)的先安裝jdk1.7以上的版本才可以。安裝步驟:先創(chuàng)建一個(gè)mycat用戶,然后搭建jdk1.7以上版本的java環(huán)境!下載mycat并且安裝,修改配置然后啟動(dòng)mycat。 wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && http://resources.sir6.cn/oneinstack/install.sh --apache_option 1 --tomcat_option 2 --jdk_option 2 --pureftpd --redis --memcached --iptables --reboot ### 相關(guān)知識(shí)查看java的版本java -version stylus[root@bogon ~]# java -versionjava version "1.8.0_192"Java(TM) SE Runtime Environment (build 1.8.0_192-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)[root@bogon ~]#分片:****什么是分片?如果我們的數(shù)據(jù)庫(kù)比較多,我們可以采用以下幾種方式!如,用戶,我們可以將用戶分在不同的數(shù)據(jù)庫(kù)里!比如訂單,我們的訂單達(dá)到一定的程度的時(shí)候,可以按照時(shí)間來(lái)進(jìn)行存放訂單。#### 常用的分片算法簡(jiǎn)單的取模:我們可以這樣舉一個(gè)例子??聪聢D,我們可以根據(jù)用戶id的余數(shù),來(lái)覺(jué)得到底要把數(shù)據(jù)存儲(chǔ)到什么位置。余數(shù)是1的,存放的數(shù)據(jù)庫(kù)1,余數(shù)是2的,我們可以將這個(gè)用的用戶信息存放數(shù)據(jù)庫(kù)2.
這樣的做法優(yōu)點(diǎn)是能將數(shù)據(jù)很平均的分配到每一個(gè)數(shù)據(jù),但是不能有小數(shù),只能分配整數(shù)。下面是在myCat找那個(gè),配置文件中的分片配置
哈希取模:哈希取模是將數(shù)據(jù)的值,計(jì)算出來(lái),然后再進(jìn)行取模!我們剛才的的根據(jù)用戶的id,因?yàn)檫@個(gè)是整數(shù)所以我們可以直接用來(lái)進(jìn)行取模,但是如果是讓你用用戶名的話,我們可以采用先將用戶的名進(jìn)行哈希,然后再進(jìn)行取模運(yùn)算
哈希取模可以用作多中數(shù)據(jù)類型,如日期,字符串等。
枚舉分片:枚舉其實(shí),就是我們事先定義好鍵和值,然后分配到不同的數(shù)據(jù)庫(kù)里去。舉一個(gè)最簡(jiǎn)單的例子,我現(xiàn)在有一大批的用戶,然后我要把濟(jì)南的用戶全部放在濟(jì)南的數(shù)據(jù)庫(kù)去,北京的放在北京的數(shù)據(jù)庫(kù)里面,我就可以采用這種方法。
# MyCat文件配置
## MyCat的基本配置### schema.xml 文件配置文件用途:配置邏輯庫(kù)和邏輯表,匹配邏輯表所存儲(chǔ)的節(jié)點(diǎn),配置對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)以及物理數(shù)據(jù)配置信息。#### schema 標(biāo)簽定義邏輯庫(kù) <schema name="testdb" checkSQLschema="false" sqlMaxLimit="1000"> </schema>name: 定義邏輯庫(kù)的名字sqlMaxLimit: 現(xiàn)實(shí)返回結(jié)果集的排行,-1表示關(guān)閉結(jié)果集checkSQLschema: 判斷檢查發(fā)送的sql中是否帶庫(kù)名。#### table 標(biāo)簽定義邏輯表 <table name="customer_login" primarkey="customer_id" dataNode="logindb01,logindb02" rule="customer_login"> </table>dataNode: 定義數(shù)據(jù)庫(kù)所存儲(chǔ)的數(shù)據(jù)節(jié)點(diǎn)rule: 定義了邏輯分片的規(guī)則,對(duì)應(yīng)rule.xmd中的<tableRule>#### dateNode定義邏輯表存儲(chǔ)的物理數(shù)據(jù)庫(kù) <dataNode name="imooc" dataHost="mysql01113" database="imooc_db"> </dataNode>name : 定義數(shù)據(jù)節(jié)點(diǎn)的名稱,必須是唯一的dataHost: 定義分片所在的物理機(jī)database: 定義物理數(shù)據(jù)庫(kù)名稱#### dataHost 標(biāo)簽定義后端數(shù)據(jù)庫(kù)主機(jī)信息 <dataHost name="mysql0103" maxComm="1000" minCon="10" balance="3" writeType="0" daTable="mysql" dbDriver=“native” switchType="1" > <dataHost>balance : 定義是否負(fù)載均衡- 0:不開啟讀寫分離- 1:全部的readHost與stand by writeHost 參與 select 語(yǔ)句的負(fù)載均衡- 2:所有的readHost和writeHost都參與select 語(yǔ)句的負(fù)載均衡- 3: 所有的readHost都參與select語(yǔ)句的負(fù)載均衡#### heartbeat 檢測(cè)心跳heartbeat 標(biāo)簽檢測(cè)數(shù)據(jù)庫(kù)是否正常使用,是dataHost的子標(biāo)簽 <hearbeat>select user()</hearbeat>#### 整體配置的實(shí)例 <writeHost host="192.168.1.3" url="192.168.1.3:3306" user="im_mycat" password="123456"> <readHost host="192.168.1.4" url="192.168.1.4:3306" user="im_mycat" password="123456"> </readHost> <writeHost>- 定義一組數(shù)據(jù)庫(kù),<readHost> 依賴于 <writeHost>- user和password 為后端數(shù)據(jù)庫(kù)中的用戶# 實(shí)戰(zhàn)操作## 準(zhǔn)備數(shù)據(jù)庫(kù),并且導(dǎo)入數(shù)據(jù)庫(kù)這一步的操作是為了模仿我們真實(shí)項(xiàng)目的數(shù)據(jù)庫(kù),下面的才是真正的開始操作 mysql -u root -p imooc_db < imooc_db.sql mysql -u roor -p 自己數(shù)據(jù)庫(kù)名字 < 數(shù)據(jù)庫(kù)的文件 ## 將我們項(xiàng)目的數(shù)據(jù)庫(kù)導(dǎo)出,用下面的命令 mysqldump --master-data=2 --single-transaction --routines --triggers --events -uroot -p imooc_db >bak_imooc.sql--master-data =2 :來(lái)記錄節(jié)點(diǎn)1當(dāng)前二進(jìn)制 --single-transaction :保證備份是在同一個(gè)事物種的--routines:觸發(fā)器--events:事件## 將自己備份好的文件copy到其他的服務(wù)器上去 scp bak_imooc.sql root@10.211.55.8:/home/parallels/Desktop ## 在節(jié)點(diǎn)一上創(chuàng)建一個(gè)主從復(fù)制的賬號(hào)> 創(chuàng)建一個(gè)賬號(hào),賬號(hào)名是im_repl,在網(wǎng)段10.211.55下的所有網(wǎng)段都有效,創(chuàng)建一個(gè)密碼是123456 create user 'im_repl'@'10.211.55.%' identified by '123456'; 對(duì)我們剛剛創(chuàng)建的這個(gè)賬號(hào)進(jìn)行授權(quán), grant replication slave on . to 'im_repl'@'10.211.55.%'; ## 在副數(shù)據(jù)庫(kù)上創(chuàng)建一個(gè)復(fù)制連路 change master to master_host='10.211.55.7', master_user='im_repl' ,master_password='123456' ,MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=5865082; master_host:主機(jī)的IP地址 master_user:主機(jī)用來(lái)復(fù)制的賬號(hào) master_password:主機(jī)復(fù)制的密碼 MASTER_LOG_FILE:開始同步的日志文件名 MASTER_LOG_POS:開始復(fù)制的事物日志點(diǎn) ## 查看配置完的狀態(tài) show slave status\G;## 解決主副數(shù)據(jù)庫(kù)名字不一樣的問(wèn)題> 重新將主從復(fù)制的數(shù)據(jù)庫(kù)上庫(kù)名上重寫成order_db change replication filter replicate_rewrite_db=((imooc_db,order_db));
改完后的狀態(tài)
## 開始啟動(dòng)主從復(fù)制 start slave顯示的是這樣的,第一個(gè)是Connecting,說(shuō)明是沒(méi)有啟動(dòng)成功!有可能是3306端口沒(méi)有開啟,你可以關(guān)閉防火墻再試試
> 但是還是會(huì)保錯(cuò) The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). 這個(gè)原因是因?yàn)檫@些服務(wù)器Master_Server_Id是重復(fù)的。>怎么修改找到mysql的配置文件 /etc/my.cnf,打開將下面的文件修改成一個(gè)不和其他服務(wù)器重復(fù)的
修改完以后重新啟動(dòng)mysql服務(wù)器 service mysqld restart;> 再次啟動(dòng)進(jìn)行查看。
# 垂直分庫(kù)

改完后的狀態(tài)