近期開發的系統中使用的MySQL作爲數據庫,由於數據涉及到錢,所以不得不慎重。同時,用戶對最大訪問量也提出了要求。爲了避免Mysql的成爲性能瓶頸並具備很好的容錯能力,特此實現主從熱備和讀寫分離。在此簡做紀要,以備日後所用!
一,配置主從
條件:兩臺PC,IP分別爲192.168.168.253,192.168.168.251兩臺PC上的mysql的版本爲5.0.253上的Mysql的爲碩士,251上的Mysql的爲奴。
如圖1所示,主數據庫服務器配置
進入主數據庫服務器安裝目錄,打開my.ini文件,在文件末尾增加如下配置:
- #數據庫ID號,爲1 時表示爲Master,其中master_id必須爲1 到232 - 1 之間的一個正整數值;
- server-id = 1
- #啓用二進制日誌;
- 登錄斌= mysql的斌
- #需要同步的二進制數據庫名;
- binlog- do -db = minishop
- #不同步的二進制數據庫名,如果不設置可以將其註釋掉;
- 二進制日誌-忽略-DB = INFORMATION_SCHEMA
- 二進制日誌-忽略-DB = MySQL的
- 二進制日誌-忽略-DB = personalsite
- 二進制日誌-忽略-DB =測試
- #設定生成的日誌文件名;
- log-bin = “D:/ Database / materlog”
- #把更新的記錄寫到二進制文件中;
- 登錄奴隸更新
進入從數據庫服務器安裝目錄,打開my.ini文件,在文件末尾增加如下配置:
- #如果需要增加從庫則,此ID往後順延;
- server-id = 2
- 登錄斌= mysql的斌
- #主庫主機
- master-host = 192.168 。168.253
- #在主數據庫服務器中建立的用於該從服務器備份使用的用戶
- master-user = forslave
- master-password = ******
- 主端口= 3306
- #如果發現主服務器斷線,重新連接的時間差;
- master-connect-retry = 60
- #不需要備份的數據庫;
- 重複實驗-忽略-DB = MySQL的
- #需要備份的數據庫
- replicate- do -db = minishop
- 日誌 - 從更新
進入主數據庫服務器,創建上面備份使用的用戶名和密碼,同時授權複製奴隸,超級和重新加載
- mysql>授予複製奴隸,超級,在minishop上重新加載*到forslave @ 192 .168。 由'******' 識別的 168.251 ;
進入從數據庫服務器,啓動從站。
- mysql> slave start;
- mysql> show slave status \ G;
測試:進入主數據庫服務器,在Minishop小中某張表中插入一條數據,然後到從數據庫服務器中查看是否含有剛剛插入的數據完畢!
備註:1)運行配置後的主數據庫服務器先於從數據庫服務器,這樣運行從數據庫服務器時,主庫的文件和位置與從庫的上設置Master_Log_File,Read_Master_Log_Pos就會一致。否則,可能出現不一致的情況。這也可以通過命令調整。
2)如果發現主從複製失敗時,可以先關閉從數據庫服務器,然後刪除從數據庫服務器中的數據目錄下relay-log.info,hosname中繼槽*,master.info等文件,重啓從服務器。
二,讀寫分離配置
本想採用Mysql Proxy來實現讀寫分離,奈何其使用的lua腳本着實讓人頭痛,最後決定採用國人開發的開源數據庫代理中間件Amoeba。使用Amoeba,只需簡單的xml配置,就可以很容易地實現讀寫分離。
變形蟲處於應用程序和數據庫服務器之間,充當一箇中間代理層。其支持負載均衡,高可用性,查詢過濾,讀寫分離,可路由相關的查詢到目標數據庫,可併發請求多臺數據庫合併結果。功能很強大。
變形蟲默認的端口爲8066,實現了Mysql的協議應用程序中只需要修改一個數據庫連接就可以實現採用阿米巴來代理數據庫訪問比如:。java的應用中,假如你原來的JDBC連接字符串爲:JDBC:MySQL的://192.168.168.42:3306 / Minishop小,那麼現在,你想使用變形蟲作爲數據庫訪問代理,則只需要將上面連接字符串改爲如下(假如變形蟲所在機子IP爲192.168.168.88):JDBC:MySQL的: //192.168.168.88:8066/minishop.Amoeba透明性做的很贊。
主要還是配置Amoeda,但是配置也是相當的簡單基本只需要配置兩個文件:。的conf \ dbServers.xml和的conf \ amoeba.xml配置中各項的含義,可以參考amoeda中文指南,這裏不做過多解釋。僅記錄下配置。
dbServers.xml主要配置
- < amoeba:dbServers xmlns:amoeba = “http://amoeba.meidusa.com/” >
- <! -
- 每個dbServer需要配置到一個池中,
- 如果您需要使用負載平衡配置多個dbServer,可通過以下配置進行簡化:
- 在dbServer中 添加名爲 virtual = “true” 的屬性,但該配置不允許名稱爲factoryConfig的元素
- 如'multiPool'dbServer
- - >
- < dbServer name = “abstractServer” abstractive = “true” >
- < factoryConfig class = “com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory” >>
- < property name = “manager” > $ {defaultManager} </ property >
- < property name = “sendBufferSize” > 64 </ property >
- < property name = “receiveBufferSize” > 128 </ property >
- <! - mysql port - >
- < property name = “port” > 3306 </ property >
- <! - mysql schema - >
- < property name = “schema” > minishop </ property >
- <! - mysql用戶 - >
- < property name = “user” > chenjie </ property >
- <! - mysql password - >
- < property name = “password” > chenjie </ property >
- </ factoryConfig >
- < poolConfig class = “com.meidusa.amoeba.net.poolable.PoolableObjectPool” >
- < property name = “maxActive” > 500 </ property >
- < property name = “maxIdle” > 500 </ property >
- < property name = “minIdle” > 10 </ property >
- < property name = “minEvictableIdleTimeMillis” > 600000 </ property >
- < property name = “timeBetweenEvictionRunsMillis” > 600000 </ property >
- < property name = “testOnBorrow” > true </ property >
- < property name = “testWhileIdle” > true </ property >
- </ poolConfig >
- </ dbServer >
- < dbServer name = “master” parent = “abstractServer” >
- < factoryConfig >
- <! - mysql ip - >
- < property name = “ipAddress” > 192.168.168.253 </ property >
- </ factoryConfig >
- </ dbServer >
- < dbServer name = “slave1” parent = “abstractServer” >
- < factoryConfig >
- <! - mysql ip - >
- < property name = “ipAddress” > 192.168.168.119 </ property >
- </ factoryConfig >
- </ dbServer >
- < dbServer name = “slave2” parent = “abstractServer” >
- < factoryConfig >
- <! - mysql ip - >
- < property name = “ipAddress” > 192.168.168.251 </ property >
- </ factoryConfig >
- </ dbServer >
- < dbServer name = “multiPool” virtual = “true” >
- < poolConfig class = “com.meidusa.amoeba.server.MultipleServerPool” >
- <! - 負載平衡策略:1 = ROUNDROBIN,2 = WEIGHTBASED,3 = HA - >
- < property name = “loadbalance” > 1 </ property >
- <! - 以逗號分隔,例如:server1,server2,server1 - >
- < property name = “poolNames” > slave1,slave2 </ property >
- </ poolConfig >
- </ dbServer >
- </ amoeba:dbServers >
amoeba.xml配置:
- < amoeba:configuration xmlns:amoeba = “http://amoeba.meidusa.com/” >
- < proxy >
- <! - 服務類必須實現com.meidusa.amoeba.service.Service - >
- < service name = “Amoeba for Mysql” class = “com.meidusa.amoeba.net.ServerableConnectionManager” >
- <! - port - >
- < property name = “port” > 8066 </ property >
- <! - bind ipAddress - >
- < property name = “ipAddress” > 192.168.168.253 </ property >
- < property name = “manager” > $ {clientConnectioneManager} </ property >
- < property name = “connectionFactory” >
- < bean class = “com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory” >
- < property name = “sendBufferSize” > 128 </ property >
- < property name = “receiveBufferSize” > 64 </ property >
- </ bean >
- </ property >
- < property name = “authenticator” >
- < bean class = “com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator” >
- < property name = “user” > chenjie </ property >
- < property name = “password” > chenjie </ property >
- < property name = “filter” >
- < bean class = “com.meidusa.amoeba.server.IPAccessController” >
- < property name = “ipFile” > $ {amoeba.home} /conf/access_list.conf </ property>
- </ bean >
- </ property >
- </ bean >
- </ property >
- </ service >
- <! - 服務器類必須實現com.meidusa.amoeba.service.Service - >
- < service name = “Amoeba Monitor Server” class = “com.meidusa.amoeba.monitor.MonitorServer” >
- <! - port - >
- <! - 默認值:隨機數
- < property name = “port” > 9066 </ property >
- - >
- <! - bind ipAddress - >
- < property name = “ipAddress” > 127.0.0.1 </ property >
- < property name = “daemon” > true </ property >
- < property name = “manager” > $ {clientConnectioneManager} </ property >
- < property name = “connectionFactory” >
- < bean class = “com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory” > </ bean >
- </ property >
- </ service >
- < runtime class = “com.meidusa.amoeba.mysql.context.MysqlRuntimeContext” >
- <! - 代理服務器網絡IO讀取線程大小 - >
- < property name = “readThreadPoolSize” > 20 </ property >
- <! - 代理服務器客戶端進程線程大小 - >
- < property name = “clientSideThreadPoolSize” > 30 </ property >
- <! - mysql服務器數據包進程的線程大小 - >
- < property name = “serverSideThreadPoolSize” > 30 </ property >
- <! - 每個連接緩存準備好的語句大小 - >
- < property name = “statementCacheSize” > 500 </ property >
- <! - 查詢超時(默認:60秒,TimeUnit:秒) - >
- < property name = “queryTimeout” > 60 </ property >
- </ runtime >
- </ proxy >
- <! -
- 每個ConnectionManager都將以線程啓動
- 經理負責連接IO讀取,死亡檢測
- - >
- < connectionManagerList >
- < connectionManager name = “clientConnectioneManager” class = “com.meidusa.amoeba.net.MultiConnectionManagerWrapper” >
- < property name = “subManagerClassName” > com.meidusa.amoeba.net.ConnectionManager </ property >
- <! -
- 默認值是可用的處理器
- < property name = “processors” > 5 </ property >
- - >
- </ connectionManager >
- < connectionManager name = “defaultManager” class = “com.meidusa.amoeba.net.MultiConnectionManagerWrapper” >
- < property name = “subManagerClassName” > com.meidusa.amoeba.net.AuthingableConnectionManager </ property >
- <! -
- 默認值是可用的處理器
- < property name = “processors” > 5 </ property >
- - >
- </ connectionManager >
- </ connectionManagerList >
- <! - 使用文件加載器的默認值 - >
- < dbServerLoader class = “com.meidusa.amoeba.context.DBServerConfigFileLoader” >
- < property name = “configFile” > $ {amoeba.home} /conf/dbServers.xml </ property >
- </ dbServerLoader >
- < queryRouter class = “com.meidusa.amoeba.mysql.parser.MysqlQueryRouter” >
- < property name = “ruleLoader” >
- < bean class = “com.meidusa.amoeba.route.TableRuleFileLoader” >
- < property name = “ruleFile” > $ {amoeba.home} /conf/rule.xml </ property >
- < property name = “functionFile” > $ {amoeba.home} /conf/ruleFunctionMap.xml </ property >
- </ bean >
- </ property >
- < property name = “sqlFunctionFile” > $ {amoeba.home} /conf/functionMap.xml </ property >
- < property name = “LRUMapSize” > 1500 </ property >
- < property name = “defaultPool” > master </ property >
- < property name = “writePool” > master </ property >
- < property name = “readPool” > multiPool </ property >
- < property name = “needParse” > true </ property >
- </ queryRouter >
- </ amoeba:configuration >
至此中,MySQL主從熱備和讀寫分離配置完畢。但是,具體應用到生產環境究竟如何,還有待測試和考察。後來測試一主多從,又加入了一臺Mysql的從數據庫服務器,這就是爲什麼上面阿米巴配置中多了一個IP爲119的原因。