1. 程式人生 > >Linux—Centos7.4之搭建Mysql數據庫主從同步、讀寫分離

Linux—Centos7.4之搭建Mysql數據庫主從同步、讀寫分離

搭建Mysql主從同步、讀寫分離

MySQL主從同步與讀寫分離

目錄
第一部分 實驗環境
第二部分 配置主從同步
第三部分 配置讀寫分離
第四部分 測試驗證

第一部分 實驗環境

  1. 實驗拓撲圖:
    技術分享圖片
  2. 服務器五臺:
    1)客戶端服務器一臺:
    IP地址:192.168.80.10(client)
    需安裝軟件:mysql-boost-5.7.20.tar.gz
    技術分享圖片
    2)Amoeba調度服務器一臺:
    IP地址:192.168.80.20(amoeba)
    需安裝軟件:jdk-8u144-linux-x64.tar.gz
    amoeba-mysql-3.0.5-RC-distribution.zip
    技術分享圖片
    3)Mysql主服務器一臺:
    IP地址:192.168.80.30(master)
    需安裝軟件:mysql-boost-5.7.20.tar.gz
    4)Mysql從服務器兩臺:
    IP地址:192.168.80.40(slave01)
    192.168.80.50(slave02)
    需安裝軟件:mysql-boost-5.7.20.tar.gz
  3. 系統信息
    技術分享圖片
    註意:本實驗mysql都是源碼編譯安裝,本文檔中涉及安裝配置mysql數據庫部分省略,請參考文檔:http://blog.51cto.com/12227558/2074113

第二部分 主從同步(需三臺Mysql服務器)
第一步 mysql主服務器搭建配置(192.168.80.30)
一:在主mysql服務器上搭建NTP時間服務器
[root@master ~]# yum install -y ntp

[root@master ~]# 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
技術分享圖片
保存退出
[root@master ~]# service ntpd restart
[root@master ~]# service firewalld stop
[root@master ~]# setenforce 0

二:源碼編譯安裝mysql
此處參考http://blog.51cto.com/12227558/2074113,源碼安裝並配置mysql

三:配置master主服務器的mysql
[root@master ~]# vi /etc/my.cnf
//在[mysqld]下面配置
server_id = 11
log_bin=master_bin
log_slave_updates=true
技術分享圖片
保存退出
[root@master ~]# service mysqld restart
[root@master ~]# mysql -uroot -pabc123 //登錄數據庫
mysql> GRANT REPLICATION SLAVE ON . TO ‘myslave‘@‘192.168.80.%‘ IDENTIFIED BY ‘123456‘;
//為所有從服務器授權所有數據庫
mysql> FLUSH PRIVILEGES; //刷新權限
mysql> show master status;
技術分享圖片

第二步 配置從服務器slave01(192.168.80.40)
[root@slave01 ~]# service firewalld stop
[root@slave01 ~]# setenforce 0
一:設置時間同步(同步到主服務器)
[root@slave01 ~]# yum install -y ntpdate
[root@slave01 ~]# ntpdate 192.168.80.30 //手動同步時間
[root@slave01 ~]# echo ‘/30 * /usr/sbin/ntpdate 192.168.80.30‘ >> /var/spool/cron/root
//寫計劃任務,每隔三十分鐘,自動同步時間
[root@slave01 ~]# crontab –l //查看計劃任務

二:源碼編譯安裝mysql
此處參考http://blog.51cto.com/12227558/2074113,源碼安裝並配置mysql

三:配置slave01從服務器的mysql
[root@slave01 ~]# vi /etc/my.cnf
server_id = 22
relay_log=relay-log-bin
relay_log_index=slave-relay-bin.index
技術分享圖片
保存退出
[root@slave01 ~]# service mysqld restart
[root@slave01 ~]# mysql -uroot -pabc123 //登錄數據庫
mysql> change master to master_host=‘192.168.80.30‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master_bin.000001‘,master_log_pos=603;
技術分享圖片
mysql> start slave;
mysql> show slave status \G
技術分享圖片

第三步 配置從服務器slave02(192.168.80.50)
一:設置時間同步(同步到主服務器)
[root@slave02 ~]# service firewalld stop
[root@slave02 ~]# setenforce 0
[root@slave02 ~]# yum install -y ntpdate
[root@slave02 ~]# ntpdate 192.168.80.30
[root@slave02 ~]# echo ‘/30 * /usr/sbin/ntpdate 192.168.80.30‘ >> /var/spool/cron/root
[root@slave02 ~]# crontab –l

二:源碼編譯安裝mysql
此處參考http://blog.51cto.com/12227558/2074113,源碼安裝並配置mysql

三:配置slave02從服務器的mysql
[root@slave02 ~]# vi /etc/my.cnf
server_id = 33
relay_log=relay-log-bin
relay_log_index=slave-relay-bin.index
技術分享圖片
保存退出
[root@slave02 ~]# service mysqld restart
[root@slave02 ~]# mysql -uroot -pabc123
mysql> change master to master_host=‘192.168.80.30‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master_bin.000001‘,master_log_pos=603;
技術分享圖片
mysql> start slave;
mysql> show slave status \G
技術分享圖片

第四步 驗證
//在主服務器上新建庫並驗證同步
mysql> create database hello;
mysql> show databases;
技術分享圖片
//在從服務器上驗證結果
Slave01:
mysql> show databases;
技術分享圖片
Slave02:
mysql> show databases;
技術分享圖片
//驗證成功

第三部分 讀寫分離
第一步 在amoeba服務器上配置(192.168.80.20)
[root@amoeba ~]# service firewalld stop
[root@amoeba ~]# setenforce 0

