這次我來撘下比較流行的讀寫分離配置,現(xiàn)在好像很火的樣子,能大大提升mysql的能力,所以我就學(xué)一下。
一,材料準(zhǔn)備

三臺主機
- altas代理中間件服務(wù)器 192.168.1.1
- 主mysql服務(wù)器 192.168.1.2
- 從mysql服務(wù)器 192.168.1.3
Jmeter
還得自備JDBC橋包

二,安裝mysql
三臺服務(wù)器都需要安裝mysql,你會為代理服務(wù)器為什么也要裝,主要是該服務(wù)器會利用某一個mysql的某個包,所以還是得裝
sudo apt-get update
sudo apt-get install mysql-server mysql-client

然后根據(jù)自己的mysql版本配置UTF-8編碼,我的是5.5.6
mysql > select version();
mysql > show variables like 'character_set_%';#查看編碼
sudo stop mysql
sudo su
vim /etc/mysql/my.cnf
#在[client]段增加下面代碼
default-character-set=utf8
#在[mysqld]段增加下面的代碼
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
sudo start mysql


三,配置主從復(fù)制
我只是做了個最簡單的主從復(fù)制,所以想要理解深入的要自己去查看,然后一定要保持所有服務(wù)器的3306都可以連通
首先配置主從服務(wù)器,代理的mysql服務(wù)器不用管,不會用到它
vim /etc/mysql/my.cnf
#添加或修改(如果文件上有)以下屬性
bind-address = 0.0.0.0
server-id=1 #主是1,從是2,不要搞混,而且必須唯一
log-bin=mysql-bin
binlog-ignore-db = mysql,information_schema
sudo restart mysql


master授權(quán)一個賬號給slave讀取數(shù)據(jù)
賬:root
密:root(identified by 密碼)
在主服務(wù)器操作
mysql -uxxx -pxxx
mysql > grant all privileges on *.* to 'root'@'192.168.1.3' identified by 'root';
mysql > flush privileges;

在從機操作測試能否正常連接主機的mysql,能正常連接說明沒問題,否則請自行檢查端口,這步必須先過,否則后面就會很折磨你自己為什么弄不了
mysql -uroot -proot -h192.168.1.2

好回到主機,這兩個屬性很重要,等下要用
mysql > show master status;

再去到從機,按照自己配置的賬密,還有剛剛那兩個屬性,配置以下命令輸入從機
change master to
master_host='192.168.1.2',#主機
master_user='root',#賬
master_password='root',#密
master_log_file='mysql-bin.000001',#二進制文件
master_log_pos=333;
重啟從機mysql,并輸入一下命令,然后會看到兩個YES,那就OK了,如果沒有,那就檢查防火墻和端口
sudo restart mysql
mysql -uxxx -pxxx
mysql > start slave;
mysql > show slave status\G;

讀寫分離參考鏈接推薦:
http://www.itdecent.cn/p/bcd01f163bae
http://blog.csdn.net/lc0817/article/details/51163268
四,測試主從復(fù)制
首先我們,我們先把主從機的數(shù)據(jù)庫打開
mysql > show databases;

然后我們再主機輸入以下命令
mysql > create database test;
mysql > use test;
mysql > create table student ( id int );
mysql > insert into student values(1);
然后分別在主從機下輸入以下命令
mysql > show databases;
mysql > use test;
mysql > select * from student;
好了恭喜,讀寫分離配置初步主從復(fù)制完畢。

五,Altas配置
首先分別進入主從機,申請同樣賬號密碼的mysql用戶提供給代理服務(wù)器使用,我覺得最好和剛才主從鏈接的賬號密碼一樣咯,這樣好記
mysql > grant all privileges on *.* to 'root'@'192.168.1.1' identified by 'root';

上傳Atlas-2.2-debian7.0-x86_64.deb到代理機上。

還記得我們剛剛給代理機的賬號密碼吧?
賬:root
密:root (記住這個密碼,最主要和主機有關(guān)系)
然后打開代理機終端輸入以下命令
cd /usr/local/
dpkg -i Atlas-2.2-debian7.0-x86_64.deb
rm -rf Atlas-2.2-debian7.0-x86_64.deb
cd mysql-proxy
bin/encrypt root#這是剛剛所說的密碼
#DAJnl8cVzy8= 把這個密碼記住,等等配置conf
cd conf
vim test.cnf

