1. 程式人生 > >Linux下mysql基於MyCat實現主從復制和讀寫分離

Linux下mysql基於MyCat實現主從復制和讀寫分離

mycat

1.1 MyCat介紹及應用場景
MyCat介紹
MyCat是一個開源的分布式數據庫系統,是一個實現了MySQL協議的服務器,前端用戶可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL服務器裏或者其他數據庫裏。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat裏,都是一個傳統的數據庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度

Mycat的應用場景
1.單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換;
2.分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片;
3.多租戶應用,每個應用一個庫,但應用程序只連接Mycat,從而不改造程序本身,實現多租戶化;
4.表系統,借助於Mycat的分表能力,處理大規模報表的統計;
5.代替Hbase,分析大數據;
6.作為海量數據實時查詢的一種簡單有效方案,比如 1〇〇億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇;
7.單純的MyCAT讀寫分離,配置最為簡單,支持讀寫分離,主從切換分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片;

8.多租戶應用,每個應用一個庫,但應用程序只連接Mycat,從而不改造程序本身,實現多租戶化;
9報表系統,借助於Mycat的分表能力,處理大規模報表的統計替代Hbase,分析大數據,作為海量數據實時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內查詢出來結果,
除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇。

MyCAT最新開源版本下載,項目主頁:
https://github.com/MyCATApache/
MyCAT 二進制包下載:
http://dl.mycat.io
MyCAT 文檔下載:
https://github.com/MyCATApache/Mycat-doc

1.2 搭建環境服務器規劃說明
操作系統:CentOS Linux release 7.4.1708 (Core)
JDK版本:jdk1.8.0_161
MyCat版本:Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
MyCat節點IP:192.168.1.203
MySQL版本:mysql-5.6.39
Mycat的server和mysql的從庫位於同一臺服務器,centos7.3環境
Mycat:192.168.1.101 數據庫中間件主機 主機名 mycat
Mysql1: 192.168.1.102 數據庫主庫Master 主機名mysql-master
Mysql2:192.168.1.103 數據庫主庫slave 主機名mysql-slave
Mysql3:192.168.1.101 數據庫叢庫Slave 主機名mycat
配置hosts文件
[root@bogon ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101 mycat
192.168.1.102 mysql-master
192.168.1.103 mysql-slave

1.3 MySQL安裝及配置主從
MySQL安裝
Mysql yum安裝(為了省時間,這裏我們yum安裝)
[root@bogon ~]# yum list installed | grep maria 卸載卸載自帶mariadb
mariadb-libs.x86_64 1:5.5.52-1.el7 @base
[root@bogon ~]# yum -y remove mariadb-libs卸載
安裝不能直接這樣安裝,不然你安裝的還是mariadb
安裝MYSQL5.6
CentOS 7之後的版本yum的默認源中使用MariaDB替代原先MySQL,因此安裝方式較為以往有一些改變:
第一部分:CentOS 7安裝MySQL 5.6
yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm安裝MySQL的yum源
yum -y install mysql mysql-devel mysql-server mysql-utilities安裝MySQL
[root@mysql-master ~]# systemctl start mysqld.service 啟動MySQL 啟動MySQL服務
[root@mysql-master ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :22 : users:(("sshd",pid=1139,fd=3))
LISTEN 0 80 :::3306 :::
users:(("mysqld",pid=3279,fd=11))
LISTEN 0 128 :::22 :::* users:(("sshd",pid=1139,fd=4))
[root@mysql-master ~]# /usr/bin/mysql_secure_installation初始化數據庫

MySQL主從搭建配置
192.168.1.102 mysql-master
192.168.1.103 mysql-slave
192.168.1.101 mysql-slave
1.首先要開啟主數據庫的binlog功能:(主庫從庫的server-id不能相同)
[root@mysql-master ~]##egrep "log_bin|server_id" /etc/my.cnf
server_id = 1
log_bin=mysql-bin

egrep "log_bin|server_id" /etc/my.cnf

server_id = 2
log_bin=mysql-bin
[root@mycat ~]## egrep "log_bin|server_id" /etc/my.cnf
server_id = 3
log_bin=mysql-bin
192.168.1.102服務器master主庫3306已經開啟binlog功能,192.168.1.103 192.168.1.101服務器從庫slave 3306開啟binlog功能
192.168.1.102服務器master主庫操作
mysql> show variables like "server_id";
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| server_id | 1
+---------------+----------+
1 row in set (0.00 sec)

mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)

2.在192.168.1.102主庫給192.168.1.103 192.168.1.101從庫授權主從復制賬戶
mysql> grant replication slave on . to ‘rep‘@‘192.168.1.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for rep@‘192.168.1.%‘;;查看rep用戶權限
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected].% |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON . TO ‘rep‘@‘192.168.1.%‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3.主庫記錄pos位置點:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 564| | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

  1. 192.168.101從庫配置連接主庫
    mysql>
    change master to master_host=‘192.168.1.102‘,master_user=‘rep‘,master_password=‘123456‘, master_log_file=‘mysql-bin.000002‘,master_log_pos=564;
  2. 192.168.101從庫開啟同步開關:
    start slave;
    Query OK, 0 rows affected (0.03 sec)
    192.168.101從庫查看slave狀態:驗證主從同步是否正常(正常應該為兩個yes)
    [root@mycat ~]# mysql -uroot -p123456 -e "show slave status\G"|egrep "Yes|Behind"
    Warning: Using a password on the command line interface can be insecure.
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: 0

  3. 192.168.1.103從庫配置連接主庫
    mysql>
    change master to master_host=‘192.168.1.102‘,master_user=‘rep‘,master_password=‘123456‘, master_log_file=‘mysql-bin.000002‘,master_log_pos=564;
  4. 192.168.1.103從庫開啟同步開關:
    start slave;
    Query OK, 0 rows affected (0.03 sec)
    192.168.1.103從庫查看slave狀態:驗證主從同步是否正常(正常應該為兩個yes)
    [root@mysql-slave ~]# mysql -uroot -p123456 -e "show slave status\G"|egrep "Yes|Behind"
    Warning: Using a password on the command line interface can be insecure.
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: 0

