1. 程式人生 > >MySQL主從同步+讀寫分離

MySQL主從同步+讀寫分離

Mysql主從同步+讀寫分離 學習 分享 數據庫主從同步+讀寫分離

MySQL主從同步+讀寫分離

實驗拓撲:
三臺mysql數據庫:
192.168.80.101 主服務器 mysql
192.168.80.102 從1服務器 mysql
192.168.80.103 從2服務器 mysql

192.168.80.104 調度器Amoeba服務器 jdk、amoeba
192.168.80.105 mysql客戶端 mysql

第一部分:三臺mysql服務器主從同步
一、mysql主服務器配置:192.168.80.101
1、安裝配置NTP時間服務器:

yum install -y ntp //建立時間同步環境,在主節點上搭建時間同步服務器

vi /etc/ntp.conf
restrict 192.168.80.0 mask 255.255.255.0 nomodify notrap //去掉#,並修改其網段
server 127.127.1.0 //以下兩行新加
fudge 127.127.1.0 stratum 8 //設置時間服務器的層級為8級,頂級是0
:x
service ntpd restart //重啟ntp服務器
service firewalld stop
setenforce 0 //關閉防火墻和安全SELinux
2、源碼編譯安裝MYSQL:
省略
http://blog.51cto.com/13572519/2116742
3、配置master主服務器的MYSQL:

vi /etc/my.cnf //在 [mysqld]下面配置

server_id = 11 //修改
log_bin=master_bin //開啟二進制日誌
log_slave_updates=true //在mysqld區域修改添加這三行,server_id主從都不一致,允許從服務器來主服務器更新數據庫
:x

service mysqld restart

mysql -u root -p //登錄數據庫

GRANT REPLICATION SLAVE ON . TO ‘myslave‘@‘192.168.80.%‘ IDENTIFIED BY ‘123456‘; //為所有從服務器在80.0網段到主服務器讀取二進制日誌的權限

FLUSH PRIVILEGES; //刷新權限
show master status; //查看當前庫的狀態,要記下 Position 列的值
技術分享圖片
二、mysql從服務器配置:192.168.80.102和192.168.80.103
service firewalld stop
setenforce 0
1、安裝配置NTP時間服務器:
yum install -y ntpdate
ntpdate 192.168.80.101 //手動與主服務器時間節點進行同步(我的操作此步,mysqld不能重啟)

echo ‘/30 * /usr/sbin/ntpdate 192.168.80.101‘ >> /var/spool/cron/root //寫計劃任務,每隔三十分鐘,自動同步時間
crontab -l //查看計劃任務
技術分享圖片
2、源碼編譯安裝MYSQL:
省略
http://blog.51cto.com/13572519/2116742
3、配置兩臺master從服務器的MYSQL:
vi /etc/my.cnf //[mysqld]下面
server_id = 22 // 各服務器之間的server_id的值不能相同從2設置33
relay_log=relay-log-bin
relay_log_index=slave-relay-bin.index
:x
service mysqld restart

mysql -u root -p //登錄數據庫
--註意master_logpos=的值會變化,要在主上使用show master status;查看一下,註意 -和
change master to master_host=‘192.168.80.101‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master_bin.000002‘,master_log_pos=154;
start slave;
show slave status \G //以下兩個選項需要是Yes才正確
技術分享圖片
**二、驗證MYSQL主從同步:
在主服務器上新建庫並在從服務器上驗證是否同步
mysql -u root -p
create database master;
show databases; //主服務器創建好數據庫,在從服務器上查看,從服務器上也會時時同步*
技術分享圖片
技術分享圖片技術分享圖片
主從同步實驗成功!!!

第二部分:配置mysql服務器讀寫分離
一、在Amoeba服務器上配置:192.168.80.104**
service firewalld stop
setenforce 0

1、安裝配置NTP時間服務器:
yum install -y ntpdate
ntpdate 192.168.80.101

echo ‘/30 * /usr/sbin/ntpdate 192.168.80.181‘ >> /var/spool/cron/root
crontab -l

2、安裝JDK:
Amoeba(變形蟲)是基於JDK開發的,所以安裝之前要先安裝JDK
使用WinSCP將JDK和Amoeba安裝包傳到服務器上
技術分享圖片
技術分享圖片
tar xf jdk-8u144-linux-x64.tar.gz -C /opt
cp -rv /opt/jdk1.8.0_144/ /usr/local/java

vi /etc/profile //末尾新增
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
:x

source /etc/profile //立即生效

java -version
技術分享圖片
3、安裝amoeba:
https://sourceforge.net/projects/amoeba/files/ //下載地址

yum install -y unzip
unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
chmod -R 755 /usr/local/amoeba/

vi /usr/local/amoeba/jvm.properties
32行: JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" //增加此行
:x

4、制作amoeba管理腳本
vi /etc/init.d/amoeba

#!/bin/bash
#chkconfig: 35 62 62
#
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
NAME=Amoeba
AMOEBA_BIN=/usr/local/amoeba/bin/launcher
SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown
PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid
SCRIPTNAME=/etc/init.d/amoeba

case "$1" in
start)
echo -n "Starting $NAME... "
$AMOEBA_BIN
echo " done"
;;
stop)
echo -n "Stoping $NAME... "
$SHUTDOWN_BIN
echo " done"
;;
restart)
$SHUTDOWN_BIN
sleep 1
$AMOEBA_BIN
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac

chmod +x /etc/init.d/amoeba
chkconfig --add amoeba

service amoeba start
ctrl+z // amoeba啟動比較慢,放到後臺暫停運行
bg //後臺繼續運行此進程

netstat -anpt | grep 8066 //默認監聽在8066端口
技術分享圖片