配置以下屬性
[mysql-proxy]
#這是管理代理的賬號密碼,這個感覺默認就行了,看自己
#管理接口的用戶名
**admin-username **= user
#管理接口的密碼
**admin-password **= pwd
#實現(xiàn)管理接口的Lua腳本所在路徑
admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
#Atlas后端連接的MySQL主庫的IP和端口,可設(shè)置多項,用逗號分隔
#設(shè)置為自己的主機
**proxy-backend-addresses** = 192.168.1.2:3306
#Atlas后端連接的MySQL從庫的IP和端口,@后面的數(shù)字代表權(quán)重,用來作負載均衡,若省略則默認為1,可設(shè)置多項,用逗號分隔
#設(shè)置只讀服務(wù)器,其中@后面代表權(quán)值,權(quán)值越大,抽中為讀的幾率越高
**proxy-read-only-backend-addresses** = 192.168.1.2:3306@1,192.168.1.3:3306@2
#設(shè)置Atlas的運行方式,設(shè)為true時為守護進程方式,設(shè)為false時為前臺方式,一般開發(fā)調(diào)試時設(shè)為false,線上運行時設(shè)為true
daemon = true
#設(shè)置Atlas的運行方式,設(shè)為true時Atlas會啟動兩個進程,一個為monitor,一個為worker,monitor在worker意外退出后會自動將其重啟,設(shè)為false時只有worker,沒有monitor,一般開發(fā)調(diào)試時設(shè)為false,線上運行時設(shè)為true
keepalive = true
#工作線程數(shù),推薦設(shè)置與系統(tǒng)的CPU核數(shù)相等
event-threads = 4
#日志級別,分為message、warning、critical、error、debug五個級別
log-level = message
#日志存放的路徑
log-path = /usr/local/mysql-proxy/log
#實例名稱,用于同一臺機器上多個Atlas實例間的區(qū)分
instance = test
#Atlas監(jiān)聽的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas監(jiān)聽的管理接口IP和端口
admin-address = 0.0.0.0:2345
#連接池的最小空閑連接數(shù),應(yīng)設(shè)為event-threads的整數(shù)倍,可根據(jù)業(yè)務(wù)請求量大小適當(dāng)調(diào)大或調(diào)小
min-idle-connections = 8
#分表設(shè)置,此例中person為庫名,mt為表名,id為分表字段,3為子表數(shù)量,可設(shè)置多項,以逗號分隔,若不分表則不需要設(shè)置該項
#tables = person.mt.id.3
#用戶名與其對應(yīng)的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,此設(shè)置項用于多個用戶名同時訪問同一個Atlas實例的情況,若只有一個用戶名則不需要設(shè)置該項
#設(shè)置剛剛經(jīng)過轉(zhuǎn)碼的密碼,其實我也不太了解官方寫的什么意思
**pwds** = root:DAJnl8cVzy8=
#默認字符集,若不設(shè)置該項,則默認字符集為latin1
**charset** = utf8
#允許連接Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號分隔,若不設(shè)置該項則允許所有IP連接,否則只允許列表中的IP連接
#client-ips = 127.0.0.1, 192.168.1
#Atlas前面掛接的LVS的物理網(wǎng)卡的IP(注意不是虛IP),若有LVS且設(shè)置了client-ips則此項必須設(shè)置,否則可以不設(shè)置
#lvs-ips = 192.168.1.1
OK,基本配置完成
六,Altas測試
在代理服務(wù)器下輸入以下命令
/usr/local/mysql-proxy/bin/mysql-proxyd test start

再看看代理服務(wù)器能不能正常鏈接兩個服務(wù)器,在代理服務(wù)器上輸入這個命令
mysql -h192.168.1.1 -P2345 -uuser -ppwd
mysql > select \* from help;
mysql > select \* from backends;



可以看到,配置基本完成,其實基本讀寫分離完成了也可以用了,只要把URL換成這個就行了,和平時鏈接沒區(qū)別,
jdbc:mysql://192.168.1.1:1234/test?characterEncoding=UTF-8,
并用主機的賬號密碼登錄,如果還是不放心,那就看下面這點吧
七,Altas讀寫分離測試
這里我就說步驟了。
打開apache-jmeter-3.1\bin\jmeter.bat








在主從機上安裝sar命令,然后同時輸入sar命令來監(jiān)看這個動態(tài)過程
sudo apt-get install sysstat
sar -n DEV 1 10000

可以看到現(xiàn)在很平穩(wěn),那么我們回到Jmerter,執(zhí)行查詢語句,留意兩機的變化



可以看到,從機幾乎2比1主機,也就是說讀的話,從機占了絕大部分,而主機只需分擔(dān)一點點壓力就好了,和我們的分壓理論下一致了,那么我們再測一下寫又會是怎么樣


你會看到,怎么從機也會寫呢,因為主從復(fù)制,那么主機寫的時候,從機也在讀主機數(shù)據(jù),肯定也會運行?。繉Π?,我們這就達到了讀寫分離的狀態(tài),而且寫的明顯比讀的高,這就表明了讀寫已經(jīng)分離了,好了完成了!
參考鏈接推薦:
https://my.oschina.net/ydsakyclguozi/blog/402444
http://www.cnblogs.com/yyhh/archive/2015/12/29/5084844.html
我已經(jīng)嘗試了好多種中間件,好像mycat,可是我覺得mycat有點深度,如果不好好研究一時沒法用,而且我覺得太麻煩了,不能讀出大量數(shù)據(jù),有限制化,我的業(yè)務(wù)不能用這個中間件了。其他各有優(yōu)缺,以待分析。很多人會有這個問題,就是同步延遲,其實就好像分布式一樣,會有io傳輸這種問題,不管哪個中間件,也不太能很好解決這個問題,異步是無法避免,看您怎么看待了。