1. 程式人生 > >mysql讀寫分離的完整配置

mysql讀寫分離的完整配置



參考文章:

文章一【僅供參考】:

構建高效能web之路------mysql讀寫分離實戰【按照裡面配置主從mysql同步失敗,並且按照他的my.cnf配置,給我的虛擬機器搞壞了,重新弄了一個】

http://blog.csdn.net/cutesource/article/details/5710645

文章二【僅供參考,主要參考這個】:

mysql主從配置,實現讀寫分離【他這個是把主mysql中的所有資料庫都要進行同步】

http://www.cnblogs.com/alvin_xp/p/4162249.html

---------------------------------------------------------------------

、搭建mysql的master-slave環境---------------------------------------------------------------------

大型網站為了軟解大量的併發訪問,除了在網站實現分散式負載均衡,遠遠不夠。到了資料業務層、資料訪問層,如果還是傳統的資料結構,或者只是單單靠一臺伺服器扛,如此多的資料庫連線操作,資料庫必然會崩潰,資料丟失的話,後果更是 不堪設想。這時候,我們會考慮如何減少資料庫的聯接,一方面採用優秀的程式碼框架,進行程式碼的優化,採用優秀的資料快取技術如:memcached,如果資金豐厚的話,必然會想到假設伺服器群,來分擔主資料庫的壓力。Ok切入今天微博主題,利用MySQL主從配置,實現讀寫分離,減輕資料庫壓力。這種方式,在如今很多網站裡都有使用,也不是什麼新鮮事情,今天總結一下,方便大家學習參考一下。

【以下內容參考此文章:http://blog.csdn.net/cutesource/article/details/5710645】

一個完整的mysql讀寫分離環境包括以下幾個部分:

  • 應用程式client
  • database proxy
  • database叢集

在本次實戰中,應用程式client基於c3p0連線後端的database proxy。database proxy負責管理client實際訪問database的路由策略,採用開源框架amoeba。database叢集採用mysql的master-slave的replication方案。整個環境的結構圖如下所示:

【以下內容參考文章:http://bbs.linuxtone.org/thread-24935-1-1.html】

概述:搭設一臺Master伺服器(虛擬機器------一臺centos6.5-mini   ip:192.168.1.145),搭設兩臺Slave伺服器(虛擬機器——兩臺centos6.5-mini ip:192.168.1.152和ip:192.168.1.160)

原理:主伺服器(Master)負責網站NonQuery操作,從伺服器負責Query操作,使用者可以根據網站功能模特性塊固定訪問Slave伺服器,或者自己寫個池或佇列,自由為請求分配從伺服器連線。主從伺服器利用MySQL的二進位制日誌檔案,實現資料同步。二進位制日誌由主伺服器產生,從伺服器響應獲取同步資料庫。

具體實現:

1、在主從伺服器上都裝上MySQL資料庫,windows系統鄙人安裝的是mysql_5.5.25.msi版本,Ubuntu安裝的是mysql-5.6.22-linux-glibc2.5-i686.tar

windows安裝mysql就不談了,一般地球人都應該會。鄙人稍微說一下Ubuntu的MySQL安裝,我建議不要線上下載安裝,還是離線安裝的好。大家可以參考 http://www.linuxidc.com/Linux/2013-01/78716.htm 這位不知道大哥還是姐妹,寫的挺好按照這個就能裝上。在安裝的時候可能會出現幾種現象,大家可以參考解決一下:

(1)如果您不是使用root使用者登入,建議 su - root 切換到Root使用者安裝,那就不用老是 sudo 了。

(2)存放解壓的mysql 資料夾,資料夾名字最好改成mysql

(3)在./support-files/mysql.server start 啟動MySQL的時候,可能會出現一個警告,中文意思是啟動服務執行讀檔案時,忽略了my.cnf檔案,那是因為my.cnf的檔案許可權有問題,mysql會認為該檔案有危險不會執行。但是mysql還會啟動成功,但如果下面配置從伺服器引數修改my.cnf檔案的時候,你會發現檔案改過了,但是重啟服務時,修改過後的配置沒有執行,而且您 list一下mysql的資料夾下會發現很多.my.cnf.swp等中間檔案。這都是因為MySQL啟動時沒有讀取my.cnf的原因。這時只要將my.cnf的檔案許可權改成my_new.cnf的許可權一樣就Ok,命令:chmod 644 my.cnf就Ok

(4)Ubuntu中修改文件內容沒有Vim,最好把Vim 裝上,apt-get install vim,不然估計會抓狂。

這時候我相信MySQL應該安裝上去了。

【以上不是重點,mysql本機訪問和遠端訪問都不可以的,自己查資料一定要弄好!!!!!否則後面無法進行】

2、配置Master主伺服器

(1)在Master MySQL上建立一個使用者‘repl’,並允許其他Slave伺服器可以通過遠端訪問Master,通過該使用者讀取二進位制日誌,實現資料同步。  