二、配置讀寫分離
1、主服務器創建test數據庫

mysql -u root -p
create database test;
show databases;
技術分享圖片
2、在三臺mysql數據庫中為amoeba授權
GRANT ALL ON . TO test@‘192.168.80.%‘ IDENTIFIED BY ‘123‘;
FLUSH PRIVILEGES;
3、在調度服務器Amoeba上配置配置文件
vi /usr/local/amoeba/conf/amoeba.xml
---28行-----設置客戶端連接amoeba服務器時使用的用戶名和密碼----
<property name="user">amoeba</property>
<property name="password">123456</property> //以上配置用於客戶端連接用戶名密碼
---83-88行--去掉註釋-同時把默認的server1改成master,把默認的servers改成 slaves
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>

vi /usr/local/amoeba/conf/dbServers.xml
---26-28行--------
<property name="user">test</property>
<property name="password">123</property>

主服務器配置:
43 <dbServer name="master" parent="abstractServer">
46 <property name="ipAddress">192.168.80.101</property>

從服務器1配置:
<dbServer name="slave1" parent="abstractServer">
--53-從服務器地址-
<property name="ipAddress">192.168.80.102</property>

從服務器2配置:
//復制slave1相關代碼,設置從2服務器
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.80.103/property>
//以下兩行修改
<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

--末尾--
<property name="poolNames">slave1,slave2</property>
</poolConfig>
-------------------------------------------------------------註意--------------------------------------------------------------------------------

test //數據庫中要有此處定義的數據庫,否則客戶端連接後會報如下錯誤: ERROR 1044 (42000): Could not create a validated object, cause: ValidateObject failed ---------------------------------------------------------------------------------------------------------------------------------------------------- service amoeba restart ctrl+z //停止並放到後臺 bg //重啟 netstat -anpt | grep java ![](http://i2.51cto.com/images/blog/201805/16/b3a1c5fa47c5be9ce50174757fb6a006.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) **第三部分:測試驗證 一、測試客戶端:192.168.80.105** service firewalld stop setenforce 0 **1、 源碼編譯安裝Mysql**: 省略 http://blog.51cto.com/13572519/2116742 **2、 測試讀寫分離:** mysql -u amoeba -p123456 -h 192.168.80.104 -P8066 //amoeba地址 show databases; ![](http://i2.51cto.com/images/blog/201805/16/094d3dd25b9182f787520c2e96cda858.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) //在MASTER上新建的數據庫或者裏面的表,兩臺從服務器會同步--通過amoeba操作的 use test; create table liu (id int(10),name varchar(10),address varchar(20)); show tables; //三臺數據庫服務器上查看會是相同結果 ![](http://i2.51cto.com/images/blog/201805/16/280ba4ed7e4c110255d0f01d926ed16a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) ![](http://i2.51cto.com/images/blog/201805/16/55e7d8361a5e5c5f51ad25d80bd327c8.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) ![](http://i2.51cto.com/images/blog/201805/16/202498e73c8bff1619540d57c9c527dc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 在兩臺從上停止從服務後: stop slave; 測試一:在主服務器上插入的內容不會同步-通過amoeba操作的 在客戶端上操作: insert into liu values(‘1‘,‘hahahha‘,‘this_is_master‘); 在主服務器上查看: use test; select * from liu; ![](http://i2.51cto.com/images/blog/201805/16/375c496042a5169730db59c3a36a866a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) **結論:客戶端寫數據寫到主服務器上 測試二:在從服務器1上新建內容** use test; insert into liu values(‘2‘,‘liu‘,‘this_is_slave1‘); ----從服務器2上新建內容---- use test; insert into liu values(‘3‘,‘liu‘,‘this_is_slave2‘); ------在客戶端amoeba上測試----第一次會向從服務器1讀數據-第二次會向從2讀取 select * from liu; ![](http://i2.51cto.com/images/blog/201805/16/626d7f1ddf715a8d35fcbcef9dd05ec4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 輪流讀取從1從2上的內容 **結論:客戶端讀取數據在從服務器讀取,主服務器寫的1數據讀取不到** **測試三:通過客戶端連接數據庫後寫入的數據只有主會記錄,然後同步給從-從服務器不會記錄,從而實現了讀寫分離。** 客戶端寫入: insert into liu values(‘4‘,‘liu‘,‘write_test‘); 在客戶端amoeba上看不到新插入的數據--因為同步沒有開啟-----只有主服務器上可以看到數據。 select * from liu; //客戶端查看,沒有4記錄 ![](http://i2.51cto.com/images/blog/201805/16/b25ab6978776023a32f588af6e21a97c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) select * from liu; //主服務器查看,有4記錄 ![](http://i2.51cto.com/images/blog/201805/16/3fbd35d6d8fba27593acbadf57773782.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 在客戶端開啟同步後,主服務器上數據會同步到各從服務器中,但是從服務器上自己增加的數據不會同步,只在從服務器本地保存 start slave; select * from liu; //兩臺從服務器上操作 ![](http://i2.51cto.com/images/blog/201805/16/d263d928ef1c10f81458805063412b09.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) ![](http://i2.51cto.com/images/blog/201805/16/acd167320fa876d00b3e119d8145f19a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) select * from liu; //在客戶端查看會看到主上同步過來的數據,以及自己本地增加的數據,但是看不到其它從上自己增加的數據 ![](http://i2.51cto.com/images/blog/201805/16/96e8506183df875503ee9f4862070011.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) **結論: 1、主從同步 2、關閉主從同步的話,客戶端寫的數據寫在主服務器上面,在從服務器上輪流讀取。 3、從服務器只可以讀取本地數據,以及同步的主上面的數據。 實驗成功!!! **

MySQL主從同步+讀寫分離