1. 程式人生 > 其它 >實驗四:瞭解你的系統

實驗四:瞭解你的系統

MySQL讀寫分離

讀寫分離概念

讀寫分離的基本原理是讓主資料庫處理增、刪、改操作(INSERT、DELETE、UPDATE),從資料庫處理查詢操作(SELECT)。資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。

讀寫分離的作用

因為資料庫的“寫”(寫100,00條資料到MySQL可能要3分鐘)操作是比較耗時的,但是資料庫的“讀”(從MySQL讀100,00條資料可能只要5秒鐘)。所以讀寫分離可以解決資料庫寫入時影響查詢效率的問題。

讀寫分離應用場景

資料庫不一定要運用讀寫分離,當資料庫使用多、更新少、查詢較多的情況下會考慮使用。利用資料庫主從同步,可以減少資料庫壓力,提高效能。當然,資料庫也有其它優化方案。例如使用memcache、分表、搜尋引擎等方法。

讀寫分離案例實施

在擁有主從伺服器基礎上新增一臺虛擬機器部署mycat資料庫中介軟體服務

1、規劃節點
IP 主機名 節點
192.168.200.10 lamp 資料庫叢集主節點
192.168.200.20 mycat Mycat中介軟體服務節點
192.168.200.30 lnmp 資料庫叢集從節點
2、配置三臺虛擬機器的hosts和關閉防火牆
[root@lamp ~]# vim /etc/hosts  //同傳給全部節點
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.loca
ldomain4
::1         localhost localhost.localdomain localhost6 localhost6.loca
ldomain6
192.168.200.10  lamp
192.168.200.20  mycat
192.168.200.30  lnmp
//關閉防火牆(全部節點)
[root@lamp ~]#iptables -F
[root@lamp ~]#iptables -X
[root@lamp ~]#iptables -Z
[root@lamp ~]#iptables-save
3、檢視主從伺服器是否連線

lamp下:

[root@lamp ~]# mysql -uroot -p
Enter password:    //輸入密碼
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| atlinux01.000003 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

lnmp下:

[root@lnmp ~]# mysql -uroot -p
Enter password:     //輸入密碼
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.200.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: atlinux01.000003
          Read_Master_Log_Pos: 120
               Relay_Log_File: antong-relay-bin.000005
                Relay_Log_Pos: 283
        Relay_Master_Log_File: atlinux01.000003
             Slave_IO_Running: Yes   //兩個yes為連線
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 620
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 10
                  Master_UUID: 6c8995bb-e951-11eb-9ef3-000c2994a838
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

ERROR: 
No query specified
4、在主節點中建立資料庫test,驗證主從同步

主節點操作:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test
Database changed
mysql> create table company(id int not null primary key,name varchar(50),addr varchar(255));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into company values(1,"facebook","usa");
Query OK, 1 row affected (0.01 sec)

mysql> select * from company;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | facebook | usa  |
+----+----------+------+
1 row in set (0.00 sec)

從節點操作:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| at                 |
| mysql              |
| performance_schema |
| test               |
| wordpress          |
+--------------------+
6 rows in set (0.00 sec)

mysql> use test
Database changed

mysql> select * from company;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | facebook | usa  |
+----+----------+------+
1 row in set (0.00 sec)
5、部署Mycat讀寫分離中介軟體服務
(1)安裝Mycat服務

將Mycat服務的二進位制軟體包上傳到/usr/local/src/下

[root@mycat src]# pwd
/usr/local/src
[root@mycat src]# ls
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

將軟體包解壓到/use/local目錄中。賦予解壓後的Mycat目錄許可權。

[root@mycat src]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat src]# chown -R 777 /usr/local/mycat/

在環境變數新增Mycat服務

[root@mycat src]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
[root@mycat src]# source /etc/profile
(2)編輯Mycat的邏輯庫配置檔案

配置Mycat服務讀寫分離的schema.xml配置檔案在/usr/local/mycat/conf/目錄下,可以在檔案中定義一個邏輯庫,使使用者可以通過Mycat服務管理該邏輯庫對應的mysql資料庫。在這裡定義一個邏輯庫schema,name為USERDB;該邏輯庫USERDB對應資料庫database為test(在部署主從資料庫時已安裝);設定資料庫寫入節點為主節點db1;設定資料庫讀取節點為從節點db2。

可以直接刪除原來schema.xml的內容,替換為如下。