MYSQL主庫從庫實時同步測試
在192.168.1.102主庫創建mycat_test mysql_test數據庫
在MYSQL1主庫上創建兩個數據庫
mysql> create database mycat_test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mycat_test |
| mysql |
| mysql_test |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)

在在192.168.1.102從庫查看是否有mycat_test mysql_test數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mycat_test |
| mysql |
| mysql_test |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)
在在192.168.1.102從庫查看是否有mycat_test mysql_test數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mycat_test |
| mysql |
| mysql_test |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)
在在192.168.1.102主庫主庫上創建mycat_test mysql_test兩個數據庫作為分片數據庫
準備Mycat所需要的用戶
mycat需要兩個用戶用來執行用戶通過mycat執行的操作,當程序需要對表進行查詢操作時,mycat將會使用mycat_r進行執行查詢,當然你肯定很疑惑,明明用mycat_w進行查詢不是更好嗎,先不要急,慢慢往下看
用戶名(名字可以DIY) 權限 作用
mycat_r SELECT,EXECUTE mycat用來執行查詢數據
mycat_w CREATE,DELECT,INSERT,SELECT,UPDATE,DROP mycat用來執行增刪改查

mysql> GRANT CREATE,DELETE,INSERT,SELECT,UPDATE,DROP ON . TO ‘mycat_w‘@‘%‘ IDENTIFIED BY ‘mycat_w‘;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT ON . TO ‘mycat_r‘@‘%‘ IDENTIFIED BY ‘mycat_r‘;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

