一、讀寫分離概述java
MySQL做爲目前世界上使用最普遍的免費數據庫,相信全部從事系統運維的工程師都必定接觸過。但在實際的生產環境中,有單臺MySQL做爲獨立的數據庫時徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。所以,通常來講都是經過主從複製(master-slave)的方式來同步數據,再經過讀寫分離來提示數據庫的併發負載能力,這樣的方案來進行部署與實施的mysql
二、讀寫分離工做原理linux
基本的原理是讓主數據庫處理事務性增、改、刪操做,而從數據庫處理查詢操做。數據庫複製被用來把事務性操做致使的變動同步到集羣中的從數據庫。sql
三、實現讀寫分離的方式:shell
1)應用程序層實現,網站的程序實現。應用程序層實現指的是子應用程序內部及鏈接器中實現讀寫分離數據庫
2)中間層實現,中間層實現是指在外部中間件程序實現讀寫分離。經常使用的中間件程序有:vim
Cobar:阿里巴巴B2B開發的關係型分佈式系統,管理獎金3000個MySQL實例。在阿里經受住了考驗,後面因爲做者的走開的緣由cobar沒有人維護了,阿里也開發了tddl代替cobar安全
MyCAT:社區愛好者在阿里cobar基礎上進行二次開發,解決了cobar當時存在的一些問題,而且加入了許多新的功能在其中。目前mycat社區活躍度很高,目前已經有一些公司在使用mycat。整體來講支持度比較高,也會一直維護轄區服務器
oneproxy:數據庫界大牛,前支付寶數據庫團隊領導樓總開發,基於mysql官方 的proxy思想利用c進行開發的,OneProxy是一款商業收費的中間件, 樓總捨去了一些功能點,專一在性能和穩定性上。有朋友測試過說在 高併發下很穩定。架構
Vitess:這個中間件是Youtube生產在使用的,可是架構很複雜。 與以往中間件不一樣,使用Vitess應用改動比較大要 使用他提供語言的API接口,咱們能夠借鑑他其中的一些設計思想。
Kingshard:Kingshard是前360Atlas中間件開發團隊的陳菲利用業務時間 用go語言開發的,目前參與開發的人員有3個左右, 目前來看還不是成熟可使用的產品,須要在不斷完善。
Atlas:360團隊基於mysql proxy 把lua用C改寫。原有版本是支持分表, 目前已經放出了分庫分表版本。在網上看到一些朋友常常說在高並 發下會常常掛掉,若是你們要使用須要提早作好測試。
MaxScale與MySQL Route:這兩個中間件都算是官方的吧,MaxScale是mariadb (MySQL原做者維護的一個版本)研發的,目前版本不支持分庫分表。MySQL Route是如今MySQL官方Oracle公司發佈出來的一箇中間件。
四、實驗環境的準備
準備三臺linux虛擬機,一臺做爲中間件安裝mycat(Ip:192.168.204.130),一臺做爲數據庫的master(Ip:192.168.204.128),一臺做爲數據庫的slave(Ip:192.168.204.129)
五、配置安裝mycat
mycat有提供編譯好的安裝包,支持Windows、Linux、Mac、Solaris等系統上安裝與運行,官網地址http://www/mycat.lo
linux下能夠下載Mycat-server-xxxxx.linux.tar.gz 解壓在某個目錄下,注意目錄不能有空格,在Linux(Unix)下,建議放在usr/local/Mycat目錄下,以下:
建立一個mycat用戶來管理mycat服務,並給剛剛解壓的mycat文件修改屬主屬組,並建立mycat用戶的密碼爲123456
[root@mycat src]# useradd mycat
[root@mycat src]# chown mycat:mycat /usr/local/mycat/ -R
[root@mycat src]# pa
packer parted paste
pam_console_apply partprobe pathchk
pam_tally2 partx
pam_timestamp_check passwd
[root@mycat src]# pas
passwd paste
[root@mycat src]# passwd mycat
更改用戶 mycat 的密碼 。
新的 密碼:
無效的密碼: 密碼少於 8 個字符
從新輸入新的 密碼:
passwd:全部的身份驗證令牌已經成功更新。
目錄解釋以下:
bin 程序目錄,存放了window版本和linux版本,處理提供封裝成服務的版本以外,也提供了nowrap的shell腳本命令,方便你們選擇和修改
conf目錄下存放配置文件,server.xml是mycat服務器參數調整和用戶受權的配置文件,schema.xml是邏輯庫定義和表以及分片定義的配置文件,rule.xml是分片規則的配置文件,分別規則的具體一些參數信息單獨存放爲文件,也在這個目錄下,配置文件修改,須要重啓mycat或者經過9066端口reload
lib目錄下主要存放mycat依賴的一些jar文件
日誌放在logs/mycat.log中,天天一個文件,日誌的配置是在conf/log4j.xml中,根據本身的須要,能夠調整輸出基本爲debut,debut級別下,會輸出更多的信息,方便查詢問題
注意:linux下部署安裝MySQL,默認不忽略表名大小寫,須要手動到/etc/my.cnf下配置lower_case_table_names=1 使linux環境下MySQL忽略表名大小寫,不然使用mycat的時候會提示找不到表的錯誤
mycat須要安裝jdl1.7或者以上版本
第一步:下載jdk-8u221-linux-x64.tar.gz文件
第二步:新建/usr/java文件夾,將jdk-8u221-linux-x64.tar.gz放到改文件中,並解壓到當前目錄下
第三步:配置環境變量在/etc/profile底部加入以下內容
JAVA_HOME=/usr/java/jdk1.8.0_221
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
第四步:從新加載profile文件,使環境變量生效
[root@mycat java]# source /etc/profile
mycat在linux中部署啓動時,首先須要再linux系統的環境變量中配置MYCAT_HOME,操做方法以下
第一步:vim /etc/profile ,在系統環境變量文件中增長以下內容
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
第二步:source /etc/profile命令,是環境變量生效
[root@mycat java]# source /etc/profile
若是是在多臺Linux系統中組建的MyCAT集羣,那須要在MyCAT Server所在的服務器上配置對其餘ip和主機名的映射,配置方式以下:
vi /etc/hosts
例如:我有3臺機器,配置以下:
IP 主機名:
192.168.204.128 master.cn
192.168.204.129 slave.cn
192.168.204.130 mycat.cn
編輯完後,保存文件。
mycat的用戶帳號和受權信息在conf/server.xml文件中配置
[root@mycat java]# vim /usr/local/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property> <!-- 1爲開啓實時統計、0爲關閉 -->
</system>
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
編輯mycat的配置文件schema.xml,關於dataHost的配置信息以下:
[root@mycat java]# vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
<dataNode name="dn1" dataHost="dthost" database="ha"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master.cn" url="192.168.204.128:3306" user="root" password="123456">
</writeHost>
<writeHost host="slave.cn" url="192.168.204.129:3306" user="root" password="123456" />
</dataHost>
</mycat:schema>
有兩個參數須要注意,balance和switchtype
其中balance值的負載均衡類型,目前的取值有4中
1)balance=「0」,不開啓讀寫分離機制,全部讀操做都發送到擋牆的writeHost上
2)balance=「1」,所有的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主從模式(M1-S1,M2-S2,而且M1與M2互爲主板),正常狀況下M2,S1,S2都參與select語句的負載均衡
3) balance="2",全部讀操做都隨機的在writeHost、readhost上分發。
4) balance="3",全部讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力
switchType指的是切換的模式,目前的取值也有4種:
1)switchType='-1' 表示不自動切換
2) switchType='1' 默認值,表示自動切換
3) switchType='2' 基於MySQL主從同步的狀態決定是否切換,心跳語句爲 show slave status
4) switchType='3'基於MySQL galary cluster的切換機制(適合集羣)(1.4.1),心跳語句爲 show status like 'wsrep%'。
通過以上兩個步驟的配置,就能夠到/usr/local/mycat/bin 目錄下執行:
./mycat start
便可啓動mycat服務!。至此mycat服務器也就配置完成了。
六、配置MySQL主從
因爲經過yum安裝只能安裝mariadb,因此我這裏爲了方便都使用mariadb,使用編譯安裝MySQL也能夠。
[root@slave ~]# yum -y install mariadb mariadb-server
6.1 配置master
編輯my.cnf配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin-master #啓用二進制文件
server-id=1 #本機數據庫ID標示
binlog-do-db=TESTDB #能夠被從服務器複製的庫,二進制須要同步的數據庫名
binlog-ignore-db-mysql #不能夠被從服務器複製的庫
lower_case_table_names=1 #配置mysql忽略表名大小寫,mycat須要
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
啓動服務
[root@master ~]# systemctl start mariadb
建立一個數據路TESTDB
MariaDB [(none)]> create database TESTDB;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> use TESTDB;
Database changed
MariaDB [TESTDB]> create table T1(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
MariaDB [TESTDB]> grant replication slave on *.* to slave@192.168.204.129 identi fied by '123456'; #受權登陸
Query OK, 0 rows affected (0.00 sec)
MariaDB [TESTDB]> show master status; #查看master狀態
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000003 | 596 | TESTDB | mysql |
+-------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
6.2 配置slave
編輯配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server-id=2
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
master-host=192.168.204.128
master-user=slave
master-password=123456
master-port=3306
master-connect-retry=60
!includedir /etc/my.cnf.d
啓動服務[root@salve ~]# systemctl start mariadb
MariaDB [(none)]> stop slave #先中止slave
-> ;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MariaDB [(none)]> change master to master_host='192.168.204.128',master_user='slave',master_password='123456'; #鏈接主服務器
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> start slave; #啓動slave
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show slave status\G #查看slave狀態,出現兩個yes,則表示成功了,能夠查看數據庫TESTDB是否同步
七、配置主從服務器鏈接mycat
7.1受權主服務器mycat用戶登陸
MariaDB [(none)]> grant all on *.* to mycat@192.168.204.130 identified by '123456';
Query OK, 0 rows affected (0.01 sec)
7.2受權從服務器mycat用戶登陸
MariaDB [(none)]> grant all on *.* to mycat@192.168.204.130 identified by '123456';
Query OK, 0 rows affected (0.01 sec)
八、測試客戶端鏈接mycat服務器,看是否成功。並測試主從服務器分別宕機以後的結果