高效能web 架構之 mysql 讀寫分離
高效能web架構主要保證程式的高可用性和高併發性.
高可用就是 保證程式在99.99%的情況下可以使用,不會因為單機節點故障整體崩潰.
高併發說到底也是為了高可用服務.保證在大量併發的時候服務不會宕機.
高效能web架構主要體現在以下方面
- 資料庫讀寫分離,因為大部分應用都是讀多於寫,可以配置多臺讀伺服器, (目前mysql不支援多臺寫伺服器,不過可以用其他技術解決)
- 快取常用資料,把訪問量非常多的資料,快取到分散式快取中. 如memcached,redis 等常用快取方案
- 單獨檔案伺服器叢集,減少對應用伺服器壓力
- 單獨圖片伺服器叢集, 減少對應用伺服器壓力
- web伺服器和應用伺服器叢集分離. web 伺服器併發要比應用伺服器併發高很多. 緩解應用伺服器壓力.
- 應用伺服器叢集,做負載均衡,對話共享.應用伺服器目前都支援叢集,
- 伺服器反向代理 ,
一般高併發第一個瓶頸就在資料庫所以資料庫讀寫分離很實用.
安裝虛擬機器
安裝兩個linux 虛擬機器 , 我是在macosx 中用vbox虛擬機器安裝的兩個centos6.5 i386 虛擬機器
安裝的時候硬碟保證在20G以上,否則安裝系統報錯
VBox安裝的時候 如果用mac 會提示CPU不支援
選擇設定à系統->處理器->勾選PAE/NX
安裝完系統後進入系統
安裝之後保證虛擬機器聯網, 因為安裝程式都是用yum 安裝的
配置虛擬機器
關閉安全策略
關閉iptables防火牆(或者開啟防火牆的1186、3306埠),在Shell中執行以下命令:
chkconfig --level 35 iptables off
設定虛擬機器與主機網路為橋接網路,使虛擬機器加入主機的區域網中
設定->網路->橋接模式
二 安裝MySQL
1. 解除安裝掉原有mysql
// 這個命令就會檢視該作業系統上是否已經安裝了mysql資料庫
[[email protected] ~]# rpm -qa |grep mysql
有的話,我們就通過 rpm -e 命令 或者 rpm -e--nodeps 命令來解除安裝掉
// 普通刪除模式
[[email protected] ~]# rpm -emysql
// 強力刪除模式,如果使用上面命令刪除時,提示有依賴的其它檔案,則用該命令可以對其進行強力刪除
[[email protected] ~]# rpm -e--nodeps mysql
2. 通過yum來進行mysql的安裝
[[email protected] ~]# yuminstall -y mysql-server mysql mysql-deve
yum會幫我們選擇好安裝mysql資料庫所需要的軟體以及其它附屬的一些軟體
此時我們可以通過如下命令,檢視剛安裝好的mysql-server的版本
[[email protected] ~]# rpm -qimysql-server
啟動mysql
[[email protected] ~]# servicemysqld restart
設定開機啟動
[[email protected] ~]# chkconfigmysqld on
3. mysql資料庫的初始化及相關配置
這時我們會看到第一次啟動mysql伺服器以後會提示非常多的資訊,目的就是對mysql資料庫進行初始化操作,當我們再次重新啟動mysql服務時,就不會提示這麼多資訊了.
修改root密碼 ,這個只有安裝第一次設定有效
[[email protected] ~]# mysqladmin-u root password 'root'
此時我們就可以通過 mysql -u root -p 命令來登入我們的mysql資料庫了
三 複製虛擬機器
將安裝好mysql的centos 複製一份,讀寫分離至少兩臺伺服器,一個讀,一個寫.
啟動兩臺虛擬機器
四 配置讀寫分離資料庫
在兩臺伺服器中執行ifconfig 檢視IP
在windows虛擬機器中用SQLyog連線兩臺mysql root使用者
(注意新安裝的mysql root使用者是不允許被非主機連線的,需要在主機上執行一個sql)
首先主機登入MySQl 用 mysql -u root –p 登入mysql
//切換資料庫
mysql> use mysql
//修改許可權
mysql>GRANT ALLPRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION
//使修改生效
mysql>FLUSH PRIVILEGES
//退出MySQL伺服器
mysql>EXIT
此時就可以連了
配置master server-1
首先建立一個測試資料庫,並手動把這個庫複製到從庫mysql中
執行 vi /etc/my.cnf 新增以下配置:
log-bin=mysql-bin #slave基於此log-bin來做replication
server-id=1 #master的標示
執行重啟
/etc/init.d/mysqld restart
然後新增專門用於replication的使用者:
最後檢視master狀態:
SHOW MASTER STATUS;
SHOW PROCESSLIST ; 檢視使用者執行緒狀態
配置從資料庫
執行 vi /etc/my.cnf 新增以下配置:
server-id=2 #slave的標示
read_only = 1
replicate-do-db=jialixin 告訴slave只做vbb資料庫的更新
replicate-ignore-db=mysql #不同步的資料庫
#replicate-ignore-table=vbb.users#不同步vbb資料庫的users表
執行重啟
/etc/init.d/mysqld restart
在mysql客戶端執行以下sql
CHANGE MASTER TO
MASTER_HOST='192.168.4.24',
MASTER_USER='repl-jialixin',
MASTER_PASSWORD='jialixin',
MASTER_LOG_FILE='mysql-bin.000002', --這個值要 在master的機器中查出來 show master status; 中
MASTER_LOG_POS=106;-- 這個值要 在master的機器中查出來 show master status; 中
在mysql客戶端執行以下sql
START SLAVE; --開始
檢視從庫mysql日誌,執行以下命令
cat /var/log/mysqld.log
如果出現下邊的日誌就證明沒問題了
在主庫裡邊修改資料庫的資訊, 看看從庫裡邊會不會跟著修改, 如果從庫沒有變化
在mysql客戶端執行以下sql
SHOW SLAVE STATUS;
檢視資訊, 看看同步的日誌MASTER_LOG_POS 是不是一致,再檢視 last_sql_error有沒有資訊,
在mysql客戶端執行以下sql
SHOW PROCESSLIST ;-- 檢視使用者執行緒狀態
注意:
1,配置讀寫分離的時候一定停止所有對資料庫的讀寫操作
2,開始的之前一定保證讀寫兩個伺服器的所有資料庫內容相同.
3,可以配置多個從庫作為讀的資料庫
以上是簡單的讀寫分離的架構搭建更多複雜的請參考
配置代理讀寫分離
此次實戰中database proxy採用amoeba ,它的相關資訊可以查閱官方文件,不在此詳述
本文使用2.0版本 請下載2.0
下載https://sourceforge.net/projects/amoeba/files/
下載後解壓
開啟conf/ amoeba.xml配置檔案,修改以下位置
這個service是提供給訪問資料庫的程式使用的.也就是別人連線資料庫需要配置的東西
分別為,埠,預設為8066,為了大家習慣,改成3306
使用者名稱:可以隨便寫
密碼:可以隨便寫
最下邊把註釋開啟,配置server1,server2,這裡邊對應的是dbServers.xml 配置檔案裡邊的兩個資料庫server
開啟dbServers.xml,配置 埠,使用者名稱,密碼
增加一個server, 這裡邊的name對應上一個配置檔案裡邊的server 讀寫的配置 .24是寫資料庫,.25是讀庫,因為兩個庫的使用者名稱密碼都一樣的,所以直接繼承上面的server配置的資訊就可以了.如果不一樣需要單獨配置.最下邊是連線池配置.
然後儲存,啟動
開啟cmd 切換到bin目錄
amoeba start 啟動, 如果配置環境變量了,可以直接啟動.否則需要切換到程式目錄下.
啟動成功,下邊用程式測試以下. 下邊是spring的連線資訊, 連線到amoeba
執行測試
插入成功.
可以看到兩個資料庫都已經同步了. 檢視資料庫日誌,寫發生在24上,讀發生在25 上