1. 程式人生 > >MyCat 之路 | 配置 Mysql 讀寫分離+強制走寫節點+根據主從延時的讀寫分離

MyCat 之路 | 配置 Mysql 讀寫分離+強制走寫節點+根據主從延時的讀寫分離

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

這裡寫圖片描述

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

一、MyCat 的配置

從 Mycat 1.4 開始支援MySQL主從複製狀態繫結的讀寫分離機制,讓讀更加安全可靠,配置如下:

配置檔案的意思是:

  • 邏輯庫:small。邏輯表:tb_item;
  • Master伺服器上建立了一個數據庫:db1;
  • Slave伺服器同步Master伺服器的 db1 資料庫;
  • 寫請求都發送到Master伺服器;
  • 讀請求都發送到Slave伺服器。
[[email protected] conf]# vim schema.xml

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

        <schema name="small" checkSQLschema="false" sqlMaxLimit="100">
                <
table
name="tb_item" 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"> <heartbeat>select user()</
heartbeat
>
<writeHost host="hostM" url="mysql-server-01:3306" user="root" password="888888"> <readHost host="hostS" url="mysql-server-02:3306" user="root" password="888888" /> </writeHost> </dataHost> </mycat:schema>

二、測試

1、我們使用 Navicat 連線 MyCat 伺服器

這裡寫圖片描述

2、建立表

執行如下建表語句,執行之後可以看到Master伺服器上的資料庫 db1 中存在了 tb_item 表。再看看Slave伺服器上的 db1 資料庫中也存在了 tb_item 表。

-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;

CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同時也是商品編號',
  `title` varchar(100) NOT NULL COMMENT '商品標題',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品賣點',
  `price` bigint(20) NOT NULL COMMENT '商品價格,單位為:分',
  `num` int(10) NOT NULL COMMENT '庫存數量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品條形碼',
  `image` varchar(500) DEFAULT NULL COMMENT '商品圖片',
  `cid` bigint(10) NOT NULL COMMENT '所屬類目,葉子類目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品狀態,1-正常,2-下架,3-刪除',
  `created` datetime NOT NULL COMMENT '建立時間',
  `updated` datetime NOT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) COMMENT='商品表';
3、從插入資料
INSERT INTO TB_ITEM (
	ID,
	TITLE,
	SELL_POINT,
	PRICE,
	NUM,
	BARCODE,
	IMAGE,
	CID,
	STATUS,
	CREATED,
	UPDATED
)
VALUES
	(
		'15000000',
		'夏普(SHARP)LCD-52DS51A 52英寸 日本原裝液晶面板 內建WIFI智慧全高清液晶電視',
		'要好屏,選夏普!日本原裝面板,智慧電視,高畫質高音質!<a  target=\"blank\"  href=\"http://item.jd.com/1278664.html\">還有升級版安卓智慧新機52DS52供您選擇!</a>',
		'549900',
		'99999',
		NULL,
		'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg',
		'76',
		'1',
		'2015-03-08 21:27:45',
		'2015-03-08 21:27:45'
	);
4、測試讀寫分離

這裡寫圖片描述

附 1、讀寫分離的第二種配置方式

1、讀寫分離的第二種配置方式
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="small" checkSQLschema="false" sqlMaxLimit="100">
                <table name="tb_item" 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">
			<heartbeat>select user()</heartbeat>
			<writeHost host="hostM1" url="mysql-server-01:3306" user="root" password="888888"></writeHost>
			<writeHost host="hostS1" url="mysql-server-02:3306" user="root" password="888888"></writeHost>
		</dataHost>

</mycat:schema>

以上兩種配置方式,第一種當寫掛了讀不可用,第二種可以繼續使用。另外,事務內部的一切操作都會走寫節點,所以讀操作不要加事務。

2、強制走寫或讀節點

如果讀延時較大,我們可以使用MyCat註解的方式強制走寫節點。

繼續上面測試部分的第四小節:測試讀寫分離。接下來測試MyCat的註解方式。

這裡寫圖片描述

圖中可能看不清楚,強制走寫節點的語句如下:

/*#mycat:db_type=master*/ SELECT * FROM tb_item ;

另外,測試時發現強制走讀節點失敗,不知道為什麼,也沒有深究(實在沒有多少時間):

/*#mycat:db_type=slave*/ SELECT * FROM tb_item ;

附 2、根據主從延時切換

1、根據主從延時切換的配置

1.4 開始支援 MySQL 主從複製狀態繫結的讀寫分離機制,讓讀更加安全可靠,配置如下

  1. MyCAT 心跳檢查語句配置為 show slave status ;
  2. dataHost 上定義兩個新屬性:switchType="2" 和 slaveThreshold="100",此時意味著開啟 MySQL 主從複製狀態繫結的讀寫分離與切換機制;

Mycat 心跳機制通過檢測 show slave status 中的 "Seconds_Behind_Master""Slave_IO_Running""Slave_SQL_Running" 三個欄位來確定當前主從同步的狀態以及 Seconds_Behind_Master 主從複製時延。當 Seconds_Behind_Master > slaveThreshold 時,讀寫分離篩選器會過濾掉此 Slave 機器,防止讀到很久之前的舊資料。而當主節點宕機後,切換邏輯會檢查 Slave 上的 Seconds_Behind_Master 是否為 0,為 0 時則表示主從同步,可以安全切換,否則不會切換。

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

        <schema name="small" checkSQLschema="false" sqlMaxLimit="100">
                <table name="tb_item" dataNode="dn1" />
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        
		<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" 
							dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
			<heartbeat>show slave status </heartbeat>
			<writeHost host="hostM1" url="mysql-server-01:3306" user="root" password="888888"></writeHost>
			<writeHost host="hostS1" url="mysql-server-02:3306" user="root" password="888888"></writeHost>
		</dataHost>

</mycat:schema>
2、測試

將主節點(寫節點)停止,再插入一條資料,可以看到是可以插入的,此時寫節點已經關閉,讀節點出現了倆條資料:

這裡寫圖片描述

這裡寫圖片描述

另外,注意:將主節點重新啟動,MyCat 不會重新將其加入進來。(已親自試驗)

官方文件中有這麼一段:

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

相關推薦

MyCat | 配置 Mysql 分離+強制節點+根據主從分離

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

MyCat | Mysql分片的配置

需求及環境分析 1、需求 把 tb_item 表分片儲存到三個資料節點上。 2、安裝環境分析 一臺 mycat伺服器: mycat-server:10.73.150.4 兩臺 mysql 資料庫伺服器: mysql-server-01:10.73.150

[js高手]node js系列課程-創建簡易web服務器與文件

server 分享 回調 能夠 logs 瀏覽器中 文件 讀取 對象 web服務器至少有以下幾個特點: 1、24小時不停止的工作,也就是說這個進程要常駐在內存中 2、24小時在某一端口監聽,如: http://localhost:8080, www服務器默認端口80 3、要

編程MySql系列表之間的關系

OS tro sed 分享圖片 sca pla ces 部門 員工 foreign key 快速理解foreign key 員工信息表有三個字段:工號 姓名 部門 公司有3個部門,但是有1個億的員工,那意味著部門這個字段需要重復存儲,部門名字越長,越浪費 數據放一張

編程MySql系列多表查詢

所有 連接 進行 查看 bsp 關鍵字 right emp 字段 多表連接查詢 #重點:外鏈接語法 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; 交叉連接:不適用任何匹配條

毛毛Python進階6——MySQL 資料庫(二)

毛毛Python進階之路6——MySQL 資料庫(二) 一、對於自增 show create table 表名; # 查看錶是怎樣建立的。 show create table 表名\G; #將某個表旋轉90度 alter table 表名 AUTO_INCREMENT=

毛毛Python進階6——MySQL 資料庫(一)

毛毛Python進階之路6——MySQL 資料庫(一) DBMS 系統:資料庫管理系統。 一、安裝和下載: MySQL有兩種安裝方式,一種可執行檔案(點點點就可以),另一種是壓縮包式,需要有一定的基礎,比如新增環境變數,新增程序等等。 1、新增環境變數:計算機屬性-高階系統

