標籤:style blog http color 使用 os io 檔案
對web系統來說,瓶頸大多在資料庫和磁碟IO上面,而不是伺服器的計算能力。對於系統伸縮性我們一般有2種解決方案,scale-up(縱向擴充)和scale-out(橫向擴充)。前者如擴記憶體,增加單機效能,更換ssd等,雖然看似指標不治本而且比較昂貴,但確實是非常有效,大多數應用的資料規模不是很大,當記憶體足夠緩衝下所有資料的時候,磁碟就沒有什麼壓力了;後者譬如各類分布式解決方案,冗餘磁碟陣列等。
在我看來,mysql讀寫分離是一個scale-up和scale-out的結合體,通過多個機器服務來提升系統吞吐,但並沒有增加儲存總量。對於一些關鍵業務是比較適用的,畢竟關鍵業務的資料量不會達到單機的儲存上限。非關鍵資料可以放到各類緩衝系統就行。mysql官方提供了mysql-proxy來做負載平衡(Qihoo360團隊的開源項目Atlas看著更為強大,最佳化了後段串連及lua部分的代碼),方便我們統一的調度mysql資源,不用我們在業務層自己來做負載平衡。
使用Mysql-Proxy還有個好處,可以在proxy上實現統一的udf和memcached等緩衝系統對接。此外,mysql-proxy自身可以用heartbeat做熱備,因為proxy上無儲存資料,所以還可以方便線性擴容。基於mysql主從複製和mysql-proxy我們可以搭建個高可用的資料庫叢集,構成圖如下。
準備工作,三個伺服器
192.168.1.107,安裝mysql-proxy(依賴libevent)
192.168.1.108,安裝mysql-server,作為slave,可多幾個slave server,需要在mysql-proxy上添加配置
192.168.1.109,安裝mysql-server,作為master
開啟mysql-server的遠程登入,
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]‘%‘ IDENTIFIED BY "rootpwd" WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
1, 配置主mysql(192.168.1.109)的設定檔如下,然後重啟
server-id = 1 #主要資料庫id最好為1log_bin = /var/log/mysql/mysql-bin.logexpire_logs_days = 10max_binlog_size = 100M#binlog_do_db = include_database_namebinlog_ignore_db = mysqlbinlog_ignore_db = information_schema
增加從資料庫許可權,多個從伺服器需要多次配置(rsyncuser和rsyncowd為用作同步的使用者,密碼,最好不用root)
mysql> grant replication slave on *.* to [email protected]‘192.168.1.108‘ identified by ‘rsyncpwd‘;mysql> flush privileges;mysql> show master status;+------------------+----------+--------------+--------------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+--------------------------+| mysql-bin.000001 | 333 | | mysql,information_schema |+------------------+----------+--------------+--------------------------+1 row in set (0.00 sec)mysql> show variables like ‘server_id‘
2, 配置從mysql(192.168.1.108)的設定檔如下(從資料庫id必須比主要資料庫id大),然後重啟
server-id = 2
指向主要資料庫,開啟同步
mysql> change master to master_host=‘192.168.1.109‘, master_user=‘rsyncuser‘,master_password=‘rsyncpwd‘, master_port=3306, master_log_file=‘mysql-bin.000001‘, master_log_pos=333;mysql> show variables like ‘server_id‘mysql> start slavemysql> show slave status;
如果一切正常則主從複製已經搭建好了。(如果start slave不成功,看看server_id是不是生效)
3, 配置proxy(192.168.1.107)如下(多個從伺服器需要添加多個--proxy-read-only-backend-addresses參數):
#vi /etc/init.d/mysql-proxy#!/bin/bashexport LUA_PATH="/usr/share/mysql-proxy/?.lua"mode=$1if [ -z "$mode" ] ; then mode="start"ficase $mode in ‘start‘) mysql-proxy --admin-username=admin --admin-password=adminpwd --daemon --admin-address=:4401 --proxy-address=:3307 --proxy-backend-addresses=192.168.1.109:3306 --proxy-read-only-backend-addresses=192.168.1.108:3306 --admin-lua-script=/usr/share/mysql-proxy/rw-splitting.lua ;; ‘stop‘) killall mysql-proxy ;; ‘restart‘) if $0 stop ; then $0 start else echo "retart failed!!!" exit 1 fi ;;esac
啟動proxy服務
service mysql-proxy start
用用戶端串連mysql -uroot -p -h192.168.1.107 -P3307 (管理端mysql -uadmin -p -h192.168.1.107 -P4401)
附:
Mysql為了安全性,在預設情況下使用者只允許在本地登入,有些情況需要進行遠端連線,因此為了使其可以遠程需要進行如下操作:
一、允許root使用者在任何地方進行遠程登入,並具有所有庫任何操作許可權,具體操作如下:
mysql -uroot -prootpwd mysql> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY "rootpwd" WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
二、允許root使用者在一個特定的IP進行遠程登入,並具有所有庫任何操作許可權,具體操作如下:
mysql -uroot -prootpwdmysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]"192.168.1.107" IDENTIFIED BY "rootpwd" WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
三、允許root使用者在一個特定的IP進行遠程登入,並具有所有庫特定操作許可權,具體操作如下:
mysql -uroot -prootpwdmysql> GRANT select,insert,update,delete ON *.* TO [email protected]"172.16.16.152" IDENTIFIED BY "rootpwd"; mysql> FLUSH PRIVILEGES;
四、刪除使用者授權,需要使用REVOKE命令
REVOKE privileges ON 資料庫[.表名] FROM user-name; mysql -uroot -prootpwd 進行授權操作:GRANT select,insert,update,delete ON TEST-DB TO [email protected]"192.168.1.107" IDENTIFIED BY "rootpwd"; #再進行刪除授權操作: REVOKE all on TEST-DB from test-user; #該操作只是清除了使用者對於TEST-DB的相關授權許可權,但是這個“test-user”這個使用者還是存在。 #最後從使用者表內清除使用者: DELETE FROM user WHERE user="test-user"; #重載授權表: FLUSH PRIVILEGES;#退出mysql資料庫:
五、MYSQL許可權詳細分類:
全域系統管理權限: FILE: 在MySQL伺服器上讀寫檔案。 PROCESS: 顯示或殺死屬於其它使用者的服務線程。 RELOAD: 重載存取控制表,重新整理日誌等。 SHUTDOWN: 關閉MySQL服務。資料庫/資料表/資料列許可權: ALTER: 修改已存在的資料表(例如增加/刪除列)和索引。 CREATE: 建立新的資料庫或資料表。 DELETE: 刪除表的記錄。 DROP: 刪除資料表或資料庫。 INDEX: 建立或刪除索引。 INSERT: 增加表的記錄。 SELECT: 顯示/搜尋表的記錄。 UPDATE: 修改表中已存在的記錄。 特別的許可權: ALL: 允許做任何事(和root一樣)。 USAGE: 只允許登入--其它什麼也不允許做。