[root@mycat src]# vim /usr/local/mycat/conf/schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode
="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbTy
pe="mysql" dbDriver="native" writeType="0" switchType="1"  slaveThresh
old="100">  
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.200.10:3306" user="root" pas
sword="000000">
        <readHost host="hostS1" url="192.168.200.30:3306" user="root" 
password="000000" />
    </writeHost>
</dataHost>
</mycat:schema>

程式碼說明:

sqlMaxLimit:配置預設查詢數量。

database:為真實資料庫名。

balance="0":不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上。

balance="1":全部的readHost與stand by writeHost參與select語句的負載均衡,簡單來說,當雙主雙從模式(M1->S1,M2->S2,並且M1與M2互為主備),正常情況下,M2、S1、S2都參與select語句的負載均衡。

balance="2":所有讀操作都隨機的在writeHost、readhost上分發。

balance="3":所有讀請求隨機地分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力,注意balance=3只在1.4及其以後版本有,1.3版本沒有。

writeType="0":所有寫操作傳送到配置的第一個writeHost,第一個掛了需要切換到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置檔案dnindex.properties中。

writeType="1":所有寫操作都隨機的傳送到配置的writeHost。

(3)修改配置檔案許可權
[root@mycat src]# chown root:root /usr/local/mycat/conf/schema.xml 
(4)編輯mycat的訪問使用者

修改/usr/local/mycat/conf/目錄下的server.xml檔案,訪問Mycat的邏輯庫為USERDB

[root@mycat src]# vim /usr/local/mycat/conf/server.xml
//在配置檔案的最後部分修改以下內容
<user name="root">
                <property name="password">000000</property>
                <property name="schemas">USERDB</property>
</user>
//刪除如下幾行:
<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
</user>
(5)啟動Mycat服務
[root@mycat src]# /bin/bash /usr/local/mycat/bin/mycat start
[root@mycat src]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      13169/java          
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      912/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1013/master         
tcp6       0      0 :::40476                :::*                    LISTEN      13169/java          
tcp6       0      0 :::1984                 :::*                    LISTEN      13169/java          
tcp6       0      0 :::8066                 :::*                    LISTEN      13169/java          
tcp6       0      0 :::43427                :::*                    LISTEN      13169/java          
tcp6       0      0 :::9066                 :::*                    LISTEN      13169/java          
tcp6       0      0 :::22                   :::*                    LISTEN      912/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1013/master         

如果有開放8066和9066埠,則表示Mycat服務開啟成功。

6、驗證資料庫讀寫分離功能
(1)用Mycat服務查詢資料庫資訊

掛載gpmall本地yum源進行安裝,自行操作

[root@mycat opt]# yum install -y MariaDB-client.x86_64 
[root@mycat opt]# mysql -h127.0.0.1 -P8066 -uroot -p000000
Welcome to the MariaDB monitor.  Commands end with ; or \g.

MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| USERDB   |
+----------+
1 row in set (0.002 sec)

MySQL [(none)]> use USERDB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [USERDB]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| company        |
+----------------+
1 row in set (0.001 sec)

MySQL [USERDB]> select * from company;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | facebook | usa  |
+----+----------+------+
1 row in set (0.052 sec)
(2)用Mycat服務新增表資料
MySQL [USERDB]>  insert into company values(2,"bastetball","usa");
Query OK, 1 row affected (0.029 sec)

MySQL [USERDB]> select * from company;
+----+------------+------+
| id | name       | addr |
+----+------------+------+
|  1 | facebook   | usa  |
|  2 | bastetball | usa  |
+----+------------+------+
2 rows in set (0.002 sec)
(3)驗證Mycat服務對資料庫讀寫操作分離

Mycat虛擬機器節點使用mysql命令,通過9066埠查詢對資料庫讀寫操作的分離資訊。可以看到所有的寫入操作WRITE_LOAD數都在db1主資料庫節點上,所有的讀取操作READ_LOAD數都在db2主資料庫節點上。由此可見,資料庫讀寫操作已經分離到db1和db2節點上了。

[root@mycat opt]# mysql -h127.0.0.1 -P9066 -uroot -p000000 -e 'show  @@datasource;'
+----------+--------+-------+----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST           | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+----------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 192.168.200.10 | 3306 | W    |      0 |   10 | 1000 |      88 |         0 |          1 |
| dn1      | hostS1 | mysql | 192.168.200.30 | 3306 | R    |      0 |    7 | 1000 |      87 |         4 |          0 |
+----------+--------+-------+----------------+------+------+--------+------+------+---------+-----------+------------+