1. 程式人生 > >MMM+Amoeba搭建MySQL高可用負載均衡群集

MMM+Amoeba搭建MySQL高可用負載均衡群集

模擬 關閉防火墻 同步服務 lan 基礎上 拓撲 編譯安裝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的搭建方式自然也是一樣的,請參考前文。

經過本人手動測試,方法都是共通的,關於搭建MySQL-MMM架構與MariaDB-MMM唯一的不同點就是/etc/my.cnf配置文件的修改.[mysqld]修改為如下內容。

[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高可用負載均衡群集