Amoeba搭建高可用Mysql集群(實現Mysql主從復制、讀寫分離、負載均衡)
Amoeba(變形蟲)項目,該開源框架於2008年 開始發布一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專註於分布式數據庫代理層(Database Proxy)開發,它位於與Client、DBServer(s)之間,對客戶端透明。具有 負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目標數據庫、可並發請求多臺數據庫合並結果 。
通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多 企業的生產線上面使用。
分布式數據庫代理的相關概念
Amoeba在分布式數據庫領域將致力解決數據切分,應付客戶端“集中式”處理分布式數據。這裏集中式是一個相對概念,客戶端不需要知道某種數據的物理存儲地。避免這種邏輯出現在業務端,大大簡化了客戶端操作分布式數據的復雜程度。
分布式數據庫系統的優點:
- 降低費用 。分布式數據庫在地理上可以式分布的。其系統的結構符合這種分布的要求。允許用戶在自己的本地錄用、查詢、維護等操作,實行局部控制,降低通信代價,避免集中式需要更高要求的硬件設備。而且分布式數據庫在單臺機器上面數據量較少,其響應速度明顯提升。
- 提高系統整體可用性。避免了因為單臺數據庫的故障而造成全部癱瘓的後果。
- 易於擴展處理能力和系統規模。分布式數據庫系統的結構可以很容易地擴展系統,在分布式數據庫中增加一個新的節點,不影響現有系統的正常運行。這種方式比擴大集中式系統要靈活經濟。在集中式系統中擴大系統和系統升級,由於有硬件不兼容和軟件改變困難等缺點,升級的代價常常是昂貴和不可行的。
Amoeba不能做什麽?
- 目前還不支持事務
- 暫時不支持存儲過程(近期會支持)
- 不適合從amoeba導數據的場景或者對大數據量查詢的query並不合適(比如一次請求返回10w以上甚至更多數據的場合)
- 暫時不支持分庫分表,amoeba目前只做到分數據庫實例,每個被切分的節點需要保持庫表結構一致
需求案例:
有三個數據庫節點分別命名為Master、Slave1、Slave2如下:
- Master: Master (只寫)
- Slaves:Slave1、Slave2 (2個平等的數據庫。只讀/負載均衡)
案例實現Master、Slaves之間數據庫主從復制、讀寫分離,負載均衡的高可用Mysql架構。
實驗架構圖:
系統環境:
主機 | 操作系統 | IP地址 | 軟件包 |
---|---|---|---|
amoeba服務器 | CentOS 7.0 x86_64 | 192.168.100.4 | jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz |
Master服務器 | CentOS 7.0 x86_64 | 192.168.100.5 | mysql-5.5.24.tar.gz |
Slave1服務器 | CentOS 7.0 x86_64 | 192.168.100.6 | mysql-5.5.24.tar.gz |
Slave2服務器 | CentOS 7.0 x86_64 | 192.168.100.7 | mysql-5.5.24.tar.gz |
客戶端 | CentOS 7.0 x86_64 | 192.168.100.3 | mysql |
軟件包:軟件包 密碼:iikf
開始部署:
一般情況下,我們的集群為內網環境,無法和外網進行聯網同步時間,那麽這裏我們使Slaves服務器與Master服務器進行時間同步。
一 、Master服務器同步時間
1.修改ntp.conf配置文件
vim /etc/ntp.conf
#本地是時鐘源
server 127.127.100.0
#設置時間層級為8(限制在15內)
fudge 127.127.100.0 stratum 8
2.啟動ntpd服務
service ntpd start
3.關閉防火墻及selinux
service iptables stop
setenforce 0
Slave1、Slave2服務器同步時間
1.啟動ntpd服務
service ntpd start
2.關閉防火墻及selinux
service iptables stop
setenforce 0
3.進行時間同步
/usr/sbin/ntpdate 192.168.100.4
二、Master、Slave1、Slave2 分別安裝mysql數據庫
1.安裝 gcc 、 gcc-c++ 、make、cmake ncurses-devel、bison、libaio-devel的軟件包
yum install gcc gcc-c++ make cmake ncurses-devel bisonlibaio-devel -y
2.mysql軟件包解壓至/opt目錄下
tar zxvf mysql-5.5.24.tar.gz -C /opt/
3.創建mysql用戶
useradd -s /sbin/nologin mysql
4.創建mysql目錄
mkdir /usr/local/mysql
5.進入mysql目錄進行軟件包安裝
cd /opt/mysql-5.5.24
#配置mysql
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=all
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1
-DWITH_READLINE=1
-DENABLED_LOCAL_INFILE=1
-DMYSQL_DATADIR=/home/mysql
-DMYSQL_USER=mysql
-DMYSQL_TCP_PORT=3306
6.編譯及安裝(時間比較長)
make & make install
7.修改mysql目錄的屬主、屬組信息
chown -R mysql.mysql /usr/local/mysql
8.添加mysql的環境變量
vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin/
9.更新環境變量
source /etc/profile
10.復制mysql默認配置文件及啟動腳本
cp /opt/mysql-5.5.24/support-files/my-medium.cnf /etc/my.cnf
cp /opt/mysql-5.5.24/support-files/mysql.server /etc/init.d/mysqld
11.修改mysqld啟動腳本執行權限
chmod 755 /etc/init.d/mysqld
12.添加至啟動項並init3/5自動啟動mysql服務
chkconfig --add /etc/init.d/mysqld
chkconfig mysqld --level 35 on
13.初始化mysql數據庫
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
14.建立軟連接
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
15.配置mysqld中的mysql安裝路徑及數據目錄路徑
vi /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/home/mysql
16.啟動mysql服務
service mysqld start
17.修改mysql管理員(root)用戶的密碼
mysqladmin -u root password ‘pwd123‘
18.登錄mysql測試
mysql -uroot -p pwd123
19.關閉防火墻及selinux
service iptables stop
setenforce 0
特別提醒:以上三臺mysql服務器安裝步驟一樣
三、mysql主從服務器
Master主服務器配置
1.修改my.cnf
vim /etc/my.cnf
server-id = 1 #修改id號
log-bin=master-bin #新增,主服務器日誌文件
log-slave-updates=true #新增,從服務器更新二進制日誌
2.重啟mysql服務
service mysqld restart
3.登錄mysql
mysql -u root -p
4.為Slaves從服務器同步創建用戶
GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.100.%‘ IDENTIFIED BY ‘123456‘;
5.以上修改直接生效
FLUSH PRIVILEGES;
6.查看master狀態信息
show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000002 | 339 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Slave1從服務器配置
1.修改my.cnf
vim /etc/my.cnf
server-id = 11 #修改id號
relay-log=relay-log-bin #新增,從主服務器上同步日誌文件記錄到本地
relay-log-index=slave-relay-bin.index #新增,定義relay-log的位置和名稱
2.重啟mysql服務
service mysqld restart
3.登錄mysql
mysql -u root -p
4.添加向主服務器同步數據命令
change master to master_host=‘192.168.100.5‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=339;
5.開啟slave從服務器
start slave;
6.查看slave狀態
show slave status\G;
Slave2從服務器配置
1.修改my.cnf
vim /etc/my.cnf
server-id = 12 #修改id號
relay-log=relay-log-bin #新增,從主服務器上同步日誌文件記錄到本地
relay-log-index=slave-relay-bin.index #新增,定義relay-log的位置和名稱
2.重啟mysql服務
service mysqld restart
3.登錄mysql
mysql -u root -p
4.添加向主服務器同步數據命令
change master to master_host=‘192.168.100.5‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=339;
5.開啟slave從服務器
start slave;
6.查看slave狀態
show slave status\G;
7.驗證主從同步
在Master主服務器上創建數據庫:
create database db_test;
分別查看Slave從服務器上數據庫:
show databases;
四、amoeba服務器
1.關閉防火墻及selinux
service iptables stop
setenforce 0
2.復制jdk包及安裝
cp jdk-6u14-linux-x64.bin /usr/local/
./jdk-6u14-linux-x64.bin # yes 按enter
3.修改jdk目錄名稱
mv jdk1.6.0_14/ /usr/local/jdk1.6
4.添加jdk、jre、amoeba環境變量
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
5.刷新環境變量
source /etc/profile
6.創建amoeba目錄
mkdir /usr/local/amoeba
7.解壓amoeba軟件包至/usr/local/amoeba目錄下
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
8.修改amoebab目錄權限
chmod -R 755 /usr/local/amoeba/
9.驗證amoeba是否安裝成功
/usr/local/amoeba/bin/amoeba
#顯示amoeba start|stop說明安裝成功
10.分別在三臺mysql上添加權限提供給amoeba訪問
10.1 登錄mysql
mysql -u root -p abc123
10.2 為amoeba授權訪問
grant all on *.* to amoeba@‘192.168.100.%‘ identified by ‘123123‘;
11.回到amoeba服務器,修改其配置文件
cd /usr/local/amoeba/conf
12.編輯amoeba.xml配置文件
vim amoeba.xml
---30行--
<property name="user">amoeba</property> #訪問amoeba的用戶名
----32行---------
<property name="password">123456</property> #密碼
---117-去掉註釋-
<property name="defaultPool">master</property> #默認為主服務器
<property name="writePool">master</property> #寫入為主服務器
<property name="readPool">slaves</property> #讀取為slaves池,現有slave1、slave2服務器
13.修改dbServers.xml配置文件
vi dbServers.xml
43 <dbServer name="master" parent="abstractServer"> #name為master
44 <factoryConfig>
45 <!-- mysql ip -->
46 <property name="ipAddress">192.168.100.5</property> #主服務器IP地址
47 </factoryConfig>
48 </dbServer>
49
50 <dbServer name="slave1" parent="abstractServer"> #name為slave1
51 <factoryConfig>
52 <!-- mysql ip -->
53 <property name="ipAddress">192.168.100.6</property> #從服務器1 IP地址
54 </factoryConfig>
55 </dbServer>
56
57 <dbServer name="slave2" parent="abstractServer"> #name為slave2
58 <factoryConfig>
59 <!-- mysql ip -->
60 <property name="ipAddress">192.168.100.7</property> #從服務器2 IP地址
61 </factoryConfig>
62 </dbServer>
63
64 <dbServer name="slaves" virtual="true"> #name為slaves
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
67 <property name="loadbalance">1</property> #默認為輪詢方式
68
69 <!-- Separated by commas,such as: server1,server2,server1 -->
70 <property name="poolNames">slave1,slave2</property> #輪詢順序為:slave1、slave2
71 </poolConfig>
72 </dbServer>
14.啟動amoeba服務
/usr/local/amoeba/bin/amoeba start&
15.查看java服務
netstat -anpt | grep java
五、客戶端
1.安裝mysql軟件
yum install -y mysql
2.登錄amoeba服務器
mysql -u amoeba -p123456 -h 192.168.100.4 -P8066
3.關閉防火墻及selinux
service iptables stop
setenforce 0
六、客戶端測試訪問
一、驗證主從復制
1.在Master服務器上創建表
mysql -u root -p
create database db_test;
use db_test;
create table zang (id int(10),name varchar(10),address varchar(20));
2.Master服務器上:
3.Slave1服務器上:
4.Slave2服務器上:
二、驗證讀寫分離
1.分別在兩臺Slave1、Slave2從服務器上關閉同步
stop slave;
2.在客戶端上插入記錄,不會同步到從服務器
insert into zang values(‘1‘,‘zhang‘,‘this_is_master‘);
3.Slave1從服務器上插入記錄
use db_test;
insert into zang values(‘2‘,‘zhang‘,‘this_is_slave1‘);
4.Slave2從服務器上插入記錄
use db_test;
insert into zang values(‘3‘,‘zhang‘,‘this_is_slave2‘);
5.在客戶端上測試----第一次會向從服務器Slave1 讀數據-第二次會從服務器Slave2讀取
#多次執行該sql語句查看
use db_test;
select * from zang;
三、驗證負載均衡
1.在客戶端上反復執行查詢語句,已經輪詢訪問slave1、slave2服務器了
select * from zang;
Amoeba搭建高可用Mysql集群(實現Mysql主從復制、讀寫分離、負載均衡)