Mysql讀寫分離是爲了提高網站的訪問速度,提高數據庫的併發負載能力。
但在實際的生產環境中,由單臺Mysql作爲獨立的數據庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高併發等各個方面。
因此,一般來說都是通過 主從複製(Master-Slave)的方式來同步數據,再通過讀寫分離來提升數據庫的併發負載能力, 這樣的方案來進行部署與實施的。
注意:先做主從複製,再度讀寫分離。
MySQL主從複製結構是基於mysql bin-log日誌基礎上,從庫通過打開IO進程收到主庫的bin-log日誌增量信息,並保存到本地relay log,而後再通過打開MYSQL進程從relay log上獲取的增量信息並翻譯成SQL語句後寫到從數據庫。
實驗環境:
主:10.8.0.150
從:10.8.0.151
amoeba:10.8.0.160
PS:爲了方便實驗,可直接yum mysql 或者直接腳本執行lnmp。
拓撲圖如下:
實驗第一步:
登陸主服務器操作命令
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。
登陸從服務器操作命令
1、編輯my.ini 文件 ,修改 server-id = 2 (默認爲1,因做mysql的主從複製,需要修改ID和主服務器上不一樣即可,也不可和同內網mysql服務器其他的ID一樣)
2、登入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 文件
注意此時的用戶名和密碼,爲後端數據庫的用戶名和密碼,需要在兩臺數據庫服務器上開啓遠程,遠程的用戶名和密碼自己設置,我是爲了方便。
添加兩個節點,分別是master和slave,同時修改下一個虛擬組,將master和slave加入進去。後面會需要的。
在編輯amoeba.xml 文件
建議修改下IP爲AMOEBA的代理服務器的IP,不建議寫127.0.0.1 或者localhost。
下面的用戶名和密碼,是對外提供的數據庫用戶名和密碼,也就是AMOEBA登陸的用戶名和密碼,不需要在主從服務器上添加這個用戶名和密碼的,我這樣設置也是爲了方便。
默認的組是master,說明利用amoeba登陸後,其實是登陸到主服務器上的。
寫入組是master,說明數據寫入在主服務器上。
讀取組是我們之前設置的虛擬組(包括master和slave,帶來的效果是,查詢兩次,分別是在主上面查詢一次和從上面查詢一次)
以上,amoeba的服務器配置OK,剩下的是檢查配置,
直接利用 /usr/local/amoeba/bin/amoeba start 來檢查,如果出現問題,請立即解決。
如果沒發現問題,類似如此日誌,請ctrl+c 關閉進程。同時利用 /usr/local/amoeba/bin/amoeba start & 啓動並將程序放入後臺。
最後剩下的就是測試。
先需要測試通過amoeba連接服務器,
案例命令:mysql -uroot -pu2ktgshc#@dq -h10.8.0.160 -P8066
第二,直接操作數據庫,新建庫,新建表,表裏寫入數據,查看數據是否正常。主要是測試mysql的主從同步效果如何。
最後,關閉主從相互同步,命令:stop slave; 兩個後端的服務器都需要操作,這樣主從複製被停止,再次插入數據,查看兩次,看下對比即可。
如果發現了變化,那麼您的實驗OK了,沒發現效果,請檢查amoeba的兩個配置文件。
注意一點:<--! --> 這個表示註釋,之前我個人做實驗也是因爲這個問題導致第一次沒成功。
望各位好運。
如有成功者,且切實弄到測試環境中(搭建網站測試),請告知如何php調用amoeba,個人沒搞定。爲感!
後續的實驗,可通過兩個前端服務器來做amoeba,後端的mysql服務器和兩臺amoeba利用LVS+Keepalived來做集羣和熱備。