[html] view plain copy print?
  1. 建立用於讀取日誌的資料庫使用者:        
  2. 1 mysql>create user repl; //建立新使用者        
  3. 2 //repl使用者必須具有REPLICATION SLAVE許可權,除此之外沒有必要新增不必要的許可權,密碼為mysql。  
  4.   //說明一下192.168.0.%,這個配置是指明repl使用者所在伺服器,這 裡%是萬用字元,表示192.168.0.0-192.168.0.255的Server都可以以repl使用者登陸主伺服器。當然你也可以指定固定Ip。        
  5. 3 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY 'mysql';  

(2)找到MySQL安裝資料夾修改my.Ini檔案。mysql中有好幾種日誌方式,這不是今天的重點。我們只要啟動二進位制日誌log-bin就ok。

 在[mysqld]下面增加下面幾行程式碼

[html] view plain copy print?
  1. my.cnf配置:  
  2. server-id=1   //給資料庫服務的唯一標識,一般為大家設定伺服器Ip的末尾號  
  3. log-bin=master-bin  
  4. log-bin-index=master-bin.index  
  5. 缺東西:  
  6. binlog-do-db=amoeba_study #用於master-slave的具體資料庫#設定二進位制日誌記錄的庫           
  7. binlog-ignore-db=mysql        ##設定二進位制日誌不記錄的庫  
  8. sync_binlog=1      作用:  
  9. 【備註】:1和2的順序顛倒後,centos6.5 bash下的某些命令不能用了!  

(3)檢視日誌

mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 1285 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

重啟MySQL服務

3、配置Slave從伺服器(windows和centos6.5-mini配置一樣)

(1)找到MySQL安裝資料夾修改my.ini【windows】,centos6.5-mini修改/etc/my.cnf檔案,在[mysqld]下面增加下面幾行程式碼

[html] view plain copy print?
  1. 1 [mysqld]  
  2. server-id=2 #slave的標示  
  3. relay-log=slave-relay-bin   
  4. relay-log-index=slave-relay-bin.index  
  5. 缺東西:  
  6. replicate-do-db=amoeba_study #用於master-slave的具體資料庫#設定二進位制日誌記錄的庫           
  7. replicate-ignore-db=mysql        ##設定二進位制日誌不記錄的庫  
  8. sync_binlog=1      作用:  

重啟MySQL服務

(2)連線Master

[html] view plain copy print?
  1. 執行下面的命令連線到master  
  2. mysql> change master to  
  3.     -> master_host='192.168.1.145',  
  4.     -> master_user='repl',  
  5.     -> master_password='mysql',  
  6.     -> master_log_file='master-bin.000001',//Master伺服器產生的日誌  
  7.     -> master_log_pos=0;  
(3)啟動Slave
[html] view plain copy print?
  1. mysql>start slave;  
(4)驗證master-slave搭建生效
可以在當前視窗中輸入
mysql>show slave status;
檢視slave的狀態資訊。

或者

通過檢視slave機的log(/var/log/mysqld.log):

100703 10:51:42 [Note] Slave I/O thread: connected to master '[email protected]:3306',  replication started in log 'mysql-bin.000003' at position 161261

如看到以上資訊則證明搭建成功,如果有問題也可通過此log找原因


OK所有配置都完成了,這時候大家可以在Master Mysql 中進行測試了,因為我們監視的時Master mysql  所有操作日誌,所以,你的任何改變主伺服器資料庫的操作,都會同步到從伺服器上。建立個數據庫,表試試吧。。。

【備註】本例項只對database資料庫amoeba_study進行同步。好啦,到此master-slave主從mysql資料庫同步已經可以了!趕緊試試吧~

==============================================二.搭建database proxy=================================================

參考文章:

文章一【僅供參考】:

構建高效能web之路------mysql讀寫分離實戰

http://blog.csdn.net/cutesource/article/details/5710645

文章二【僅供參考,主要參考這個】:

amoeba for mysql的讀寫分離配置

http://bbs.linuxtone.org/thread-24935-1-1.html

-----------------------------------------------------------------------------------

此次實戰中database proxy採用amoeba,它的相關資訊可以查閱官方文件,不在此詳述

1)安裝amoeba

下載amoeba-mysql-binary-2.1.0-RC5 後解壓到本地(D:/openSource/amoeba-mysql-binary-2.1.0-RC5),即完成安裝

