Linux安裝Mycat1.6.7.4並實現Mysql數據庫讀寫分離簡單配置


1. Mycat簡介

  • 一個徹底開源的,面向企業應用開發的大數據庫集群
  • 支持事務、ACID、可以替代MySQL的加強版數據庫
  • 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
  • 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
  • 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
  • 一個新穎的數據庫中間件產品
    官網:http://www.mycat.org.cn/

2. Mycat優勢

  基於阿里開源的Cobar產品而研發,Cobar的穩定性、可靠性、優秀的架構和性能以及眾多成熟的使用案例使得MYCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,我們能看到更遠。業界優秀的開源項目和創新思路被廣泛融入到Mycat的基因中,使Mycat在很多方面都領先於目前其他一些同類的開源項目,甚至超越某些商業產品。
  Mycat背后有一支強大的技術團隊,其參與者都是5年以上軟件工程師、架構師、DBA等,優秀的技術團隊保證了Mycat的產品質量。
  Mycat並不依托於任何一個商業公司,因此不像某些開源項目,將一些重要的特性封閉在其商業產品中,使得開源項目成了一個擺設。

3. 前期准備

# yum源安裝
yum search jdk

yum -y install java-1.8.0-openjdk.x86_64

# 查看jsk版本
java -version

4. 安裝Mycat

# 進入安裝包所在目錄
cd /opt

# 解壓
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

# 改名(可忽略)
mv mycat/ mycat-1.6.7.4

# 移動到/usr/local目錄
mv mycat-1.6.7.4/ /usr/local/

5. 配置(一主一從)

# 進入配置文件目錄,並查看文件
cd /usr/local/mycat-1.6.7.4/conf

ls

# 修改server.xml
vi server.xml

# 修改底部管理員用戶和只讀用戶信息及密碼,配置schemas
<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
    <property name="defaultSchema">TESTDB</property>
</user>

<user name="user">
    <property name="password">user</property>
    <property name="schemas">TESTDB</property>
    <property name="readOnly">true</property>
    <property name="defaultSchema">TESTDB</property>
</user>

# 退出並保存
:wq

# 修改schema.xml
vi schema.xml

# 替換為以下內容
# 其中192.168.133.129為寫主機(主數據庫)IP,192.168.133.130為讀主機(從數據庫)IP。
<?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="host1" database="test" />
	<dataHost name="host1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.133.129:3306" user="root" password="password">
			<readHost host="hostS1" url="192.168.133.130:3306" user="root" password="password" />
		</writeHost>
	</dataHost>
 
</mycat:schema>

# 退出並保存
:wq

  dataHost節點中的balance(負載均衡類型)屬性值共四種情況:

  • 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"
      所有讀請求隨機的分發到readhost 執行,writerHost不負擔讀壓力。

6. 啟動並測試(一主一從)

# 啟動
cd /usr/local/mycat-1.6.7.4/bin/
./mycat start

# 查看啟動狀態
./mycat status

# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld

# 關閉防火牆
systemctl stop firewalld

# 使用工具連接
# IP:192.168.133.132
# 端口:8066
# 用戶名:root
# 密碼:123456

# 創建測試表
create table t_data(`id`int not null primary key auto_increment, `value` varchar(255));

# 插入一條記錄
insert into t_data(`value`) values('C3Stones');

# 查詢
select * from t_data;

# 模擬主從數據庫不一致情況,驗證數據庫讀寫分離
# 查詢主從數據庫所在的服務器主機名稱是否一致
hostname

# 若一致,可修改為不同的主機名
# 分別在不同的主機上執行
vi /etc/hostname

# 修改為不同的名稱,並保存
# 例如:Mysql01、Mysql02

# 修改完重啟
reboot

# 重啟之后檢查
# 檢查hostname
hostname

# 檢查mysql服務
mysql -uroot -p

# 啟動mysql
service mysql start

# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld

# 關閉防火牆
systemctl stop firewalld

# 檢查從數據庫同步狀態
mysql -uroot -p -h192.168.133.130 -P3306

show slave status\G

# 如果參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則正常

# 使用Mycat插入一條記錄,但使用變量,造成主從數據庫不一致情況
insert into t_data(`value`) values(@@hostname);