Python-python(mysql介紹和安裝、pymysql、ORM sqlachemy)

轉載至:北極之光部落格 本節內容 1、資料庫介紹 2、mysql管理 3、mysql資料型別 4、常用mysql命令   建立資料庫   外來鍵   增刪改查表 5、事務 6、索引 7、python 操作mysq

webpack學習------配置多個 HTML 檔案

目錄結構: app.css body { background: pink; } contact.html <!DOCTYPE html> <html lang="en"> <head> <meta c

我的伺服器開發-安裝mysqlmariadb並更改資料庫路徑

centos最好安裝mariadb 輸入rpm -qa | grep mariadb 並沒有顯示版本號,則說明並沒有安裝mariadb 輸入yum remove mysql mysql-server mysql-libs可完全解除安裝mysql相關,但是記得要重新安裝之前p

我的Python成長--Day48--mysql高階(檢視、觸發器、事物、儲存過程、函式、流程控制、資料備份與恢復)

目錄 1、檢視 2、觸發器 3、事物 自定義函式 1、檢視 1.1、什麼是檢視 檢視是一張表或者多張表的查詢結果構成的一張虛擬表

java架構-(mysql底層原理)Mysql事務隔離與MVCC

  上幾篇部落格我們大致講了一下mysql的底層結構,什麼B+tree,什麼Hash需要回行啊,再就是講了mysql優化的explain,這次我們來說說mysql的鎖。 mysql鎖   鎖從效能上分為樂觀鎖(用版本對比來實現)和悲觀鎖,樂觀鎖的效能要比悲觀鎖高。   從對資料庫操作的型別分,分為讀鎖和寫

雲計算-阿裏雲上:重啟 manager 節點引發 docker swarm 集群宕機

node bili body 運行 nodes 服務 徹底 解決 ability 為了迎接春節假期後的訪問高峰,我們今天對 docker swarm 集群進行了變更操作,購買了1臺阿裏雲4核8G的服務器作為 worker 節點,由原來的 3 manager nodes +

雲計算-阿裏雲上:3個manager節點異常造成 docker swarm 集群宕機

線索 logs 遇到 log 我們 控制臺 之路 服務 cnblogs 今天 11:29 - 11:39 左右,docker swarm 集群 3 個 manager 節點同時出現異常,造成整個集群宕機,由此給您帶來很大的麻煩,請您諒解。 受此次故障影響的站點有:博問,閃

資料結構學習----------線性表順序儲存結構插入和刪除節點平均移動次數

假設線性表的長度為n。 首先來說線性表順序儲存的插入問題: 線性表元素有n個,那麼插入位置有n+1個。 插入第一個位置需要移動n個,第二個需要移動n-1個,第三個需要移動n-2個。以此類推,總共移動次數為n+(n-1)+(n-2)+...+2+1+0=(n+1)*n/2。

MySQL主從復制

mysql sql_delay master slave MySQL的主從復制是實現MySQL大規模集群的基礎,其在日常生產環境中被廣泛的被應用,而在MySQL5.6開始對MySQL的底層代碼不斷的重構完善後在MySQL的主從復制取得極大的進步,且在5.7版本引入主從多線程復制(htt

日常管理03-監控MYSQL主從3秒腳本;

urn print inf lines ssa utf message lru mes #!/bin/env python # -*- encoding: utf-8 -*- import time import os import sys import json impo

Mysql 主從監控

介紹 主從延時在主從環境中是一個非常值得關注的問題,有時候我們可以通過show slave status命令檢視Seconds_Behind_Master值來分析主從的延時情況;但是由於該值是來自binlog檔案語句的完成時間,當一條SQL執行時間很長的時候那麼該值可能就不準確了,那麼有沒有什麼工具可以

c類似C++ 類寫法--可以的很精簡

#include<stdio.h> #include <unistd.h> #define  uchar unsigned char  #define TASKNUM 2 typedef struct TimerInfo{uchar id;uchar