創建完畢後查詢權限:
mysql> show grants for mycat_r@‘%‘;
+---------------------------------------------------------------------------------------------------------+
| Grants for mycat_r@% |
+---------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON . TO ‘mycat_r‘@‘%‘ IDENTIFIED BY PASSWORD ‘*D725A7BAA54B53033B1ECB9C72130E1F1B9CFFBA‘ |
+---------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for mycat_w@‘%‘;
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for mycat_w@% |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON . TO ‘mycat_w‘@‘%‘ IDENTIFIED BY PASSWORD ‘*081A240A9BF3E6235C18EE43622D0FE948D4240F‘ |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
檢查Mysql2 Mysql3從庫這個用戶有沒有同步過來:
[root@mysql-slave ~]# mysql -uroot -p123456 -e "select user,host from mysql.user;"
Warning: Using a password on the command line interface can be insecure.
+---------+-------------+
| user | host |
+---------+-------------+
| mycat_r | % |
| mycat_w | % |
| root | 127.0.0.1 |
| rep | 192.168.1.% |
| root | 192.168.1.% |
| root | ::1 |
| root | localhost |
+---------+-------------+
[root@mycat conf]# mysql -uroot -p123456 -e "select user,host from mysql.user;"
Warning: Using a password on the command line interface can be insecure.
+---------+-------------+
| user | host |
+---------+-------------+
| mycat_r | % |
| mycat_w | % |
| root | % |
| root | 127.0.0.1 |
| rep | 192.168.1.% |
| root | 192.168.1.% |
| root | ::1 |
| root | localhost |
+---------+-------------+
1.4 MyCat安裝
mycat是使用java語言開發的,需要先安裝java運行環境,由於mycat中使用了JDK7中的一些特性,所以要求JDK7以上的版本才能運行。
JDK下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
MyCAT最新開源版本下載,項目主頁:
https://github.com/MyCATApache/
MyCAT 二進制包下載:
http://dl.mycat.io
MyCAT 文檔下載:
https://github.com/MyCATApache/Mycat-doc

1.JDK安裝
#wget http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.rpm
[root@mycat ~]# rpm -ivh jdk-8u161-linux-x64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8-2000:1.8.0_161-fcs ################################# [100%]
2.JDK配置環境變量

vi /etc/profile

#JDK Environment Variables
export JAVA_HOME=/usr/java/1.8.0_161
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH:$JRE_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
使配置生效

source /etc/profile

