mysql基于amoeba读写分离
1:基于Amoeba 讀寫分離
?
?????? 在實際的生產環(huán)境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論是安全性,高可用還是并發(fā)等各個方面都不能完全滿足實際需求的,因此一般來說都是通過主從復制的方式來同步數據,再通過讀寫分離來提供數據的高并發(fā)負載能力這樣的方案來進行部署。
??????? 簡單來說,讀寫分離就是只在主服務器上寫,只在從服務器上讀,基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢,數據庫復制被用來把事務性查詢導致的改變更新同步到集群中的從數據庫。
(1):目前最常見的MySQL讀寫分離方案有兩種:
<1>:基于程序代碼內部實現
在代碼中根據select,insert進行路由分類,這類方法也是目前大型生產環(huán)境應用最廣泛的,優(yōu)點是性能最好,因為在程序代碼中實現,不需要增加額外的設備作為硬件開支,缺點是需要開發(fā)人員來實現,運維人員無從下手
<2>:基于中間代理層實現
代理一般位于客戶端和數據庫服務器之間,代理服務器接到客戶端請求后通過判斷轉發(fā)到后端數據庫,代表性程序:
《1》:mysql-proxy為mysql開發(fā)早期開源項目,通過其自帶的lua腳本進行SQL判斷,雖然是mysql的官方產品,但是mysql官方不建議將其應用到生產環(huán)境。
《2》:Amoeba(變形蟲)該程序由java語言及逆行開發(fā),阿里巴巴將其應用于生產環(huán)境,它不支持事物和存儲過程。
?????? 通過程序代碼實現mysql讀寫分離自然是一個不錯的選擇,但是并不是所有的應用都適合在程序代碼中實現讀寫分離,像一些大型復雜的Java應用,如果在程序代碼中實現讀寫分離對時代改動就較大,像這種應用一般會考慮使用代理層來實現。
?MySQL master 192.168.100.10
MySQL?? slave?? 192.168.100.20
MySQL?? slave?? 192.168.100.30
MySQL amoeba? 192.168.100.40
MySQL client???? 192.168.100.50
?????? Amoeba(變形蟲)項目開源框架于2008年發(fā)布一款Amoeba for mysql軟件,這個軟件致力于mysql的分布式數據庫前端代理層,主要為應用層訪問mysql的時候充當SQL路由功能,并具有負載均衡,高可用性,SQL過濾,讀寫分離,可路由到相關的目標數據庫,可并發(fā)請求多臺數據庫,通過Amoeba能夠完成多數據源的高可用,負載均衡,數據切片的功能,目前Amoeba已經在很多企業(yè)的生產線上使用。
部署:
(2):在主機amoeba 上安裝JDK環(huán)境
《1》:rz? 上傳JDK軟件包,amoeba 軟件包,epel? 軟件包
《2》:chmod +x jdk****? 加權限
《3》:./jdk-6u31-linux-x64.bin? 執(zhí)行
《4》:mv jdk1.6.0_31 /usr/local/jdk1.6?? 移動
《5》:vim /etc/profile? 編輯文件
????? 《6》:添加:
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin???????? 提前給amoeba 配置
《7》:rm -rf /usr/bin/java? 刪除
《8》:source /etc/profile? 生效
?《9》:java -version? 查看版本
(2): 安裝amoeba?
《1》:mkdir /usr/local/amoeba? 創(chuàng)建解壓文件
《2》:tar? xf? amoeba??? ….. -C /usr/local/amoeba
《3》: chmod -R 755 /usr/local/amoeba? 加權限
(3):配置amoeba 讀寫分離,兩個slave 讀負載均衡
? 在 master ,slave1 ,slave2 服務中配置amoeba 的訪問授權
《1》:grant all on *.* to 'test'@'192.168.100.%' identified by '123.com';
《2》:flush privileges;?
《3》:cd /usr/local/amoeba/conf? 切換目錄
《4》:vim amoeba.xml? 編輯文件
?? 修改:
30? ? ? ? ? ? ? ? ? <property name="user">amoeba</property>
32? ? ? ? ? ? ? ? ? ? <property name="password">123456</property>
115???????????????? <property name="defaultPool">master</property>
118???????????????? <property name="writePool">master</property>
119???????????????? <property name="readPool">slaves</property>
《5》:vim dbServers.sml? 編輯
?<!-- mysql port -->
??????????????????????? <property name="port">3306</property>
??????????????????????? <!-- mysql schema -->
??????????????????????? <property name="schema">test</property>
??????????????????????? <!-- mysql user -->
??????????????????????? <property name="user">test</property>
??????????????????????? <!--? mysql password -->
??????????????????????? <property name="password">123.com</property>
<dbServer name="master"? parent="abstractServer">
??????????????? <factoryConfig>
??????????????????????? <!-- mysql ip -->
??????????????????????? <property name="ipAddress">192.168.200.111</property>
??????????????? </factoryConfig>
??????? </dbServer>
??????? <dbServer name="slave1"? parent="abstractServer">
??????????????? <factoryConfig>
??????????????????????? <!-- mysql ip -->
??????????????????????? <property name="ipAddress">192.168.200.112</property>
??????????????? </factoryConfig>
??????? </dbServer>
??????? <dbServer name="slave2"? parent="abstractServer">
??????????????? <factoryConfig>
??????????????????????? <!-- mysql ip -->
??????????????????????? <property name="ipAddress">192.168.200.113</property>
??????????????? </factoryConfig>
??????? </dbServer>
??????? <dbServer name="slaves" virtual="true">
??????????????? <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
??????????????????????? <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
??????????????????????? <property name="loadbalance">1</property>
??????????????????????? <!-- Separated by commas,such as: server1,server2,server1 -->
??????????????????????? <property name="poolNames">slave1,slave2</property>
??????????????? </poolConfig>
??????? </dbServer>
《6》:/usr/local/amoeba/bin/amoeba start &? 啟動
《7》:netstat -lnpt |grep 8066? 查看端口
(4):安裝client 客戶端
《1》:yum -y installl mariadb mariadb-devel mariadb-server? 安裝
《2》:訪問amoeba
在MySQL主服務器上創(chuàng)建一個表,會自動同步到各個從服務器上,然后關掉各個服務器上的Slave功能,在分別插入語句測試。
主服務器
MariaDB [(none)]>? create database Rich;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use Rich;
Database changed
MariaDB [Rich]> create table student (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.00 sec)
分別在兩臺從服務器上
MariaDB [(none)]> show databases;
+--------------------+
| Database?????????? |
+--------------------+
| information_schema |
| Rich?????????????? |
| mysql????????????? |
| performance_schema |
| sampdb???????????? |
| test?????????????? |
+--------------------+
6 rows in set (0.00 sec)
MariaDB [(none)]> use Rich;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [Rich]> show tables;
+----------------+
| Tables_in_Rich |
+----------------+
| student??????? |
+----------------+
1 row in set (0.00 sec)
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.01 sec)
Master
MariaDB [(none)]> use Rich;
MariaDB [Rich]> insert into student values('1','Rich','this_is_master');
Query OK, 1 row affected (0.00 sec)
Slave1
MariaDB [(none)]> use Rich;
MariaDB [Rich]> insert into student values('2','Rich','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
Slave2
MariaDB [(none)]> use Rich;
MariaDB [Rich]> insert into student values('3','Rich','this_is_slave2');
Query OK, 1 row affected (0.00 sec)
操作測試:
在測試機上第1次查詢結果
MySQL [Rich]> select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 2 | Rich | this_is_slave1 |
+------+------+----------------+
1 row in set (0.00 sec)
在測試機上第2次查詢結果
MySQL [Rich] > select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 3 | Rich | this_is_slave2 |
+------+------+----------------+
1 row in set (0.02 sec)
在測試機上第3次查詢結果
MySQL [Rich]> select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 2 | Rich | this_is_slave1 |
+------+------+----------------+
1 row in set (0.03 sec)
測試寫操作:
在Client上插入一條語句:
MySQL [Rich]> insert into student values('4','Rich','write_test');
Query OK, 1 row affected (0.01 sec)
MySQL [Rich]> select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 3 | Rich | this_is_slave2 |
+------+------+----------------+
1 row in set (0.01 sec)
MySQL [Rich]> select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 2 | Rich | this_is_slave1 |
+------+------+----------------+
1 row in set (0.00 sec)
但在Client上查詢不到,最終只有在Master上才能看到這條語句內容,說明寫操作在master服務器上
MariaDB [Rich]> select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 1 | Rich | this_is_master |
|??? 4 | Rich | write_test???? |
+------+------+----------------+
3 rows in set (0.00 sec)
?? 由此驗證,已經實現了MySQL讀寫分離,目前所有的寫操作都在Master主服務器上,用來避免數據的不同步,所有的讀操作都平分給了Slave從服務器,用來分擔數據庫壓力。
分別在兩臺從服務器上啟用slave功能
MariaDB [Rich]> start slave;
Query OK, 0 rows affected (0.00 sec)
現在在Client測試機上查看
MySQL [Rich]> select * from student;
+------+------+----------------+
| id?? | name | address??????? |
+------+------+----------------+
|??? 3 | Rich | this_is_slave2 |
|??? 1 | Rich | this_is_master |
|??? 4 | Rich | write_test???? |
+------+------+----------------+
4 rows in set (0.00 sec)
總結
以上是生活随笔為你收集整理的mysql基于amoeba读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [MapReduce] Counter
- 下一篇: linux cmake编译源码,linu