天天看點

mysql主從複制和mycat讀寫分離1. Mycat讀寫分離

1. Mycat讀寫分離

資料庫讀寫分離對于大型系統或者通路量很高的網際網路應用來說,是必不可少的一個重要功能。對于MySQL來說,标準的讀寫分離是主從模式,一個寫節點Master後面跟着多個讀節點,讀節點的數量取決于系統的壓力,通常是1-3個讀節點的配置

Mycat讀寫分離和自動切換機制,需要mysql的主從複制機制配合。

1.1. Mysql的主從複制

主從配置需要注意的地方

1、主DB server和從DB server資料庫的版本一緻

2、主DB server和從DB server資料庫資料一緻[ 這裡就會可以把主的備份在從上還原,也可以直接将主的資料目錄拷貝到從的相應資料目錄]

3、主DB server開啟二進制日志,主DB server和從DB server的server_id都必須唯一

1.2. Mysql主伺服器配置

第一步:修改my.conf檔案:

在[mysqld]段下添加:

binlog-do-db=db1

binlog-ignore-db=mysql

#啟用二進制日志

log-bin=mysql-bin

#伺服器唯一ID,一般取IP最後一段

server-id=134

第二步:重新開機mysql服務

service mysqld restart

第三步:建立帳戶并授權slave

mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';

mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';

#一般不用root帳号,“%”表示所有用戶端都可能連,隻要帳号,密碼正确,此處可用具體用戶端IP代替,如192.168.145.226,加強安全。

重新整理權限

mysql> FLUSH PRIVILEGES;

檢視mysql現在有哪些使用者

mysql>select user,host from mysql.user;

第四步:查詢master的狀态

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      120 | db1          | mysql            |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set

1.3. Mysql從伺服器配置

第一步:修改my.conf檔案

[mysqld]

server-id=166

第二步:配置從伺服器

mysql>change master to master_host='192.168.25.134',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=120

注意語句中間不要斷開,master_port為mysql伺服器端口号(無引号),master_user為執行同步操作的資料庫賬戶,“120”無單引号(此處的120就是show master status 中看到的position的值,這裡的mysql-bin.000001就是file對應的值)。

第二步:啟動從伺服器複制功能

Mysql>start slave;

第三步:檢查從伺服器複制功能狀态:

mysql> show slave status

……………………(省略部分)

Slave_IO_Running: Yes //此狀态必須YES

Slave_SQL_Running: Yes //此狀态必須YES

……………………(省略部分)

注:Slave_IO及Slave_SQL程序必須正常運作,即YES狀态,否則都是錯誤的狀态(如:其中一個NO均屬錯誤)。

錯誤處理:

如果出現此錯誤:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

因為是mysql是克隆的系統是以mysql的uuid是一樣的,是以需要修改。

解決方法:

删除/var/lib/mysql/auto.cnf檔案,重新啟動服務。

以上操作過程,從伺服器配置完成。

1.4. Mycat配置

Mycat 1.4 支援MySQL主從複制狀态綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:

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

<dataNode name="dn2" dataHost="localhost1" database="db2" />

<dataNode name="dn3" dataHost="localhost1" database="db3" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">

<heartbeat>show slave status</heartbeat>

<writeHost host="hostM" url="192.168.25.134:3306" user="root"

password="root">

<readHost host="hostS" url="192.168.25.166:3306" user="root"

password="root" />

</writeHost>

</dataHost>

(1) 設定 balance="1"與writeType="0"

Balance參數設定:

1. balance=“0”, 所有讀操作都發送到目前可用的writeHost上。

2. balance=“1”,所有讀操作都随機的發送到readHost。

3. balance=“2”,所有讀操作都随機的在writeHost、readhost上分發

WriteType參數設定:

1. writeType=“0”, 所有寫操作都發送到可用的writeHost上。

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

3. writeType=“2”,所有寫操作都随機的在writeHost、readhost分上發。

 “readHost是從屬于writeHost的,即意味着它從那個writeHost擷取同步資料,是以,當它所屬的writeHost當機了,則它也不會再參與到讀寫分離中來,即“不工作了”,這是因為此時,它的資料已經“不可靠”了。基于這個考慮,目前mycat 1.3和1.4版本中,若想支援MySQL一主一從的标準配置,并且在主節點當機的情況下,從節點還能讀取資料,則需要在Mycat裡配置為兩個writeHost并設定banlance=1。”

(2) 設定 switchType="2" 與slaveThreshold="100"

switchType 目前有三種選擇:

-1:表示不自動切換

1 :預設值,自動切換

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

“Mycat心跳檢查語句配置為 show slave status ,dataHost 上定義兩個新屬性: switchType="2" 與slaveThreshold="100",此時意味着開啟MySQL主從複制狀态綁定的讀寫分離與切換機制。Mycat心跳機制通過檢測 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三個字段來确定目前主從同步的狀态以及Seconds_Behind_Master主從複制時延。“