一:設置同步時間
[root@amoeba ~]# yum install -y ntpdate
[root@amoeba ~]# ntpdate 192.168.80.181
[root@amoeba ~]# echo ‘/30 * /usr/sbin/ntpdate 192.168.80.30‘ >> /var/spool/cron/root
[root@amoeba ~]# crontab –l

二:安裝JDK
[root@amoeba ~]# tar xf jdk-8u144-linux-x64.tar.gz
[root@amoeba ~]# cp -rv jdk1.8.0_144/ /usr/local/java
[root@amoeba ~]# 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
保存退出
[root@amoeba ~]# source /etc/profile //立即生效
[root@amoeba ~]# java –version
技術分享圖片

三:安裝amoeba //下載地址:https://sourceforge.net/projects/amoeba/files/
[root@amoeba ~]# yum install -y unzip
[root@amoeba ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[root@amoeba ~]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/
[root@amoeba ~]# vi /usr/local/amoeba/jvm.properties
修改以下內容:
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" //32行
保存退出

四:制作amoeba管理腳本
[root@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
保存退出
[root@amoeba ~]# chmod +x /etc/init.d/amoeba
[root@amoeba ~]# chkconfig --add amoeba
[root@amoeba ~]# service amoeba start
//啟動過程較慢,ctrl+z放後臺暫停運行,
[root@amoeba ~]# bg //後臺繼續運行
技術分享圖片
[root@amoeba ~]# netstat -anpt | grep 8066
技術分享圖片

第二步 配置讀寫分離
一:主服務器創建test數據庫
mysql> create database test;
mysql> show databases;
技術分享圖片

二:在三臺mysql數據庫服務器中為amoeba授權
mysql> GRANT ALL ON . TO test@‘192.168.80.%‘ IDENTIFIED BY ‘abc123‘;
mysql> FLUSH PRIVILEGES;
技術分享圖片

三:在amoeba服務器上編輯amoeba配置文件
[root@amoeba ~]# cd /usr/local/amoeba
[root@amoeba amoeba]# vi conf/amoeba.xml
//編輯以下內容
<property name="user">amoeba</property> //28行
<property name="password">123456</property> //30行
//以上設置客戶端連接amoeba前端服務器時使用的用戶名和密碼
技術分享圖片
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
//83行開始修改,85行與88行是註釋,刪除
技術分享圖片
保存退出
[root@amoeba amoeba]# vi conf/dbServers.xml
修改以下內容:
<property name="user">test</property>

<property name="password">abc123</property>
技術分享圖片
//以下是主服務器配置:
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.80.30</property>
技術分享圖片
//從服務器slave01配置:
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.80.40</property>
技術分享圖片
//從服務器slave02配置:
將slave01相關內容復制(共六行),直接往下粘貼,並作修改
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.80.50</property>
技術分享圖片
//以下修改兩行內容:
技術分享圖片
保存退出
[root@amoeba amoeba]# service amoeba restart
按ctrl+z,bg,後面運行
[root@amoeba amoeba]# netstat -anpt | grep 8066
技術分享圖片

第四部分 測試驗證
第一步 客戶端上操作(192.168.80.10)
[root@client ~]# service firewalld stop
[root@client ~]# setenforce 0
一:源碼編譯安裝mysql
此處參考http://blog.51cto.com/12227558/2074113,源碼安裝並配置mysql

二:測試讀寫分離
//在MASTER上新建的數據庫或者裏面的表,兩臺從服務器會同步--通過amoeba操作

  1. 客戶端登錄操作
    [root@@client ~]# mysql -u amoeba -p123456 -h 192.168.80.20 -P8066
    mysql> show databases;
    技術分享圖片
    mysql> use test;
    mysql> create table zhang (id int(10),name varchar(10),address varchar(20));
    mysql> show tables;
    技術分享圖片
    //在三臺數據庫服務器上查看會是相同結果
    技術分享圖片
    技術分享圖片
    技術分享圖片

  2. 在兩臺從服務器上停止主從同步服務
    mysql> stop slave;

測試一: 在主服務器上插入的內容不會同步-通過amoeba操作的
//在客戶端上操作
mysql> insert into zhang values(‘1‘,‘hahahha‘,‘this_is_master‘);
//在主服務器上查看
技術分享圖片
//在兩臺從服務器上查看
mysql> show databases;
mysql> use test;
mysql> select * from zhang;
技術分享圖片

測試二:在從服務器上新建內容
Slave01:
mysql> use test;
mysql> insert into zhang values(‘2‘,‘zhang‘,‘this_is_slave1‘);
技術分享圖片
Slave02:
mysql> use test;
mysql> insert into zhang values(‘3‘,‘zhang‘,‘this_is_slave2‘);
技術分享圖片
//在客戶端上測試,第一次會向從服務器slave01上讀取數據,第二次會向slave02讀取
技術分享圖片
技術分享圖片

測試三:在通過客戶端連接數據庫後寫入的數據只有主會記錄,然後同步給從-從服務器不
會記錄,從而實現了讀寫分離
//客戶端上操作
mysql> insert into zhang values(‘4‘,‘zhang‘,‘write_test‘);
這條記錄只能在主服務器上看到記錄
技術分享圖片
在客戶端上看不到新插入的數據,因為沒有開啟同步

//在客戶端開啟同步後,主服務器上數據會同步到各從服務器中,但是從服務器上自己增加的數據不會同步,只有本地保存
mysql> start slave; //在兩臺從服務器上開啟
在客戶端查看會看到主上同步過來的數據,以及自己本地增加的數據,但是看不到其它從上自己增加的數據:
技術分享圖片
//測試完成

Linux—Centos7.4之搭建Mysql數據庫主從同步、讀寫分離