天天看點

Mycat讀寫分離配置

一、Mycat的安裝與配置檔案分析

1.安裝Mycat

mycat是基于java的,是以需要java環境

[mycat下載下傳位址]http://www.mycat.io/

1)準備java環境

]# yum -y install java-1.8.0-openjdk #安裝JDK

[[email protected] ~]# which java  #檢視指令

/usr/bin/java

[[email protected] ~]# java –version  #顯示版本

openjdk version “1.8.0_161”

OpenJDK Runtime Environment (build 1.8.0_161-b14)

OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

2)安裝提供服務的軟體包

[[email protected] ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz  #解壓源碼

[[email protected] ~]# mv mycat /usr/local/  #移動目錄

[[email protected] ~]# ls /usr/local/mycat/  #檢視檔案清單

bin catlet conf lib logs version.txt

2.Mycat配置檔案

1)server.xml

]# vim /usr/local/mycat/conf/server.xml

#連接配接mycat服務時使用的使用者名

123456  #使用者連接配接mycat使用者時使用的密碼

TESTDB  #邏輯庫名

user

TESTDB

true  #隻讀權限,連接配接mycat服務後隻有讀記錄的權限,不寫這一行則是可讀可寫

:wq

重點關注上面這段配置,其他預設即可。

=======================================

參數 說明

user 使用者配置節點

name 登入的使用者名,也就是連接配接Mycat的使用者名。

password 登入的密碼,也就是連接配接Mycat的密碼

schemas 資料庫名,這裡會和schema.xml中的配置關聯,多個用逗号分開,例如需要這個使用者需要管理兩個資料庫db1,db2,則配置db1,dbs

privileges 配置使用者針對表的增删改查的權限

readOnly mycat邏輯庫所具有的權限。true為隻讀,false為讀寫,預設為false。

=======================================

我這裡配置了一個賬号root,密碼為123456,邏輯資料庫為TESTDB(預設),這些資訊都可以自己随意定義,讀寫權限都有,沒有針對表做任何特殊的權限。

注意:

  • server.xml檔案裡登入TESTDB的使用者名和密碼可以任意定義,這個賬号和密碼是為客戶機登入TESTDB時使用的賬号資訊。
  • 邏輯庫名(邏輯庫是對外展示的庫,并非真實用于存儲資料的庫,邏輯庫位于mycat代理伺服器上,真實庫位于資料庫伺服器上,如這裡配置的邏輯庫TESTDB,真實庫需要在server.xml中配置,接下來會将)
  • 這裡隻定義了一個标簽,是以把多餘的都注釋了。如果定義多個标簽,即設定多個連接配接mycat的使用者名和密碼,那麼就需要在schema.xml檔案中定義多個對應的庫!

    2)schema.xml

schema.xml是最主要的配置項,此檔案關聯mysql讀寫分離政策!讀寫分離、分庫分表政策、分片節點都是在此檔案中配置的!

MyCat作為中間件,它隻是一個代理,本身并不進行資料存儲,需要連接配接後端的MySQL實體伺服器,此檔案就是用來連接配接MySQL伺服器的!

schemaxml檔案中配置的參數解釋

參數 說明

1.schema 資料庫設定,此資料庫為邏輯資料庫,name與server.xml中schema對應

2.dataNode 分片資訊,也就是分庫相關配置

3.dataHost 實體資料庫,真正存儲資料的資料庫

配置說明

1.name屬性唯一辨別dataHost标簽,供上層的标簽使用。

2.maxCon屬性指定每個讀寫執行個體連接配接池的最大連接配接。也就是說,标簽内嵌套的

3.writeHost、readHost标簽都會使用這個屬性的值來執行個體化出連接配接池的最大連接配接數。

4.minCon屬性指定每個讀寫執行個體連接配接池的最小連接配接,初始化連接配接池的大小。

每個節點的屬性逐一說明

schema:

屬性 說明

1.name 邏輯資料庫名,與server.xml中的schema對應

2.checkSQLschema 資料庫字首相關設定,建議看文檔,這裡暫時設為folse

3.sqlMaxLimit select 時預設的limit,避免查詢全表

Table

屬性 說明

name 表名,實體資料庫中表名

dataNode 表存儲到哪些節點,多個節點用逗号分隔。節點為下文dataNode設定的name

primaryKey 主鍵字段名,自動生成主鍵時需要設定

autoIncrement 是否自增

rule 分片規則名,具體規則下文rule詳細介紹

dataNode

屬性 說明

name 節點名,與table中dataNode對應

datahost 實體資料庫名,與datahost中name對應

database 實體資料庫中資料庫名