# 查詢(查詢結果與上述schema.xml中dataHost節點配置的balance屬性有關)
# 上述配置值為2,即讀操作在主從數據庫上分發
select * from t_data;

7. 配置(雙主雙從)

# 修改schema.xml
vi schema.xml

# 替換為以下內容
# 其中192.168.133.129為寫主機1(主數據庫1)IP,192.168.133.130為讀主機1(從數據庫1)IP,192.168.133.131為寫主機2(主數據庫2)IP,192.168.133.132為讀主機2(從數據庫2)IP。
<?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="host1" database="test" />
	<dataHost name="host1" 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.133.129:3306" user="root" password="password">
			<readHost host="hostS1" url="192.168.140.130:3306" user="root" password="password" />
	</writeHost>
	<writeHost host="hostM2" url="192.168.140.131:3306" user="root" password="password">
		<readHost host="hostS2" url="192.168.140.132:3306" user="root" password="password" />
	</writeHost>
 
</mycat:schema>

  dataHost節點中的屬性值解釋:

  • balance
      balance="1",全部的readHost與stand by writeHost參與select語句的負載均衡;
  • writeType
      writeType="0" ,所有寫操作發送到配置的第一個writeHost,第一個掛了切到正常的第二個writeHost;writeType="1",所有寫操作都隨機的發送到配置的 writeHost,1.5版本后不推薦使用。
  • writeHost
      Mycat重新啟動后以切換后的為准,即可能因為寫主機異常而發送寫主機變動的情況,切換記錄在配置文件中:dnindex.properties。
  • switchType
      switchType="1",默認值,自動切換;switchType="-1",表示不自動切換;switchType="2",基於Mysql 主從同步的狀態決定是否切換。

8. 啟動並測試(雙主雙從)

# 重新啟動
cd /usr/local/mycat-1.6.7.4/bin/
./mycat restart

# 查看啟動狀態
./mycat status

# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld

# 關閉防火牆
systemctl stop firewalld

# 使用工具連接
# IP:192.168.133.132
# 端口:8066
# 用戶名:root
# 密碼:123456

# 創建測試表
create table t_data2(`id`int not null primary key auto_increment, `value` varchar(255));

# 插入一條記錄
insert into t_data2(`value`) values('C3Stones');

# 查詢
select * from t_data2;

# 模擬主從數據庫不一致情況,驗證數據庫讀寫分離
# 查詢主從數據庫所在的服務器主機名稱是否一致
hostname

# 若一致,可修改為不同的主機名
# 分別在不同的主機上執行
vi /etc/hostname

# 修改為不同的名稱,並保存
# 例如:Mysql01、Mysql02、Mysql03、Mysql04

# 修改完重啟
reboot

# 重啟之后檢查
# 檢查hostname
hostname

# 檢查mysql服務
mysql -uroot -p

# 啟動mysql
service mysql start

# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld

# 關閉防火牆
systemctl stop firewalld

# 檢查數據庫同步狀態
mysql -uroot -p -h192.168.133.129 -P3306
show slave status\G

mysql -uroot -p -h192.168.133.130 -P3306
show slave status\G

mysql -uroot -p -h192.168.133.131 -P3306
show slave status\G

mysql -uroot -p -h192.168.133.132 -P3306
show slave status\G

# 如果參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則正常

# 使用Mycat插入一條記錄,但使用變量,造成主從數據庫不一致情況
insert into t_data2(`value`) values(@@hostname);

# 查詢(查詢結果與上述schema.xml中dataHost節點配置的balance屬性有關)
# 上述配置值為1,即讀操作在主數據庫2、從數據庫1、從數據庫2數據庫上分發
select * from t_data2;

9. 高可用測試(雙主雙從)

# 停止主數據庫1
service mysql stop

# Mycat查詢
select * from t_data2;

# 再次插入數據
insert into t_data2(`value`) values(@@hostname);

# Mycat查詢
select * from t_data2;

# 啟動主數據庫1
service mysql start

# Mycat查詢
# 讀操作在主數據庫1、從數據庫1、從數據庫2數據庫上分發
select * from t_data2;

  雙主雙從環境下,Master1、Master2互做備機,負責寫的主機宕機,備機切換負責寫操作,保證了數據庫讀寫分離的高可用性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM