標籤:ntp.conf 實驗 利用 char mct pes 原理 data size
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 = mysqlbasedir = /usr/local/mysqldatadir = /usr/local/mysql/dataport = 3306character_set_server=utf8pid-file = /usr/local/mysql/mysqld.pidsocket = /usr/local/mysql/mysql.sockserver-id = 1binlog-ignore-db=mysql,information_schemalog_bin=mysql_binlog_slave_updates=truesync_binlog=1auto_increment_increment=2auto_increment_offset=1sql_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.confserver 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.servicesetenforce 0
啟動服務
systemctl start ntpd
在master2、slave1、slave2上進行時間同步
yum -y install ntp ntpdate //若是使用centos7系統,一般都已預設安裝systemctl stop firewalld.servicesetenforce 0systemctl start ntpd //三台伺服器的建立方式一致/usr/sbin/ntpdate 192.168.100.101 //與主伺服器進行時間同步,IP地址為主伺服器地址
搭建Amoeba伺服器關閉防火牆及selinux
systemctl stop firewalld.servicesetenforce 0
安裝環境(jdk1.6)
cp /opt/jdk-6u14-linux-x64.bin /usr/local/cd /usr/local./jdk-6u14-linux-x64.binmv jdk1.6.0_14/ /usr/local/jdk1.6
設定環境變數
#vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.6export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/binexport AMOEBA_HOME=/usr/local/amoebaexport 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 [email protected]‘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 pythoncreate 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 -P8066use pythonselect * from java; //登陸amoeba查看資料庫中資料
測試單點故障systemctl stop mysqld //關閉master1
VIP 發生遷移
MMM+Amoeba搭建MySQL高可用負載平衡群集