測試JDK
[root@mycat ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

3.創建MyCAT用戶及組
創建一個新的group
groupadd mycat
創建一個新的用戶,並加入group
useradd -g mycat mycat
給新用戶設置密碼,
passwd mycat
Changing password for user mycat.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
chown -R mycat.mycat /usr/local/mycat/

  1. MyCAT安裝
    獲取MyCAT的最新開源版本,項目主頁http://dl.mycat.io/
    目前最新MyCAT二進制包下載地址:
    http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
    MySQL 下載:
    http://dev.mysql.com/downloads/mysql/5.6.html#downloads
    (註:MyCAT支持多種數據庫接入,如:MySQL、SQL Server、Oracle、MongoDB等. 推薦使用MySQL做集群.)
    環境安裝與配置
    如果是第一次剛接觸MyCat建議下載源碼在本地通過eclipse等工具進行配置和運行,便於深入了解和調試程序運行邏輯。

在Linux(Unix)下,建議放在/usr/local/mycat目錄下,如下面類似的:
[root@mycat ~]# tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
[root@mycat ~]# ll /usr/local/mycat/
total 12
drwxr-xr-x 2 root root 190 Mar 11 02:19 bin
drwxrwxrwx 2 root root 6 Mar 1 2016 catlet
drwxrwxrwx 4 root root 4096 Mar 11 02:19 conf
drwxr-xr-x 2 root root 4096 Mar 11 02:19 lib
drwxrwxrwx 2 root root 6 Jan 22 22:01 logs
-rwxrwxrwx 1 root root 219 Jan 22 22:00 version.txt

5.設置mycat環境變量
vim /home/mycat/.bash_profile
export MYCAT_HOME=/usr/local/mycat
PATH=$PATH:$MYCAT_HOME/bin
令修改生效
[mycat@c1 ~]$ source .bash_profile
測試是否配置成功
[mycat@c1 ~]$ echo $MYCAT_HOME

Mycat的相關的配置文件:
/usr/local/mycat/
├── bin
│ ├── mycat ##mycat的啟動文件,mycat {stop,start,restart,console}
│ ├── ...
├── catlet
├── conf
│ ├── log4j2.xml ##這個配置文件用來配置mycat日誌打印級別
│ ├── schema.xml ##讀寫分離和切片需要配置的主要文件
│ ├── schema.xml.bk ##備份
│ ├── server.xml ##定義了讀寫分離時mycat的user,共包括兩個標簽:user,system
│ ├── server.xml.bk ##備份
│ ├── ...
├── lib ##這裏是java部分,不懂java略過
│ ├── asm-4.0.jar
│ ├── commons-collections-3.2.1.jar
│ ├── commons-lang-2.6.jar
│ ├── ...
├── logs
│ ├── mycat.log ##mycat的執行過程日誌
│ ├── mycat.pid ##PID文件
│ └── wrapper.log ##啟動日誌,報錯信息
└── version.txt

配置文件解釋:

--bin 啟動目錄
--conf 配置文件存放配置文件:
--server.xml:是Mycat服務器參數調整和用戶授權的配置文
--schema.xml:是邏輯庫定義和表以及分片定義的配置文件。
--rule.xml: 是分片規則的配置文件,分片規則的具體一些參數信息單獨存放為文件,也在這個目錄下,配置文件修改需要重啟MyCAT。
--log4j.xml: 日誌存放在logs/log中,每天一個文件,日誌的配置是在conf/log4j.xml中,根據自己的需要可以調整輸出級別為debug
debug級別下,會輸出更多的信息,方便排查問題。
--autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相關的id分片規則配置文件
--lib MyCAT自身的jar包或依賴的jar包的存放目錄。
--logs MyCAT日誌的存放目錄。日誌存放在logs/log中,每天一個文件
1.5 MyCat配置
Mycat的相關的配置文件:
/usr/local/mycat/
├── bin
│ ├── mycat ##mycat的啟動文件,mycat {stop,start,restart,console}
│ ├── ...
├── catlet
├── conf
│ ├── log4j2.xml ##這個配置文件用來配置mycat日誌打印級別
│ ├── schema.xml ##讀寫分離和切片需要配置的主要文件
│ ├── schema.xml.bk ##備份
│ ├── server.xml ##定義了讀寫分離時mycat的user,共包括兩個標簽:user,system
│ ├── server.xml.bk ##備份
│ ├── ...
├── lib ##這裏是java部分,不懂java略過
│ ├── asm-4.0.jar
│ ├── commons-collections-3.2.1.jar
│ ├── commons-lang-2.6.jar
│ ├── ...
├── logs
│ ├── mycat.log ##mycat的執行過程日誌
│ ├── mycat.pid ##PID文件
│ └── wrapper.log ##啟動日誌,報錯信息
└── version.txt

配置文件解釋:

--bin 啟動目錄
--conf 配置文件存放配置文件:
--server.xml:是Mycat服務器參數調整和用戶授權的配置文
--schema.xml:是邏輯庫定義和表以及分片定義的配置文件。
--rule.xml: 是分片規則的配置文件,分片規則的具體一些參數信息單獨存放為文件,也在這個目錄下,配置文件修改需要重啟MyCAT。
--log4j.xml: 日誌存放在logs/log中,每天一個文件,日誌的配置是在conf/log4j.xml中,根據自己的需要可以調整輸出級別為debug
debug級別下,會輸出更多的信息,方便排查問題。
--autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相關的id分片規則配置文件
--lib MyCAT自身的jar包或依賴的jar包的存放目錄。
--logs MyCAT日誌的存放目錄。日誌存放在logs/log中,每天一個文件

server.xml 包含了mycat的系統配置信息,分別兩個標簽user,system,是mycat的調優關鍵
schema.xml 涵蓋了Mycat的邏輯庫,表,分片規則,分片節點及數據源

首先配置mycat讀寫分離時你需要清楚添加mycat結構後是一個什麽樣的結構,也就是本來沒使用Mycat之前你的結構是nginx或者Apache直接訪問,之前是做mysql的用戶驗證,但是現在不同的是你現在需要找Mycat這哥們去做認證了,也就是你剛才創建的mysql_r還有w都是在給mycat打工,那麽這個時候我們需要在mycat上配置一個用戶供nginx等程序連接

配置認證用戶server.xml
[root@mycat ~]## vim /usr/local/mycat/conf/server.xml
<user name="mycat_w"> ##這裏我定義一個用戶mycat_w,這個用戶主要執行增刪改查操作
<property name="password">mycat_w</property> ##他的密碼我定義為和他名字相同
<property name="schemas"> mycat_test, mysql_test</property> ##和schema.xml裏的schema對應,多個用schma用“,”隔開
</user>
<user name="mycat_r"> ##這裏我定義一個用戶mycat_r,對於連接到這個用戶的人,只能執行查詢操作
<property name="password">mycat_r</property> ##定義密碼
<property name="schemas">mycat_test, mysql_test </property> ##和schema.xml裏的schema對應
<property name="readOnly">true</property> ##只讀
</user>

配置內存
使用最新JDK,比如JDK8
? system.xml中的processor參數設置為CPU核心數的2×4倍
? Linux主機的網絡性能優化
? mycat所在服務器多網卡綁定,bond技術,增加網絡吞吐量
? 合適的大內存,conf/wrapper.conf中修改
wrapper.java.additional.5=-XX:MaxDirectMemorySize=1G
wrapper.java.initmemory=1024
wrapper.java.maxmemory=1024

配置數據源schma.xml
認證用戶配置完成後,配置schma.xml
這個配置文件裏面對與讀寫分離來說需要配置的點有schema,dataNode,dataHost。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<dataNode name="dn1" dataHost="localhost1" database="mycat_test"> </dataNode>
<dataNode name="dn2" dataHost="localhost1" database="mysql_test"> </dataNode>

基本的邏輯是這樣的: 當用戶認證mycat訪問後,首先讀取定義的schemas表裏的mycat_test,而mycat_test只是mycat裏的邏輯數據庫名字,也就是你連上mycat後所看到的數據庫名字,他不一定是真實數據庫名字,因為pmycat_test來自schema.xml上的schema進行的定義,mycat_test應著DataNode裏的dn1,dn1是上定義了後端數據庫真實的數據庫名和datahost。 到以上幾部基本上請求通過mycat已經知道了他的真實數據庫名字,但是似乎還不知道這些庫在哪些主機上。是的你可能看到了DataNode上有datahost,我第一次配置的時候就以為這個東西是需要我寫詳細的主機IP,但是這裏也是一個邏輯的地址,這裏賜予他法號:locahost1,這裏的localhost1代表一個數據庫架構,他可能是一主多從,多主多從等等具體他是什麽架構繼續往下配置datahost標簽: select user() name:這裏的name對應DataNode1的datahost,唯一標示datahost,供上層標簽使用 maxCon:指定每個讀寫實例連接池的最大連接數。內嵌writeHost、readHost,都會使用這個屬性的值來實例化連接池的做大連接數 minCon:初始化最初連接池的大小 balance:負載均衡類型,目前有四種值 balance="0": 不開啟讀寫分離機制,所有操作都發送到當前可用的writeHost上 balance="1": 全部的readHost與雙主模式下備用writeHost都參與select語句的負載均衡,簡而言之在雙主雙主雙從模式下(M1->S1 M2->S2 M1和M2互為主備)時,M2、S1、S2都會參與select語句的負載均衡 balance="2" 所有的讀操作都隨機在writeHost和readHost上分發 balance="3" 所有的讀請求都隨機分發到writeHost對應的readHost上執行,writeHost不負擔讀壓力,註意balance=3只在Mycat 1.4版本及以後中有 writeType="0", 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 writeHost,重新啟動後,不會再切回來,切換記錄在配置文件中:dnindex.properties . switchType 故障自動切換下臺可用writeHost屬性 switchType="-1" 表示不自動切換 switchType="1" 默認值,表示自動切換 switchType="2" 表示基於MySQL主從同步狀態決定切換,心跳語句:show slave status switchType="3" 表示基於MySQL Galary Cluster的切換機制,1.4.1以上支持 心跳語句:show status like ‘wsrep%‘ 配置完上面負載均衡等策略之後開始正式配置具體數據庫真實IP位置,以及一主多從或其他架構 到這一部基本上讀寫分離的配置就已經說完了,剛開始我理解的時候,也是很繞,但是當你理解了之後你可能就明白了,其實很簡單。 現在待著需求去完整的看一下配置文件的內容吧(讀寫分離無關的無分片需求可以全部刪掉,我的已經刪掉) 總覽配置文件理清思路 需求: 一主兩從架構,基於主從復制。通過mycat去配置成通過mycat的用戶www和rrr連接管理三個數據庫“pcard,job,shop”,讀請求全部交給兩臺從機來處理,寫請求交給Master來處理。 [root@mycat conf]# cat /usr/local/mycat/conf/schema.xml select user() 當前配置缺陷 目前這個配置,如果Master如果發生宕機,那麽整個MySQL將不能讀和寫,你可能很疑惑,我寫主機宕機,但是我從機是正常的啊。這個是mycat的一個定義,如果當前wirteHost內hostM1發生故障整個writeHost將全部失效,讀和寫都不能使用,為了防止這種現象,我們可以在當前內再添加一個writeHost,作為故障轉移節點,當正在使用的出現故障後,立即切換到這個備用節點上,為了防止他讀取都不行,我們設置從機備用節點的主,為了保證數據一致性,給予讀取權限即可 配置完畢後啟動mycat [root@mycat mycat]# # ./mycat start [root@mycat mycat]# # netstat -tunlp|grep 8066 ##數據端口,增刪改查連接此端口 tcp 0 0 :::8066 :::* LISTEN 5308/java [root@Mycat01 bin]# netstat -tunlp|grep 9066 ##管理mycat連接該端口 tcp 0 0 :::9066 :::* LISTEN 5308/java 若啟動不成功則查看錯誤日誌,或者使用./mycat console查看報錯 [root@mycat mycat]# # tail -f /usr/local/mycat/logs/wrapper.log ##方法一,看錯誤日誌 [root@mycat mycat]# # ./mycat console #方法二,看錯誤被拋出 判斷讀寫分離是否成功 可以分析mycat執行日誌,首先將mycat的日誌級別改為“debug”分析執行過程 [root@mycat mycat]# # cd /usr/local/mycat/conf [root@Mycat01 conf]# vim log4j2.xml +25 ... ... [root@mycat mycat]#]# tail -f ../logs/mycat.log 1.6 MyCat讀寫分離 登錄 mysql-master主庫 mysql> use mycat_test; 切換到mycat_test庫 創建Travelrecord表 mysql> create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int); Query OK, 0 rows affected (0.09 sec) 插入數據 mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(1,@@hostname,20180312,00,27); Query OK, 1 row affected, 1 warning (0.00 sec) 插入數據 mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,27); Query OK, 1 row affected, 1 warning (0.00 sec) [root@mycat conf]# mysql -umycat_w -pmycat_w -h192.168.1.101 -P9066顯示數據源的信息,是否是讀寫節點等。 mysql> show datasource; +----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.102 | 3306 | W | 0 | 11 | 1000 | 89 | 8 | 1 | | dn1 | hostM2 | mysql | 192.168.1.102 | 3306 | W | 0 | 1 | 1000 | 69 | 0 | 0 | | dn1 | hostS2 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 | | dn1 | hostS3 | mysql | 192.168.1.103 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 | | dn1 | hostS4 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 | | dn2 | hostM1 | mysql | 192.168.1.102 | 3306 | W | 0 | 11 | 1000 | 89 | 8 | 1 | | dn2 | hostM2 | mysql | 192.168.1.102 | 3306 | W | 0 | 1 | 1000 | 69 | 0 | 0 | | dn2 | hostS2 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 | | dn2 | hostS3 | mysql | 192.168.1.103 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 | | dn2 | hostS4 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 | +----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+ 10 rows in set (0.01 sec) mysql> show datanode; 顯示數據節點的訪問情況,包括每個數據節點當前活動連接數(active),空閑連接數(idle)以及最大連接數(maxCon) size,EXECUTE參數表示從該節點獲取連接的次數,次數越多,說明訪問該節點越多。 +------+-----------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME | +------+-----------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | dn1 | localhost1/mycat_test | 0 | mysql | 0 | 3 | 1000 | 35 | 0 | 0 | 0 | -1 | | dn2 | localhost1/mysql_test | 0 | mysql | 0 | 7 | 1000 | 237 | 0 | 0 | 0 | -1 | +------+-----------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ 2 rows in set (0.00 sec) 驗證Mycat讀功能 通過MYCAT去讀取mysql-master服務器mysql_test庫下travelrecord表裏的數據 [root@mycat conf]# mysql -umycat_r -pmycat_r -h192.168.1.101 -P8066 以mycat_r用戶登錄測試mycat讀取數據功能 mysql> use mysql_test; Database changed mysql> select * from travelrecord; +----+--------------+------------+------+------+ | id | user_id | traveldate | fee | days | +----+--------------+------------+------+------+ | 1 | mysql-master | 2018-03-12 | 0 | 27 | | 2 | mysql-master | 2018-03-12 | 0 | 27 | +----+--------------+------------+------+------+ 2 rows in set (0.00 sec) 測試插入新數據 mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,36); ERROR 1495 (HY000): User readonly 不能執行只能讀取數據 驗證Mycat數據寫入 [root@mycat conf]# mysql -umycat_w -pmycat_w -h192.168.1.101 -P8066以mycat_w用戶登錄插入新數據 mysql> use mycat_test; Database changed 插入新數據 mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,41); Query OK, 1 row affected, 1 warning (0.31 sec) 插入新數據 mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,45); ERROR 1062 (23000): Duplicate entry ‘2‘ for key ‘PRIMARY‘ [root@mycat conf]# mysql -umycat_r -pmycat_r -h192.168.1.101 -P8066 以mycat_r用戶登錄測試mycat讀取數據功能 mysql> use mycat_test; Database changed mysql> select * from travelrecord; +----------+--------------+------------+------+------+ | id | user_id | traveldate | fee | days | +----------+--------------+------------+------+------+ | 1 | mysql-master | 2016-01-01 | 100 | 10 | | 2 | mysql-master | 2018-03-12 | 0 | 41 | | 5000001 | mysql-master | 2016-01-02 | 100 | 10 | | 10000001 | mysql-master | 2016-01-03 | 100 | 10 | +----------+--------------+------------+------+------+ 4 rows in set (0.00 sec) 1.7 MyCAT 命令行監控 9066端口 ,用mysql命令行連接 mysql -umycat_w -pmycat_w -h192.168.1.101 -P9066 show @@help 可顯示所有相關管理命令

Linux下mysql基於MyCat實現主從復制和讀寫分離