MMM+Amoeba搭建MySQL高可用負載均衡群集
MySQL的主從復制和MySQL的讀寫分離兩者有著緊密聯系,首先要部署主從復制,只有主從復制完成了,才能在此基礎上進行數據的讀寫分離。MySQL的讀寫分離就是只在主服務器上寫,只在從服務器上讀。基本原理就是讓主數據庫處理事務性查詢,而從服務器處理select查詢。數據庫復制被用來事務性查詢導致的變更同步到群集中的從數據庫。
Amoeba主要為應用層訪問MySQL時充當sql路由,並具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關到目標數據庫、可並發請求多臺數據庫。通過Amoeba能夠完成數據源的高可用、負載均衡和數據切片等功能。
MMM(MySQL主主復制管理器)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)復制,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個Slave的read負載均衡。
amooeba在實際使用中存在單點故障的問題,所以在學習了MMMM之後,我就嘗試了使用mmm+amoeba的架構來避免主庫的單點故障,接下來我就為大家在虛擬機上模擬服務的搭建過程
項目環境
- 使用六臺服務器模擬搭建,拓撲圖如下:
- 虛擬機規劃
主機 | 操作系統 | IP地址 | VIP | 主要軟件 |
---|---|---|---|---|
Master1 | CentOS-7 | 192.168.100.101 | 192.168.100.200 | mysql-5.7、mysql-mmm |
Master1 | CentOS-7 | 192.168.100.102 | 192.168.100.200 | mysql-5.7、mysql-mmm |
Slave1 | CentOS-7 | 192.168.100.111 | 192.168.100.166 | mysql-5.7、mysql-mmm |
Slave2 | CentOS-7 | 192.168.100.112 | 192.168.100.188 | mysql-5.7、mysql-mmm |
Amoeba | CentOS-7 | 192.168.100.130 | jdk、amoeba、mysql | |
MMM | CentOS-7 | 192.168.100.120 | mysql-mmm |
項目實施
安裝MySQL
本次實驗中我所使用的MySQL版本為MySQL5.7,有關於mysql5.7的安裝方式,請參考Centos7中編譯安裝MySQL(mysql-5.7)
搭建MySQL-MMM雙主雙從架構
之前我有寫過一篇MariaDB-MMM高可用群集,MariaDB與MySQL同屬一脈。MariaDB是完全兼容MySQL的,包括API和命令行,使其能輕松成為MySQL的代替品,所以有關於MMM的搭建方式自然也是一樣的,請參考前文。
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
binlog-ignore-db=mysql,information_schema
log_bin=mysql_bin
log_slave_updates=true
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
搭建MySQL讀寫分離
MySQL的主從復制在搭建MMM架構時已經完成,此時我們只需要利用Amoeba搭建讀寫分離即可。
建立時間同步
建立時間同步環境,在Master1上搭建時間同步服務器
yum -y install ntp
配置NTP服務器
修改ntp配置文件,添加配置。
vim /etc/ntp.conf
server 127.127.100.0 //本地是時鐘源,本地地址為192.168.100.101,此處地址則也為100段
fudge 127.127.100.0 stratum 8 //stratum 8 時間層級為8(限制在15內)
關閉防火墻
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
啟動服務
systemctl start ntpd
在master2、slave1、slave2上進行時間同步
yum -y install ntp ntpdate //若是使用centos7系統,一般都已默認安裝
systemctl stop firewalld.service
setenforce 0
systemctl start ntpd //三臺服務器的創建方式一致
/usr/sbin/ntpdate 192.168.100.101 //與主服務器進行時間同步,IP地址為主服務器地址
搭建Amoeba服務器
關閉防火墻及selinux
systemctl stop firewalld.service
setenforce 0
安裝環境(jdk1.6)
cp /opt/jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ /usr/local/jdk1.6
設置環境變量
#vim /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
#source /etc/profile //刷新使環境變量立即生效
安裝amoeba
tar zxf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
chmod -R 755 /usr/local/amoeba/ //解壓即完成安裝
/usr/local/amoeba/bin/amoeba //測試amoeba是否安裝成功
在MySQL上為Amoeba授權
這裏授權的賬戶和密碼是方便amoeba連接後臺數據庫所設置的密碼,只需授權一主兩從即可,雙主之間是相互復制的,數據都會完全同步。用戶名和密碼自定義。
mysql>grant all on *.* to chen@‘192.168.100.%‘ identified by ‘123123‘;
配置Amoeba服務器
修改/usr/local/amoeba/conf/amoeba.xml
<property name="user">amoeba</property>
<property name="password">123456</property> //訪問amoeba的賬戶和密碼
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
修改/usr/local/amoeba/conf/dbServers.xml
- 修改的是Amoeba訪問數據庫的用戶名和密碼,因為系統默認的用戶是test,當你不使用默認賬號時,就需要對默認賬號進行註釋,或者修改為“mysql”
<!-- mysql schema --> <property name="schema">mysql</property> //修改或者直接刪除 <!-- mysql user --> <property name="user">chen</property> <property name="password">123123</property>
- 設置數據庫服務器地址
<dbServer name="master" parent="abstractServer"> //數據庫名稱master <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.100.200</property> //此處填寫的為VIP地址,方便故障切換 </factoryConfig> </dbServer> <dbServer name="slave1" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.100.166</property> //slave1,地址為vip地址 </factoryConfig> </dbServer> <dbServer name="slave2" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.100.188</property> //slave2,地址為VIP地址 </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> //1 代表輪詢 <!-- Separated by commas,such as: server1,server2,server1 --> <property name="poolNames">slave1,slave2</property> //包括slave1,slave2
啟動Amoeba
/usr/local/amoeba/bin/amoeba start& netstat -anpt | grep java
測試可用性
安裝mysql客戶端
yum install -y mysql
登陸測試
測試是否正常訪問
mysql -u amoeba -p123456 -h 192.168.100.130 -P8066 //IP地址為amoeba服務器地址 show databases;
測試數據是否同步
use python create table java (id int,name varchar(10),sorce decimal(5,2)); //在python庫中創建java表
登陸各臺服務器,python庫中的Java表都存在,則表明雙主雙重同步成功
測試讀寫分離
insert into java (id,name,sorce) values (1,‘master‘,1);//在master1表中插入一條數據 insert into java (id,name,sorce) values (2,‘slave1‘,2);//在slave1表中插入一條數據 insert into java (id,name,sorce) values (3,‘slave2‘,3);//在slave2表中插入一條數據 mysql -u amoeba -p123456 -h 192.168.100.130 -P8066 use python select * from java; //登陸amoeba查看數據庫中數據
測試單點故障
systemctl stop mysqld //關閉master1
VIP 發生遷移
MMM+Amoeba搭建MySQL高可用負載均衡群集