1. 程式人生 > >高效能web 架構之 mysql 讀寫分離

高效能web 架構之 mysql 讀寫分離

高效能web架構主要保證程式的高可用性和高併發性.

高可用就是 保證程式在99.99%的情況下可以使用,不會因為單機節點故障整體崩潰. 

高併發說到底也是為了高可用服務.保證在大量併發的時候服務不會宕機.

高效能web架構主要體現在以下方面

  1. 資料庫讀寫分離,因為大部分應用都是讀多於寫,可以配置多臺讀伺服器, (目前mysql不支援多臺寫伺服器,不過可以用其他技術解決) 
  2. 快取常用資料,把訪問量非常多的資料,快取到分散式快取中. 如memcached,redis 等常用快取方案
  3. 單獨檔案伺服器叢集,減少對應用伺服器壓力
  4. 單獨圖片伺服器叢集, 減少對應用伺服器壓力
  5. web伺服器和應用伺服器叢集分離. web 伺服器併發要比應用伺服器併發高很多. 緩解應用伺服器壓力.  
  6. 應用伺服器叢集,做負載均衡,對話共享.應用伺服器目前都支援叢集,
  7. 伺服器反向代理 ,

一般高併發第一個瓶頸就在資料庫所以資料庫讀寫分離很實用.

安裝虛擬機器

安裝兩個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 上