schema.xml檔案dataHost中有三點需要注意:balance=“1”,writeType=“0” ,switchType=“1”

schema.xml中的balance的取值決定了負載均衡對非事務内的讀操作的處理。balance 屬性負載均衡類型,目前的取值有 4 種:

1.balance=“0”: 不開啟讀寫分離機制,所有讀操作都發送到目前可用的writeHost 上,即讀讀寫請求都發送到writeHost上。

2.balance=“1”: 讀請求随機分發到目前writeHost對應的readHost和standby的writeHost上(standby是備選主伺服器,以備目前主伺服器當機後充當主伺服器)。即全部的readHost與stand by writeHost 參與select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,并且 M1 與 M2 互為主備),正常情況下, M2,S1,S2 都參與 select 語句的負載均衡

3.balance=“2”: 讀請求随機分發到目前dataHost内所有的writeHost和readHost上。即所有讀操作都随機的在writeHost、 readhost 上分發。

4.balance=“3”: 讀請求随機分發到目前writeHost對應的readHost上。即所有讀請求随機的分發到 wiriterHost 對應的 readhost 執行, writerHost 不負擔讀壓力,注意 balance=3 隻在 1.4 及其以後版本有,1.3 沒有。

writeType 屬性,負載均衡類型,目前的取值有 3 種

1.writeType=“0” 所有寫操作發送到配置的第一個 writeHost,第一個挂了切到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置檔案中:dnindex.properties.

2.writeType=“1” 所有寫操作都随機的發送到配置的 writeHost。

3.writeType=“2” 沒實作。

對于事務内的SQL預設走寫節點

1.以 /balance/ 開頭,可以指定SQL使用特定負載均衡方案。例如在大環境開啟讀寫分離的情況下,特定強一緻性的SQL查詢需求;

2.slaveThreshold:近似的主從延遲時間(秒)Seconds_Behind_Master <slaveThreshold ,讀請求才會分發到該Slave,確定讀到的資料相對較新。

3.schema.xml中的writeType的取值決定了負載均衡對寫操作的處理:

4.writeType=“0”:所有的寫操作都發送到配置檔案中的第一個write host。(第一個write host故障切換到第二個後,即使之後修複了仍然維持第二個為寫庫)。推薦取0值,不建議修改.

主從切換(雙主failover):switchType 屬性

如果細心觀察schem.xml檔案的話,會發現有一個參數:switchType,如下配置:

<dataHost name=“237_15” maxCon=“1000” minCon=“10” balance=“1” writeType=“0” dbType=“mysql” dbDriver=“native"switchType=“1” slaveThreshold=“100”>

參數解讀

1.switchType=”-1": 不自動切換

2.switchType=“1”: 預設值,自動切換

3.switchType=“2”: 基于MySQL主從同步的狀态來決定是否切換。需修改heartbeat語句(即心跳語句):show slave status

4.switchType=“3”: 基于Mysql Galera Cluster(叢集多節點複制)的切換機制。需修改heartbeat語句(即心跳語句):show status like ‘wsrep%’

dbType屬性

指定後端連接配接的資料庫類型,目前支援二進制的mysql協定,還有其他使用JDBC連接配接的資料庫。例如:mongodb、oracle、spark等。

dbDriver屬性指定連接配接後端資料庫使用的

Driver,目前可選的值有native和JDBC。

1.使用native的話,因為這個值執行的是二進制的mysql協定,是以可以使用mysql和maridb。

2.其他類型的資料庫則需要使用JDBC驅動來支援。從1.6版本開始支援postgresql的native原始協定。

3.如果使用JDBC的話需要将符合JDBC 4标準的驅動JAR包放到MYCAT\lib目錄下,并檢查驅動JAR包中包括如下目錄結構的檔案:

META-INF\services\java.sql.Driver。在這個檔案内寫上具體的Driver類名,例如:com.mysql.jdbc.Driver。

heartbeat标簽

1.這個标簽内指明用于和後端資料庫進行心跳檢查的語句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。

2.這個标簽還有一個connectionInitSql屬性,主要是當使用Oracla資料庫時,需要執行的初始化SQL語句就這個放到這裡面來。例如:altersession set nls_date_format=‘yyyy-mm-dd hh24:mi:ss’

3.1.4主從切換的語句必須是:show slave status

writeHost标簽、readHost标簽

1.這兩個标簽都指定後端資料庫的相關配置給mycat,用于執行個體化後端連接配接池。

2.足系統的要求。

3.在一個dataHost内可以定義多個writeHost和readHost。但是,如果writeHost指定的後端資料庫當機,那麼這個writeHost綁定的所有readHost都将不可用。

4.另一方面,由于這個writeHost當機系統會自動的檢測到,并切換到備用的writeHost上去。

dataHost

屬性 說明

1.name 實體資料庫名,與dataNode中dataHost對應

2.balance 均衡負載的方式

3.writeType 寫入方式

4.dbType 資料庫類型

5.heartbeat 心跳檢測語句,注意語句結尾的分号要加

二、主從同步配置與Mycat伺服器配置

拓撲結構如下,你需要準備5台虛拟機,ip配在同一網段即可

我們将為服務配置主從同步結構,為Mycat伺服器安裝mycat服務并修改配置檔案以實作讀寫分離

Mycat讀寫分離配置

1.配置主從伺服器

這裡需要準備三台伺服器,一台主伺服器,二台從伺服器準備好後保證三台主機能互相ping通,然後安裝mysql服務。

主伺服器配置:

1)啟用binlog日志

]# vim /etc/my.cnf

[mysqld]

server_id=51    #server_id

log-bin=master51   #日志名

:wq

]# systemctl restart mysqld

2)使用者授權

使用者名自定義、用戶端位址使用% 或 隻指定 從伺服器的位址 都可以、隻給複制資料的權限即可。

]# mysql -uroot -p密碼

mysql> grant replication slave on . to repluser@"%" identified by “123qqq…A”;

mysql>quit;

3)檢視binlog日志資訊

檢視日志檔案名 和 偏移量位置。

mysql> show master status\G;

*************************** 1. row ***************************

File: master51.000001   #日志名

Position: 441      #偏移量

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

從伺服器配置(兩台都需要配置):

1)指定server_id

Server_id值可以自定義,但不可以與主伺服器相同。(取值範圍1-255)

]# vim /etc/my.cnf

[mysqld]

server_id=52 //server_id值

:wq

]# systemctl restart mysqld //重新開機服務

2)確定與主伺服器資料一緻(如果是使用2台新部署的資料庫伺服器配置主從同步,此操作可以忽略)

密碼寫你登入資料庫的密碼,導入的時候如果

]# mysqldump -uroot –p密碼 -A > /allbak.sql  #在主伺服器上備份全部資料

]# scp /allbak.sql [email protected]:/root/  #将備份檔案拷貝給從伺服器

]# mysql -uroot –p密碼 資料庫名 < /root/allbak.sql  #從伺服器使用備份檔案恢複資料

3)指定主伺服器資訊

資料庫管理者root本機登入,指定主伺服器資訊,其中日志檔案名和偏移量 寫allbak.sql檔案記錄的。

指定主伺服器資訊後,會将主伺服器資訊儲存在/var/lib/mysql/master.info檔案下,若需要修改,則有兩種途徑,一種是在mysql下通過指令修改,而是修改上述檔案.修改前必須停止slave線程,指令:stop slave 修改完後開啟線程 : start slave

]# mysql -uroot –p密碼 //管理者root 本機登入

mysql> show slave status; #檢視狀态資訊,還不是從伺服器

Empty set (0.00 sec)

mysql> change master to   #指定主伺服器

-> master_host=“192.168.4.51”,  #主伺服器ip位址

-> master_user=“repluser”,   #主伺服器授權使用者

-> master_password=“123qqq…A”,  #主伺服器授權使用者密碼

-> master_log_file=“master51.000001 ”, #主伺服器日志檔案,以主伺服器顯示的為主

-> master_log_pos=441;   #主伺服器日志偏移量,切忌不可加雙引号

-> start slave; #啟動線程

mysql> show slave status\G;    #檢視狀态資訊,主要檢視兩個線程是否啟動

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.4.51 #主伺服器ip位址

Master_User: repluser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master51.000001

Read_Master_Log_Pos: 437

Relay_Log_File: host52relay-bin.000002

Relay_Log_Pos: 604

Relay_Master_Log_File: master51.000001

Slave_IO_Running: Yes #IO線程yes狀态

Slave_SQL_Running: Yes #SQL線程yes狀态

4)在主資料庫上添加授權使用者

隻需要在主伺服器上插入即可,因為你已經配置了主從同步

mysql> grant all on . to adminplj@"%" identified by “123qqq…A” ;

2.配置Mycat伺服器

準備一台主機做Mycat伺服器

修改mycat的schema.xml:

balance為1:讓全部的readHost及備用的writeHost參與select的負載均衡。

switchType為2:基于MySQL主從同步的狀态決定是否切換。

heartbeat:主從切換的心跳語句必須為show slave status。

1)修改server.xml

]# vim /usr/local/mycat/conf/server.xml

123456

