MySQL的主從複製和MySQL的讀寫分離二者有着緊密聯繫,首先要部署主從複製,只有主從複製完成了,才能在此基礎上進行數據的讀寫分離。MySQL的讀寫分離就是隻在主服務器上寫,只在從服務器上讀。基本原理就是讓主數據庫處理事務性查詢,而從服務器處理select查詢。數據庫複製被用來事務性查詢致使的變動同步到羣集中的從數據庫。
Amoeba主要爲應用層訪問MySQL時充當sql路由,並具備負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關到目標數據庫、可併發請求多臺數據庫。經過Amoeba可以完成數據源的高可用、負載均衡和數據切片等功能。
MMM(MySQL主主複製管理器)是一套支持雙主故障切換和雙主平常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)複製,雖然叫作雙主複製,可是業務上同一時刻只容許對一個主進行寫入,另外一臺備選主上提供部分讀服務,以加速在主主切換時備選主的預熱,能夠說MMM這套腳本程序一方面實現了故障切換的功能,另外一方面其內部附加的工具腳本也能夠實現多個Slave的read負載均衡。java
amooeba在實際使用中存在單點故障的問題,因此在學習了MMMM以後,我就嘗試了使用mmm+amoeba的架構來避免主庫的單點故障,接下來我就爲你們在虛擬機上模擬服務的搭建過程python
主機 | 操做系統 | IP地址 | VIP | 主要軟件 |
---|---|---|---|---|
Master1 | CentOS-7 | 192.168.100.101 | 192.168.100.200 | mysql-5.七、mysql-mmm |
Master1 | CentOS-7 | 192.168.100.102 | 192.168.100.200 | mysql-5.七、mysql-mmm |
Slave1 | CentOS-7 | 192.168.100.111 | 192.168.100.166 | mysql-5.七、mysql-mmm |
Slave2 | CentOS-7 | 192.168.100.112 | 192.168.100.188 | mysql-5.七、mysql-mmm |
Amoeba | CentOS-7 | 192.168.100.130 | jdk、amoeba、mysql | |
MMM | CentOS-7 | 192.168.100.120 | mysql-mmm |
本次實驗中我所使用的MySQL版本爲MySQL5.7,有關於mysql5.7的安裝方式,請參考Centos7中編譯安裝MySQL(mysql-5.7)mysql
以前我有寫過一篇MariaDB-MMM高可用羣集,MariaDB與MySQL同屬一脈。MariaDB是徹底兼容MySQL的,包括API和命令行,使其能輕鬆成爲MySQL的代替品,因此有關於MMM的搭建方式天然也是同樣的,請參考前文。
通過本人手動測試,方法都是共通的,關於搭建MySQL-MMM架構與MariaDB-MMM惟一的不一樣點就是/etc/my.cnf配置文件的修改.[mysqld]修改成以下內容。linux
[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的主從複製在搭建MMM架構時已經完成,此時咱們只須要利用Amoeba搭建讀寫分離便可。sql
yum -y install 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
yum -y install ntp ntpdate //如果使用centos7系統,通常都已默認安裝 systemctl stop firewalld.service setenforce 0 systemctl start ntpd //三臺服務器的建立方式一致 /usr/sbin/ntpdate 192.168.100.101 //與主服務器進行時間同步,IP地址爲主服務器地址
systemctl stop firewalld.service setenforce 0
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 //刷新使環境變量當即生效
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是否安裝成功
這裏受權的帳戶和密碼是方便amoeba鏈接後臺數據庫所設置的密碼,只需受權一主兩從便可,雙主之間是相互複製的,數據都會徹底同步。用戶名和密碼自定義。vim
mysql>grant all on *.* to chen@'192.168.100.%' identified by '123123';
<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>
<!-- 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
/usr/local/amoeba/bin/amoeba start& netstat -anpt | grep java
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表都存在,則代表雙主雙重同步成功centos
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 發生遷移服務器