2) 配置Amoeba for MySQL:
Amoeba for MySQL的使用是很簡單的,主要是通過xml檔案來實現的。
1. 配置檔案介紹:
(1.) dbServers.xml   想象Amoeba作為資料庫代理層,它一定會和很多資料庫保持通訊,因此它必須知道由它代理的資料庫如何連線,比如最基礎的:主機IP、埠、Amoeba使用的使用者名稱和密碼等等。這些資訊儲存在$AMOEBA_HOME/conf/dbServers.xml中。
(2.) rule.xml  Amoeba為了完成資料切分提供了完善的切分規則配置,為了瞭解如何分片資料、如何將資料庫返回的資料整合,它必須知道切分規則。與切分規則相關的資訊儲存在$AMOEBA_HOME/conf/rule.xml中。
(3.) functionMap.xml  當我們書寫SQL來操作資料庫的時候,常常會用到很多不同的資料庫函式,比如:UNIX_TIMESTAMP()、SYSDATE()等等。這些函式如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函式名和函式處理的關係。
(4.) ruleFunctionMap.xml  對$AMOEBA_HOME/conf/rule.xml進行配置時,會用到一些我們自己定義的函式,比如我們需要對使用者ID求HASH值來切分資料,這些函式在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定義。
(5.) access_list.conf  Amoeba可以制定一些可訪問以及拒絕訪問的主機IP地址,這部分配置在$AMOEBA_HOME/conf/access_list.conf中。
(6.) log4j.xml  Amoeba允許使用者配置輸出日誌級別以及方式,配置方法使用log4j的檔案格式,檔案是$AMOEBA_HOME/conf/log4j.xml。

先配置proxy連線和與各後端mysql伺服器連線資訊其中,

我們主要用到dbServers.xml 和 amoeba.xml 。

【dbServers.xml 的配置:】
[html] view plain copy print?
  1.    <dbServer name=”abstractServer” abstractive=”true”>  
  2.     3306<!—代理連線資料庫使用的埠號-->  
  3.     amoeba_study<!—代理連線資料庫所使用的資料庫-->  
  4.     root<!—代理連線資料庫使用的使用者名稱-->  
  5.     000000asd<!—代理連線資料庫使用的密碼-->  
  6.     </dbServer>  
  7. <!--- 配置真實的資料庫的地址-->  
  8. <!--- 配置主從伺服器及伺服器連線池-->  
  9. <dbServer name="<span style="color:#FF0000;">server1</span>"  parent="<span style="color:#FF0000;">abstractServer</span>">  
  10.     <factoryConfig>  
  11.     <!-- mysql ip -->  
  12.     <property name="<span style="color:#FF0000;">ipAddress</span>">192.168.0.162</property>  
  13.     <!--必須有以下配置,否則會查詢或者插入資料的時候,失敗!!!!!!!!!!!!!!-->  
  14.     <property name="<span style="color:#FF0000;">user</span>">root</property>  
  15.     <property name="<span style="color:#FF0000;">password</span>">000000asd</property>  
  16.     </factoryConfig>  
  17. </dbServer>  
  18. <dbServer name=”<span style="color:#FF0000;">server2</span>”  parent=”<span style="color:#FF0000;">abstractServer</span>>  
  19.     <factoryConfig>  
  20.     <!—mysql ip -->  
  21.     <property name=”<span style="color:#FF0000;">ipAddress</span>>192.168.0.171</property>  
  22.     <!--必須有以下配置,否則會查詢或者插入資料的時候,失敗!!!!!!!!!!!!!!-->  
  23.     <property name="<span style="color:#FF0000;">user</span>">root</property>  
  24.     <property name="<span style="color:#FF0000;">password</span>">000000asd</property>  
  25.     </factoryConfig>  
  26. </dbServer>  
  27. <dbServer name=”<span style="color:#FF0000;">master</span>” virtual=”<span style="color:#FF0000;">true</span>>  
  28.     <poolConfig class=”com.meidusa.amoeba.server.MultipleServerPool”>  
  29.         <!—Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->  
  30.         <property name=”<span style="color:#FF0000;">loadbalance</span>>1</property>  
  31.         <!—Separated by commas,such as: server1,server2,server1 -->  
  32.         <property name=”<span style="color:#FF0000;">poolNames</span>>server1</property>  
  33.     </poolConfig>  
  34. </dbServer>  
  35. <dbServer name=”<span style="color:#FF0000;">slave</span>” virtual=”<span style="color:#FF0000;">true</span>>  
  36.     <poolConfig class=”com.meidusa.amoeba.server.MultipleServerPool”>  
  37.         <!—Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->  
  38.         <property name=”<span style="color:#FF0000;">loadbalance</span>>1</property>  
  39.         <!—Separated by commas,such as: server1,server2,server1 -->  
  40.         <property name=”<span style="color:#FF0000;">poolNames</span>>server2</property>  
  41.     </poolConfig>  
  42. </dbServer>  

【amoeba.xml 配置:】
[html] view plain copy print?
  1. 客戶端連線Amoeba時所繫結的IP地址、埠、使用者名稱和密碼。及IP訪問限制。  
  2. <service name="Amoeba for Mysql" >  
  3.     <!-- port -->  
  4.     <property name="port">8066</property>  
  5.     <!-- bind ipAddress -->  
  6.     <!-- 
  7.