TESTDB

user

TESTDB

true

2)修改 schema.xml

如果不知道配置标簽的含義請往上翻

我這裡隻配置了一個資料節點,一個資料主機(一主writeHost二從readHost)

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <writeHost host="hostM1" url="192.168.4.100:3306" user="adminplj" password="123qqq...A">
            <readHost host="hostS1" url="192.168.4.110:3306" user="adminplj" password="123qqq...A" > </readHost>
           
</writeHost>
    </dataHost>
</mycat:schema>
           

上面配置中,balance改為1,表示讀寫分離。

以上配置達到的效果就是192.168.4.100為主庫,192.168.4.110和192.168.4.120為從庫。

MyCat支援雙主多從,如果有N個主,那麼就配置N個writeHost兄弟節點;如果有M個從節點,那麼就配置M個readHost節點即可。

也可以有多台MySQL伺服器,或者SQL Server、Oracle等,配置多個dataHost節點就可以。

需要注意的是:

Mycat主從分離隻是在讀的時候做了處理,寫入資料的時候,隻會寫入到writehost,需要通過mycat的主從複制将資料複制到readhost!這個問題需要弄明白!!

如果沒有提前做mysql主從複制,會發現Mycat讀寫分離配置後,資料寫入writehost後,readhost一直沒有資料!因為Mycat就沒有實作主從複制的功能,畢竟資料庫本身自帶的這個功能才是最高效穩定的。

3)開啟mycat服務

[[email protected] ~]/usr/local/mycat/bin/mycat --help #檢視一下可以用的指令

Usage /usr/local/mycat/bin/mycat {console | start | stop | restart | status | dump}

[[email protected] ~]# /usr/local/mycat/bin/mycat start

Starting Mycat-server…

檢視服務狀态

[[email protected] ~]# netstat -utnlp | grep :8066 #檢視端口

tcp6 0 0 :::8066 ::😗 LISTEN 2924/java

[[email protected] ~]# ps -C java #檢視程序

PID TTY TIME CMD

2924 ? 00:00:01 java

3.Mycat連通性測試(重要)

測試授權使用者:在mycat主機,使用授權使用者分别連接配接3台資料庫伺服器,若連接配接失敗,請檢查資料庫伺服器是否有對應的授權使用者。确認三台資料庫伺服器可以使用

[[email protected] ~]# which mysql || yum -y install mariadb #安裝提供mysql指令的軟體包

//連接配接資料庫伺服器192.168.4.110

[[email protected] ~]# mysql -h192.168.4.110 -uadminplj -p123qqq…A

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 54

Server version: 5.7.17 MySQL Community Server (GPL)

mysql> exit; #連接配接成功 斷開連接配接

Bye

//連接配接資料庫伺服器192.168.4.120

[[email protected] ~]# mysql -h192.168.4.120 -uadminplj -p123qqq…A

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 47

Server version: 5.7.17 MySQL Community Server (GPL)

mysql> exit; #連接配接成功 斷開連接配接

Bye

#連接配接資料庫伺服器192.168.4.130

[[email protected] ~]# mysql -h192.168.4.130 -uadminplj -p123qqq…A

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 47

Server version: 5.7.17 MySQL Community Server (GPL)

mysql> exit; #連接配接成功 斷開連接配接

Bye

4.讀寫分離測試

講解一下測試流程:想确定讀寫是否分離,在從伺服器上插入一條資料,如果在mycat上可以讀到,則說明讀寫分離成功.

你在從伺服器上插入資料在主伺服器是讀不到的,但是mycat讀到了,說明讀請求确實交給了從伺服器

1)在從伺服器上插入資料

原資料庫上隻有一條資料,再插入一條資料

[[email protected] opt]# mysql -uroot -p123qqq…A

mysql> use db1

mysql> insert into test value(2);

Query OK, 1 row affected (0.05 sec)

mysql> select *from test;

±-----+

| id |

±-----+

| 1 |

| 2 |

±-----+

2 rows in set (0.00 sec)

2)連接配接mycat伺服器讀取

讀的到證明讀寫分離成功,如果覺得還不确定就在資料庫主伺服器上檢視是否記錄

[[email protected] opt]# mysql -h192.168.4.140 -P8066 -p123456

MySQL [TESTDB]> select *from test;  #在插入之前讀

±-----+

| id |

±-----+

| 1 |

±-----+

1 row in set (0.01 sec)

MySQL [TESTDB]> select *from test;  #插入之後讀

±-----+

| id |

±-----+

| 1 |

| 2 |

±-----+

2 rows in set (0.01 sec)

MySQL [TESTDB]> exit

Bye