1. 程式人生 > >Amoeba搭建高可用Mysql集群(實現Mysql主從復制、讀寫分離、負載均衡)

Amoeba搭建高可用Mysql集群(實現Mysql主從復制、讀寫分離、負載均衡)

proc 分布式數據庫 啟動 parent 分布 技術分享 事務 admin str

Amoeba是什麽?

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如下:

  1. Master: Master (只寫)
  2. 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主從復制、讀寫分離、負載均衡)