Linux下mysql基於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億的單表分片;
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)
- 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; -
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 - 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; - 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/
- 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>
Linux下mysql基於MyCat實現主從復制和讀寫分離