Mysql讀寫分離是爲了提升網站的訪問速度,提升數據庫的併發負載能力。php
但在實際的生產環境中,由單臺Mysql做爲獨立的數據庫是徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。java
所以,通常來講都是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離來提高數據庫的併發負載能力, 這樣的方案來進行部署與實施的。mysql
注意:先作主從複製,再度讀寫分離。linux
MySQL主從複製結構是基於mysql bin-log日誌基礎上,從庫經過打開IO進程收到主庫的bin-log日誌增量信息,並保存到本地relay log,然後再經過打開MYSQL進程從relay log上獲取的增量信息並翻譯成SQL語句後寫到從數據庫。sql
實驗環境:數據庫
主:10.8.0.150c#
從:10.8.0.151後端
amoeba:10.8.0.160安全
PS:爲了方便實驗,可直接yum mysql 或者直接腳本執行lnmp。服務器
拓撲圖以下:
232123111.jpg
實驗第一步:
登錄主服務器操做命令
mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'cong151'@'10.8.0.151' IDENTIFIED BY "123456";
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 | 5722410 | | |
+------------------+----------+--------------+------------------+
記住file和Position。
登錄從服務器操做命令
一、編輯my.ini 文件 ,修改 server-id = 2 (默認爲1,因作mysql的主從複製,須要修改ID和主服務器上不同便可,也不可和同內網mysql服務器其餘的ID同樣)
二、登入mysql
mysql> change master to master_host='10.8.0.150',master_user='cong151',master_password='123456',master_log_file='mysql-bin.000008',master_log_pos=5722410;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.8.0.150
Master_User: cong151
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 5722410
Relay_Log_File: localhost-relay-bin.000061
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 5722410
Relay_Log_Space: 3466785
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
這樣說明從服務器複製主服務器的數據是正常的了,且能夠指定複製的庫,能夠在my.ini裏面修改便可。
爲了作主從複製,即從複製主且主複製從。
繼續在從服務器上操做。
mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'zhu150'@'10.8.0.150' IDENTIFIED BY "123456";
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 786 | | |
+------------------+----------+--------------+------------------+
登錄主服務器
mysql> change master to master_host='10.8.0.151',master_user='zhu150',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=786;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.8.0.151
Master_User: zhu150
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 786
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 786
Relay_Log_Space: 935
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
這樣,mysql的主從複製實驗OK。
Amoeba的安裝:
安裝Amoeba前要先安裝JDK,由於Amoeba是用java開發的所要有JDK支持。
下載jdk-6u15-linux-i586.bin (sh jdk-6u15-linux-i586.bin 執行程序)
編輯/etc/profile 添加以下代碼
export JAVA_HOME=/usr/local/jdk1.6.0_15
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
Java HotSpot(TM) Client VM (build 14.1-b02, mixed mode, sharing)
下載amoeba-mysql-binary-2.0.1-BETA.tar.gz
[root@localhost ~]# mkdir /usr/local/amoeba && cd /usr/local/amoeba/ && tar /root/amoeba-mysql-binary-2.0.1-BETA.tar.gz
那麼剩下來的就是如何配置amoeba(配置文件在conf目錄下,主要是dbServers.xml和amoeba.xml兩個文件)
先編輯dbServers.xml 文件
235709615.jpg
注意此時的用戶名和密碼,爲後端數據庫的用戶名和密碼,須要在兩臺數據庫服務器上開啓遠程,遠程的用戶名和密碼本身設置,我是爲了方便。
000021663.jpg
添加兩個節點,分別是master和slave,同時修改下一個虛擬組,將master和slave加入進去。後面會須要的。
在編輯amoeba.xml 文件
000319218.jpg
建議修改下IP爲AMOEBA的代理服務器的IP,不建議寫127.0.0.1 或者localhost。
下面的用戶名和密碼,是對外提供的數據庫用戶名和密碼,也就是AMOEBA登錄的用戶名和密碼,不須要在主從服務器上添加這個用戶名和密碼的,我這樣設置也是爲了方便。
000321280.jpg
默認的組是master,說明利用amoeba登錄後,實際上是登錄到主服務器上的。
寫入組是master,說明數據寫入在主服務器上。
讀取組是咱們以前設置的虛擬組(包括master和slave,帶來的效果是,查詢兩次,分別是在主上面查詢一次和從上面查詢一次)
以上,amoeba的服務器配置OK,剩下的是檢查配置,
直接利用 /usr/local/amoeba/bin/amoeba start 來檢查,若是出現問題,請當即解決。
001135717.jpg
若是沒發現問題,相似如此日誌,請ctrl+c 關閉進程。同時利用 /usr/local/amoeba/bin/amoeba start & 啓動並將程序放入後臺。
001138320.jpg
最後剩下的就是測試。
先須要測試經過amoeba鏈接服務器,
案例命令:mysql -uroot -pu2ktgshc#@dq -h10.8.0.160 -P8066
001430214.jpg
第二,直接操做數據庫,新建庫,新建表,表裏寫入數據,查看數據是否正常。主要是測試mysql的主從同步效果如何。
最後,關閉主從相互同步,命令:stop slave; 兩個後端的服務器都須要操做,這樣主從複製被中止,再次插入數據,查看兩次,看下對比便可。
若是發現了變化,那麼您的實驗OK了,沒發現效果,請檢查amoeba的兩個配置文件。
注意一點:<--! --> 這個表示註釋,以前我我的作實驗也是由於這個問題致使第一次沒成功。
望各位好運。
若有成功者,且切實弄到測試環境中(搭建網站測試),請告知如何php調用amoeba,我的沒搞定。爲感!