真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MyCat實(shí)現(xiàn)讀寫分離、分庫、全局表的代碼

環(huán)境如下:

成都創(chuàng)新互聯(lián)公司是專業(yè)的臨渭區(qū)網(wǎng)站建設(shè)公司,臨渭區(qū)接單;提供網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行臨渭區(qū)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

系統(tǒng)IP主機(jī)名服務(wù)
Centos 7.5192.168.20.2MySQL01MySQL 5.7.24
Centos 7.5192.168.20.3mysql02MySQL  5.7.24
Centos 7.5192.168.20.3mysql03MySQL  5.7.24
Centos 7.5192.168.20.4mycatMycat

注:主機(jī)mysql01和mysql02為主從復(fù)制關(guān)系,可以參考博文MySQL高可用方案——雙主(注:只需要參考博文做出主從效果即可,并不需要雙主,也不需要keepalived來做高可用)來搭建。mycat服務(wù)請參考博文MyCat部署安裝來搭建,這里新增的主機(jī)mysql03為一個(gè)剛剛搭建好的mysql服務(wù)器,可以參考博文Centos部署MySQL 5.7來搭建。

1、mycat實(shí)現(xiàn)讀寫分離

這里沒有用到mysql03主機(jī),讀寫分離的實(shí)現(xiàn)比較簡單,只需要修改mycat的下面兩個(gè)配置文件即可。如下:

1)修改server.xml文件
[root@mycat mycat]# pwd
/usr/local/mycat   
[root@mycat mycat]# vim conf/server.xml

[root@mycat mycat]# vim conf/server.xml    
          
                pwd@123   
                test_mycat    
                
        
2)修改schema.xml文件




        
        
            
                
        
                select user()
                
                                
                
                        
                                                
                        
                
        

修改后的完整配置文件如下(為避免冗余,刪除了部分注釋):

server.xml配置文件內(nèi)容如下:
[root@mycat mycat]# vim conf/server.xml 




        
        0  
        0  

                2
                0
                0

                1
                1m
                1k

                0
                384m

                true

        
        
                pwd@123
                test_mycat
        
schema.xml配置文件內(nèi)容如下:
[root@mycat mycat]# vim conf/schema.xml





        
        
        
        
                select user()
                
                
                        
                        
                
        

注:至此,后端數(shù)據(jù)庫上自行創(chuàng)建有相關(guān)權(quán)限的用戶,比如我在上面的datahost字段中指定的writehost和readhost字段的user值為root,則數(shù)據(jù)庫的root賬號要有對應(yīng)的登錄權(quán)限(默認(rèn)root用戶只允許在localhost登錄,所以要自行修改root權(quán)限或換成其他有權(quán)限的用戶)。

3)啟動(dòng)mycat并測試讀寫分離效果
[root@mycat mycat]# mycat start       #啟動(dòng)mycat
[root@mycat mycat]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066   #登錄到mycat
#192.168.20.4為mycat主機(jī)IP,mycat監(jiān)聽端口為8066,使用的登錄用戶為server.xml文件中創(chuàng)建的用戶
#創(chuàng)建表并插入一些測試數(shù)據(jù)
mysql> use test_mycat;
mysql> create table t1 (id int,name varchar(4));
mysql> insert into t1 values(1,'張三'),(2,'李四'),(3,'王五');
#此時(shí),去后端數(shù)據(jù)庫上查看,應(yīng)該是有上面這些數(shù)據(jù)的。
#現(xiàn)在可以暫時(shí)關(guān)閉后端數(shù)據(jù)庫的主從復(fù)制,然后再mycat主機(jī)上繼續(xù)插入數(shù)據(jù),測試是否可以讀到
#關(guān)閉主從復(fù)制命令:stop slave;
#以下操作還是在mycat主機(jī)進(jìn)行
mysql> insert into t1 values(4,'趙六');    #插入一條數(shù)據(jù)
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;      #查詢不到剛插入的數(shù)據(jù),說明讀寫操作沒有在同一臺主機(jī)上進(jìn)行
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
+------+--------+
#可以去后端兩個(gè)數(shù)據(jù)庫分別進(jìn)行查看數(shù)據(jù)
#mysql01主機(jī)的數(shù)據(jù)如下(說明寫操作是在mysql01):
mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
|    4 | 趙六   |
+------+--------+
4 rows in set (0.00 sec)
#mysql02主機(jī)的數(shù)據(jù)如下:
mysql> select * from t1(說明讀操作是在mysql02);
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
+------+--------+
3 rows in set (0.00 sec)

讀寫分離效果至此結(jié)束。(為不影響后面的測試進(jìn)行,最好恢復(fù)mysql01和mysql02主機(jī)的主從復(fù)制)。

2、mycat實(shí)現(xiàn)分庫

一個(gè)數(shù)據(jù)庫由很多表組成,每個(gè)表對應(yīng)著不同的業(yè)務(wù),所謂分庫,就是按照業(yè)務(wù)將表進(jìn)行分類,分不到不同的數(shù)據(jù)庫上面,這樣也就將數(shù)據(jù)或者說壓力分擔(dān)到不同的庫上面,分庫的原則:有緊密關(guān)聯(lián)關(guān)系的表應(yīng)該在一個(gè)庫里,相互沒有或者關(guān)聯(lián)關(guān)系不大的表可以分到不同的庫里。

分庫舉例:

假設(shè)現(xiàn)在有四張表: customer, orders, orders_detail, dict_order_type,每張表都有數(shù)百萬條數(shù)據(jù),那么這四張表如若要實(shí)現(xiàn)分庫,則可以將customer表單獨(dú)分離到一個(gè)數(shù)據(jù)庫,另外三張表單獨(dú)在另一個(gè)數(shù)據(jù)庫。

1)修改server.xml文件(就改了一下邏輯庫名)
[root@mycat mycat]# cat conf/server.xml 



    
    0  
    0  

        2
        0
        0

        1
        1m
        1k

        0
        384m

        true

    
    
        pwd@123
        test_db
    
2)修改schema.xml文件
[root@mycat mycat]# cat conf/schema.xml




    
           
    
    
    
    
        select user()
        
        
            
            
        
    
    
    
        select user()
        
        
        
    
3)重啟mycat
[root@mycat mycat]# mycat restart

注:后端指定的真實(shí)數(shù)據(jù)庫必須要有test數(shù)據(jù)庫,因?yàn)樵谏厦鎠chema.xml文件中的dataNode字段指定的是連接后端的test數(shù)據(jù)庫。

4)測試分庫效果
#登錄到mycat
[root@mycat mycat]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066
#創(chuàng)建相應(yīng)的表
mysql> use test_db;
mysql> CREATE TABLE customer(
    -> id_a INT AUTO_INCREMENT,
    -> NAME VARCHAR(200),
    -> PRIMARY KEY(id_a)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE orders(
    -> id_b INT AUTO_INCREMENT,
    -> order_type INT,
    -> customer_id INT,
    -> amount DECIMAL(10,2),
    -> PRIMARY KEY(id_b)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE orders_detail(
    -> id_c INT AUTO_INCREMENT,
    -> detail VARCHAR(2000),
    -> order_id INT,
    -> PRIMARY KEY(id_c)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE dict_order_type(
    -> id_d INT AUTO_INCREMENT,
    -> order_type VARCHAR(200),
    -> PRIMARY KEY(id_d)
    -> );
Query OK, 0 rows affected (0.01 sec)

#登錄到后端數(shù)據(jù)庫上,查看表是否按照預(yù)計(jì)的效果拆分
[root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.2
mysql> use test;

mysql> show tables;             #可以看到主機(jī)mysql01這里有三個(gè)表
+-----------------+
| Tables_in_test  |
+-----------------+
| dict_order_type |
| orders          |
| orders_detail   |
+-----------------+
3 rows in set (0.00 sec)

#登錄到mysql03上查看
[root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.21
mysql> use test;

mysql> show tables;     #可以看到這里只有customer表
+----------------+
| Tables_in_test |
+----------------+
| customer       |
+----------------+
1 row in set (0.00 sec)

至此,已經(jīng)實(shí)現(xiàn)了分庫,多個(gè)表放在了不同的庫中(在上面的栗子中,實(shí)現(xiàn)的是多個(gè)表放在了不同的主機(jī)上),但對于通過mycat登錄的客戶來說,還是一個(gè)庫,庫中有四張表。

3、mycat實(shí)現(xiàn)分表

這里對一個(gè)新表emp進(jìn)行拆分。

1)schema.xml文件修改如下(完整配置文件)
[root@mycat mycat]# cat conf/schema.xml




    
        
               
                       select user()                                                                select user()                            
2)rule.xml文件添加以下內(nèi)容
[root@mycat mycat]# vim conf/rule.xml      #修改rule.xml文件
            
                
                        id    
                        mod_long  
                
        
                        ...................
                                                
        
                
                2    
        
3)重啟mycat并登錄到mycat
[root@mycat mycat]# mycat restart
4)登錄到mycat插入數(shù)據(jù)進(jìn)行測試分表效果
[root@mycat mycat]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066
mysql> use test_db;
#創(chuàng)建emp表(后端兩個(gè)數(shù)據(jù)庫節(jié)點(diǎn)上都會有這張表)
mysql> create table emp (
    -> id int,
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.41 sec)
#插入多條數(shù)據(jù)(對于這種分表,插入數(shù)據(jù)需要指定列名,否則會報(bào)錯(cuò))
mysql> insert into emp(id,name) values(1,'張三'),(2,'李四'),(3,'王五'),(4,'趙六');
#查詢新插入的數(shù)據(jù)
mysql> select * from emp;    
+------+--------+
| id   | name   |
+------+--------+
|    2 | 李四   |
|    4 | 趙六   |
|    1 | 張三   |
|    3 | 王五   |
+------+--------+
4 rows in set (0.04 sec)
mysql> select * from emp order by id;    #對結(jié)果進(jìn)行排序
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
|    4 | 趙六   |
+------+--------+
4 rows in set (0.01 sec)

#后端mysql01主機(jī)查詢到該表的數(shù)據(jù)如下:
mysql> select * from emp;
+------+--------+
| id   | name   |
+------+--------+
|    2 | 李四   |
|    4 | 趙六   |
+------+--------+
2 rows in set (0.00 sec)
#mysql03主機(jī)查詢到的數(shù)據(jù)如下:
mysql> select * from emp;          
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    3 | 王五   |
+------+--------+
2 rows in set (0.00 sec)

可以看到數(shù)據(jù)是平均分散在不同節(jié)點(diǎn)上保存的。

但是經(jīng)過分片的普通表,是無法直接和其他表進(jìn)行join的。

要想解決多表join的問題,還需要修改schema.xml配置文件,在分表的table字段下添加childTable字段,具體怎么實(shí)現(xiàn),還在研究中。但是可以將分表的類型設(shè)置為全局表,這是一種比較簡單的實(shí)現(xiàn)方式。

3、全局表

分表后,與其他表如何join就成了比較棘手的問題,我們可以選擇將分表設(shè)置為全局表,這是一個(gè)解決join的方法(但不是唯一的方法),但全局表有一定的局限性,如下:

  • 全局表變動(dòng)不頻繁;
  • 數(shù)據(jù)量總體變化不大;
  • 數(shù)據(jù)規(guī)模不大,很少有超數(shù)十萬的記錄。

若想創(chuàng)建全局表,只需在table字段增加type="global"即可。如下:

1)定義全局表
[root@mycat conf]# cat schema.xml




    
        
               
       
   
                   select user()                                                                select user()                            
2)驗(yàn)證全局表
mysql> drop table emp;    #需要?jiǎng)h除之前創(chuàng)建的emp表
Query OK, 0 rows affected (0.03 sec)
#重新創(chuàng)建emp表
mysql> create table emp(
    -> id int,
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.38 sec)
#插入數(shù)據(jù)測試
mysql>  insert into emp(id,name) values(1,'張三'),(2,'李四'),(3,'王五'),(4,'趙六');
#在mycat上查詢插入的數(shù)據(jù)如下:
mysql> select * from emp;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
|    4 | 趙六   |
+------+--------+
4 rows in set (0.02 sec)
#在后端主機(jī)上分別查看emp表中的數(shù)據(jù):
#mysql01主機(jī)上數(shù)據(jù)如下:
mysql> select * from emp;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
|    4 | 趙六   |
+------+--------+
4 rows in set (0.00 sec)
#mysql03主機(jī)上數(shù)據(jù)如下:
mysql> select * from emp;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
|    3 | 王五   |
|    4 | 趙六   |
+------+--------+
4 rows in set (0.00 sec)

文章題目:MyCat實(shí)現(xiàn)讀寫分離、分庫、全局表的代碼
標(biāo)題來源:http://weahome.cn/article/jhpjpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部