1. 程式人生 > >搭建MySql主從復制與讀寫分離

搭建MySql主從復制與讀寫分離

單向 replicate from 命令 bec 方便 命令行 balance 之前

一、實驗名稱:
?mysql主從復制讀寫分離
二、實驗目的:?
?熟悉mysql主從復制的原理
?熟悉mysql讀寫分離的原理
?學會配置mysql主從復制
?學會配置mysql讀寫分離
三、實驗環境:?
技術分享圖片
主機 操作系統 IP地址 主要軟件
Master CentOS 6.5 x86_64 /linux6.5 192.168.1.101 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Slave1 CentOS 6.5 x86_64 /linux6.5 192.168.1.102 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Slave2 CentOS 6.5 x86_64 /linux6.5 192.168.1.103 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Amoeba CentOS 6.5 x86_64 /linux6.5 192.168.1.110 amoeba-mysql-binary-2.2.0.tar.gz
jdk-6u14-linux-x64.bin
客戶端 CentOS 6.5 x86_64 /linux6.5 192.168.1.111
註:將所需軟件拷貝至/usr/src中
四:實驗思路:
1.安裝mysql
2.配置mysql的主從復制
3.配置mysql的讀寫分離

實驗過程

一:網絡環境的部署(本步驟每個機器都要設置)
1:按照圖表設置每臺服務器的ip地址
2:配置主機yum(每個系統都要設置)

[root@localhost network-scripts]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# rm -rf CentOS-Base.repo
[root@localhost yum.repos.d]# vi CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/
gpgcheck=1
enabled=1
gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-6
[root@localhost yum.repos.d]# cd
[root@localhost ~]# mkdir /media/cdrom
[root@localhost ~]# mount /dev/cdrom /media/cdrom
二:搭建Mysql主從復制
將所需軟件拷貝到/usr/src/目錄下
1:在mysql主服務器上建立時間同步服務器
[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vi /etc/ntp.conf
添加:
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@localhost ~]# service ntpd restart
[root@localhost ~]# service iptables stop
[root@localhost ~]# chkconfig iptables off
2:在從服務器上進行時間同步
[root@localhost yum.repos.d]# yum -y install ntpdate
[root@localhost yum.repos.d]# /usr/sbin/ntpdate 192.168.1.101
[root@localhost yum.repos.d]# service iptables stop
[root@localhost yum.repos.d]# chkconfig iptables off
3:在三個服務器上安裝mysql(master,slave都有)
[root@localhost ~]# yum -y install ncurses-devel
註釋:
ncurses是字符終端下屏幕控制的基本庫

[root@localhost ~]#yum -y install gcc*
[root@localhost ~]# cd /usr/src
[root@localhost src]# tar zxvf cmake-2.8.6.tar.gz
[root@localhost src]# cd cmake-2.8.6
[root@localhost cmake-2.8.6]# ./configure
[root@localhost cmake-2.8.6]#gmake
[root@localhost cmake-2.8.6]#gmake install
[root@localhost cmake-2.8.6]# cd /usr/src
[root@localhost src]# tar zxvf mysql-5.5.22.tar.gz
[root@localhost mysql-5.5.22]# cd mysql-5.5.22
[root@localhost mysql-5.5.22]#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc

註釋:
-DCMAKE_INSTALL_PREFIX= 安裝根目錄
-DDEFAULT_CHARSET= 默認字符集
-DDEFAULT_COLLATION=默認編碼
-DWITH_EXTRA_CHARSETS= 額外的編碼,請使用ALL來編譯。
-DWITH_MYISAM_STORAGE_ENGINE=1 編譯myisam存儲引擎,默認的存儲引擎,不加也可以
-DWITH_INNOBASE_STORAGE_ENGINE=1 支持InnoDB存儲引擎,這個也是默認安裝的
-DWITH_READLINE=1 使用readline功能
-DENABLED_LOCAL_INFILE=1 可以使用load data infile命令從本地導入文件
-DMYSQL_DATADIR=數據庫 數據目錄
-DSYSCONFDIR= 指定主配置文件目錄

[root@localhost mysql-5.5.22]# make && make install
4:優化調整(master,slave都有)
[root@localhost mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf
cp:是否覆蓋"/etc/my.cnf"? y
[root@localhost mysql-5.5.22]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.5.22]# chmod +x /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.5.22]# chkconfig --add mysqld
[root@localhost mysql-5.5.22]# echo "PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
[root@localhost mysql-5.5.22]# . /etc/profile \點後面有個空格
5:初始化數據庫(master,slave都有)
[root@localhost mysql-5.5.22]# groupadd mysql
[root@localhost mysql-5.5.22]# useradd -M -s /sbin/nologin mysql -g mysql
[root@localhost mysql-5.5.22]# chown -R mysql:mysql /usr/local/mysql
[root@localhost mysql-5.5.22]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
[root@localhost mysql-5.5.22]# service mysqld start
[root@localhost mysql-5.5.22]# chkconfig mysqld on
[root@localhost mysql-5.5.22]# mysqladmin -u root password ‘pwd123‘

6:配置mysql master主服務器(在master上)
[root@localhost mysql-5.5.22]# vi /etc/my.cnf
添加並修改:
server-id=11 \修改,57行
log-bin=master-bin \修改,49行
log-slave-updates=true \添加 (可不用添加)

註釋:
系統默認采用基於語句的復制類型

1:基於語句的復制。 在主服務器上執行的 SQL 語句,在從服務器上執行同樣的語句。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對服務器上的表所進行的更新之間的沖突,配置:binlog_format = STATEMENT

2:基於行的復制。把改變的內容復制過去,而不是把命令在從服務器上執行一遍,從 MySQL 5.0開始支持,配置:binlog_format = ROW

3:混合類型的復制。默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制,配置:binlog_format = MIXED

log_slave_updates=true #Slave可以是其他 Slave 的 Master,從而擴散 Master 的更新
binlog-ignore-db=test #不記錄指定的數據庫的二進制日誌
replicate-ignore-db=test #設置不需要同步的庫
binlog_cache_size = 1M #日誌緩存的大小
expire_logs_days=3 #自動過期清理日誌的天數
以上參數在[mysqld]模塊中設置

[root@localhost mysql-5.5.22]# service mysqld restart
7:給從服務器授權(在master上)
[root@localhost mysql-5.5.22]# cd
[root@localhost ~]# mysql -u root -p
輸入密碼pwd123
mysql> grant replication slave on . to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘ ;
mysql> flush privileges;
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 337 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

8:配置從服務器(在slave上配置)
[root@localhost mysql-5.5.22]# vi /etc/my.cnf
修改並添加
server-id = 22 \修改,57行值不能和其他mysql服務器重復
relay-log=relay-log-bin \添加(可不指定)
relay-log-index=slave-relay-bin.index \添加(可不指定)

註釋:
--relay-log=name????中繼日誌的文件的名字
?--relay-log-index=name??????MySQL slave 在啟動時需要檢查relay log index 文件中的relay log信息,此處定義該索引文件的名字

[root@localhost mysql-5.5.22]# service mysqld restart
9:登陸從服務器配置同步(在slave上)
[root@localhost mysql-5.5.22]# mysql -u root -p
輸入密碼
mysql> change master to master_host=‘192.168.1.101‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=337; \紅色的是用主服務器中show出來的值,337表示偏移量
註:?Slave?的?IO?線程接收到信息後,將接收到的日誌內容依次寫入到?Slave?端的Relay?Log文件(relay-log-bin.xxxxxx)的最末端,並將讀取到的Master端的master-bin的文件名和位置記錄到master-?info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個master-bin的哪個位置開始往後的日誌內容,請發給我
mysql> start slave;
mysql> show slave status\G;
確保下列兩項是yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

10:驗證主從復制效果
mysql> show databases; \查看當前的數據庫,在從服務器上
mysql> create database db_test; \創建一個數據庫,在主服務器上
mysql> show databases; \查看當前的數據庫,在從服務器上發現多了一個剛創建的數據庫

如果需要將一個slave1服務器作為另一臺slave2的master,
1):在slave1上修改my.cnf,在[mysqld]模塊添加log-slave-updates=true字段,並重啟mysql
2):在slave1上執行以下命令創建一個授權用戶,用於在slave2上鏈接slave1
mysql> grant replication slave on . to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘ ;
mysql> flush privileges;
mysql> show master status;

3):show出來的信息做為slave2上連接slave1時的參數
重啟Mysql服務不會影響主從關系

三:搭建mysql讀寫分離
1:在主機amoeba上安裝java環境
把java拷貝到/usr/local目錄下
[root@localhost ~]# chmod +x /usr/local/jdk-6u14-linux-x64.bin
[root@localhost ~]# cd /usr/local
[root@localhost local]# ./jdk-6u14-linux-x64.bin
[root@localhost local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@localhost local]# vi /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
[root@localhost local]# source /etc/profile
[root@localhost local]# java -version \查詢版本,確定java安裝成功
2:安裝並配置amoeba
將amoeba軟件拷貝到usr/src目錄中
[root@localhost local]# mkdir /usr/local/amoeba
[root@localhost local]# cd /usr/src
[root@localhost src]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost src]# chmod -R 755 /usr/local/amoeba/
[root@localhost src]# /usr/local/amoeba/bin/amoeba
amoeba start|stop \有此提示表示成功
3:配置amoeba讀寫分離
(1)在三個mysql服務器中開放權限給amoeba訪問
mysql> grant all on . to test@‘192.168.10.%‘ identified by ‘123.com‘; \三個mysql服務器都要
(2)在amoeba上配置amoeba.xml文件
[root@localhost amoeba]# service iptables stop
[root@localhost ~]# cd /usr/local/amoeba/conf
[root@localhost conf]# vi amoeba.xml
修改紅色部分
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

         <property name="user">amoeba</property>                 \\30行

         <property name="password">123456</property>               \\32行

         <property name="filter">
                   <bean class="com.meidusa.amoeba.server.IPAccessController">
         <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
                   </bean>
         </property>
                   </bean>
     </property>

             。。。。。。。。略。。。。。。。

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property> \115行

            <property name="writePool">master</property>             \\118行
            <property name="readPool">slaves</property>    \\119行此處的註釋去掉

            <property name="needParse">true</property>
    </queryRouter>

[root@localhost conf]# vi dbServers.xml
修改(註意去掉註釋),slave2的復制一個slave1

test \\26行 123.com \\29行,去掉註釋符 。。。。。。。。。略。。。。。。。。。。 \\45行 192.168.1.101 \\48行 \\52行 192.168.1.102 \\55行 192.168.1.103 \\59行 1 slave1,slave2 \\65行 [root@localhost ~]# cd /usr/local/amoeba/ [root@localhost amoeba]# bin/amoeba start& 註:當在前臺運行某個作業時,終端被該作業占據;而在後臺運行作業時,它不會占據終端。可以使用&命令把作業放到後臺執行 [root@localhost amoeba]# netstat -anpt | grep java 如果能看到8066和3306兩個端口號,證明amoeba是正常開啟的。 四:測試 1:在client上 [root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# rm -rf CentOS-Base.repo [root@localhost yum.repos.d]# vi CentOS-Media.repo 修改 [c6-media] name=CentOS-$releasever - Media baseurl=file:///media/cdrom/ gpgcheck=1 enabled=1 gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-6 [root@localhost yum.repos.d]# mkdir /media/cdrom [root@localhost yum.repos.d]# mount /dev/cdrom /media/cdrom [root@localhost yum.repos.d]# yum -y install mysql [root@localhost yum.repos.d]# mysql -u amoeba -p 123456 -h 192.168.1.110 -P 8066 Enter password: \\密碼:123456 2:在master服務器上創建表 mysql> use db_test; mysql> create table zang (id int(10),name varchar(10),address varchar(20)); 3:在兩個slave服務器上 mysql> stop slave; 4:在master服務器上 mysql> insert into zang values (‘1‘,‘zhang‘,‘this_is_master‘); 5:在slave1上 mysql> use db_test; mysql>insert into zang values (‘2‘,‘zhang‘,‘this_is_slave1‘); 6:在slave2上 mysql> use db_test; mysql>insert into zang values (‘3‘,‘zhang‘,‘this_is_slave2‘); 7:在client上查詢三次 mysql> use db_test; mysql> select * from zang; 對比三次的輸出,驗證讀操作,發現沒有在master寫入的數據,而slave上寫的能查到 8:在client上 mysql>insert into zang values (‘4‘,‘zhang‘,‘this_is_client‘); mysql> select * from zang; \\發現在client上查詢不到自己寫的數據 9:在master上 mysql> select * from zang; \\能查到在client上寫入的數據,說明寫操作在master上 10:在slave上 mysql> select * from zang; \\發現沒有數據,說明寫入的操作是在master上 知識拓展: 一、mysql主從原理 1. 基本介紹 MySQL 內建的復制功能是構建大型,高性能應用程序的基礎。將 MySQL 的 數億分布到到多個系統上去,這種分步的機制,是通過將 MySQL 的某一臺主機的數據復制到其它主機( Slave )上,並重新執行一遍來實現的。復制過程中一個服務器充當服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置,從服務器接收從那時起發生的任何更新,然後封鎖等等主服務器通知新的更新。 請註意當你進行復制時,所有對復制中的表的更新必須在主服務器上進行。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對服務器上的表所進行的更新之間的沖突 2. MySQL支持的復制類型 1.基於語句的復制。 在主服務器上執行的 SQL 語句,在從服務器上執行同樣的語句。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對服務器上的表所進行的更新之間的沖突,配置:binlog_format = ‘STATEMENT‘ 2.基於行的復制。把改變的內容復制過去,而不是把命令在從服務器上執行一遍,從 MySQL 5.0開始支持,配置:binlog_format = ‘ROW‘ 3.混合類型的復制。默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制,配置:binlog_format = ‘MIXED‘ 3. mysql復制解決的問題 ?數據分布 ?負載平衡 ?備份 ?高可用性和容錯行 4. 復制是如何工作的 可以簡化為三個步驟(如下圖): 1.Master 將改變記錄到二進制日誌中。 2.Slave 將 Master 的二進制日誌拷貝到它的中繼日誌( Relay_log ) 3.Slave 重做中繼日誌中的事件,將改變反映它自己的數據 說明: 1.Master 記錄二進制的日誌。在每個事務更新數據之前,Master 在二進制日誌記錄這些改變。 MySQL 將事務日誌的寫入二進制日誌,及時事務中的語句都市交叉執行的。在事件寫入二進制日誌完成後,Master 通知存儲引擎提交事務。 2.Slave 將 Master 的 Binary log 拷貝到它自己的中繼日誌。首先 Slave 開始一個工作線程--I/O線程。I/O 線程在 Master 上打開一個連接,然後開始從二進制日誌中讀取事件,如果已經連上 Master,它會並等待master產生新的事件。I/O線程就這些事件寫入中繼日誌。 3.SQL Slave Thread ( SQL從線程)處理該過程的最後一步。SQL純種從中繼日誌讀取事件,並重放其中的事件而更新 Slave 的數據。使其它與 Master 中的數據保持一致。只要該線程與 I/O 線程保持一致,中繼日誌通常會位於 OS 的緩存中,所以中繼日誌的開銷很小。 4.此處,在 Master 中也有一個工作線程,和其他 MySQL 的連接一樣,Slave 在 Master 中打開一個連接也會使得 Master 開始一個線程。復制過程有一個很重要的限制---復制在 Slave 上是串行化的,也就是說 Master 上的並行更新操作不能在 Slave 上並行操作。 5. 復制常用類型 5.1 復制的常用體系結構基本原則 1.每個 Slave 只能有一個 Master; 2.每個 Slave 只能有一個唯一的服務器ID; 3.每個 Master 可以有很多 Slave; 4.如果你設置了 log_slave_updates,Slave 可以是其他 Slave 的 Master,從而擴散 Master 的更新 5.MySQL 不支持多主服務器復制---即一個 Slave 可以有多個 Master,但是,通過一些簡單的組合,我們卻可以建立靈活而強大的復制體系結構。 5.2 一主多從復制架構 1.場景:在主庫讀取請求壓力非常大的場景下,可以通過配置一主多從復制架構實現讀寫分離,把大量對實時性要求不是特別高的讀請求通過負載均衡到多個從庫上,降低主庫的讀取壓力。在主庫出現異常宕機的情況下,可以把一個從庫切換為主庫繼續提供服務; 2.建議: 1.當 Slave 增加到一定數量時,Slave 對 Master 的負載以及網絡帶寬都會成為一個嚴重的問題。 2.不同的 Slave 扮演不同的作用(例如使用不同的索引,或者不同的存儲引擎) 3.用一個 Slave 作為備用 Master,只進行復制 4.用一個遠程的 Slave,用於災難恢復。 5.3 多級復制架構 1.場景:一主多從的架構能夠解決大部分讀請求壓力特別大的場景需求,但主庫的I/O壓力和網絡壓力會隨著從庫的增加而增長,而使用多級復制架構就可以解決一主多從場景下,主庫額外的I/O和網絡壓力。 但要註意的是,多級復制場景下主庫的數據是經歷兩次才到達讀取的從庫,期間的延時比一主多從復制場景下只經歷一次復制的要大。 2.建議: 1.可能存在延時較長的風險 2.這種方案可以與第三方軟件結合使用,例如Slave+LVS+Keepalived 實現高可用。 5.4 雙主復制/Dual Master架構 1.場景:雙主/Dual Master架構適用於寫壓力比較大的場景,或者DBA做維護需要主從切換的場景,通過雙主/Dual master架構避免了重復搭建從庫的麻煩。 2.建議: 1.最大問題就是更新沖突。 2.可以采用MySQL Cluster,以及將Cluster和Replication結合起來,可以建立強大的高性能的數據庫平臺。 二、mysql主從配置 1.基礎環境配置 ?數據庫版本: mysql 5.1.73 ( Slave 版本可以大於或者等於 Maste r版本) ?操作系統: CentOS 6.7 x86_64 ?IP地址:192.168.124.10 ( Master ) 192.168.124.20 ( Slave ) 2.創建復制賬號 在 Master 的數據庫中建立一個復制賬戶,每個 Slave 使用該賬戶連接 Master 進行復制,需要?replication slave?和?replication client?權限,Master 的連接信息會存儲在文本文件 master.info 文件中。(master.info文件在 Slave 的數據目錄中) mysql>grant replication slave,replication clinet on *.* to ‘replication‘@‘192.168.124.10(slave IP)‘ identified by ‘123456‘; mysql>flush privileges 說明:創建了一個用戶名為 replication 的用戶,密碼為 123456 ,只允許在 192.168.124.10 這個 Slave 上登錄。 3.拷貝數據 如果是新安裝的 MySQL 主從服務器,這一步不需要。如果 Master 之前有數據,需要把 Master 的數據導出並還原到 Slave 上,要保證 Master 和 Slave 服務器中的數據是一樣的。建議導出 Master 庫的時候進行鎖表,導完後再解鎖。 mysql>flush tables with read lock; mysqldump -uroot -p1234 dy_qqopen > dy_qqopen.sql mysql>unlock tables; .Master 服務器配置: 修改配置都需要修改 MySQL 的數據庫配置文件,默認是 /etc/my.cnf 4.1 開啟二進制日誌 1.log-bin=mysql-bin?改成log-bin=/var/log/mysql/master-bin 2.增加?binlog_format=mixed 4.2 取消 server-id 的註釋 將?server-id=1?前面的註釋去掉,如果沒有,則手動添加到 mysqld 下面。 必須要配置 server-id ,server-id 的值不能和 Slave 是一樣的。 4.3 設置需要同步的數據庫 在 [mysqld] 下面添加?binlog-do-db=dy_qqopen 說明:binlog-ignore-db=test 表示不同步 test 數據庫,如果有多個數據庫,需要多寫幾行。 4.4 創建二進制日誌目錄,授權,重啟 MySQL mkdir -p /var/log/mysql/ chown mysql.mysql -R /var/log/mysql service mysqld restart 4.5 查看 Master 狀態 mysql > show master status; 記錄下 File 和 Postition,下面配置 Slave 的時候需要用。 5.Slave 服務器配置 修改配置都需要修改 MySQL 的數據庫配置文件,默認是 /etc/my.cnf 5.1 修改 server-id 和開啟中繼日誌 將?server-id=1?改成?server-id=2 relay-log=/var/log/mysql/relaylogs 5.2 創建中繼日誌,授權以及重啟 mkdir -p /var/log/mysql chown mysql.mysql -R /var/log/mysql /etc/init.d/mysqld restart 5.3 查看中繼日誌啟動狀態 mysql>show global variables like ‘%relay%‘; 5.4 連接 Master 服務器 mysql>change master to master_host=‘192.168.124.20‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=103; 選項: ?master_host:Master 服務器IP ?master_user:Master 服務器授權用戶,也就是 Master 前面創建的那個用戶 ?master_password:Master 服務器授權用戶對應的密碼 ?master_log_file:Master binlog 文件名 ?master_log_pos:Master binlog 文件中的 Postion 值 ?更多的選項可以看:http://dev.mysql.com/doc/refman/5.7/en/change-master-to.html 說明:使用剛剛在 Master 創建的用戶連接,log_file 和 log_pos 就是使用剛剛在 Master 上執行?show master status;?執行出來的結果× 5.5 手動啟動復制線程 mysql> start slave; 5.6 查看主從狀態 mysql>show slave status \G; 說明:如果 Last_SQL_Error 沒有錯誤提示以及 Salve 中的 Exec_Master_Log_Pos 值和 Master 中的 show master status; 中的 Postition 值是一樣的,這樣的話,MySQL 主從復制應該是成功的。 6. 測試 在 Master 數據庫中執行sql語句操作,觀察 Slave 是否同步,如果同步則說明配置成功。 7. 註意事項 1.主庫和從庫的數據庫名必須相同; 2.主庫和從庫的復制可以精確到表,但是在需要更改主庫或從庫的數據結構時需要立刻重啟slave; 3.不能在mysql配置文件裏直接寫入master的配置信息,需要用change master命令來完成; 4.指定replicate_do_db必須在my.cnf裏配置,不能用change master命令來完成; 5.如果不及時清理,日積月累二進制日誌文件可能會把磁盤空間占滿,可以在配置文件裏加上expire_logs_days=7,只保留最近7天的日誌,建議當slave不再使用時,通過reset slave來取消relaylog; 6.寫一個監控腳本,用來監控 Slave 中的兩個"yes",如果只有一個"yes"或者零個,就表明主從有問題。 三、MySQL 主從一致性檢查 1.介紹 主從一致性主要是通過 Percona-Toolkit 這個工具來實現的,Percona Toolkit 是一組高級的命令行工具,用來管理 MySQL 和系統任務,主要功能包括: ?驗證主節點和復制數據的一致性 ?有效的對記錄進行歸檔 ?找出重復的索引 ?總結 MySQL 服務器 ?從日誌和 tcpdump 中分析查詢 ?問題發生時收集重要的系統信息。 現在,使用這個工具來完成一致性檢查和數據同步。官網是:https://www.percona.com/software/mysql-tools/percona-toolkit 2.安裝 Percona-Toolkit 工具 安裝的方式有多種,可以編譯安裝,也可以通過包管理器安裝,為了方便,直接下載 rpm 包,然後yum進行安裝。 文件下載地址:https://www.percona.com/doc/percona-toolkit/2.2/installation.html wget percona.com/get/percona-toolkit.rpm yum install percona-toolkit.rpm -y 3.一致性檢查 3.1 註意點: ?需要創建一個既能登錄主庫,也能登錄從庫,而且還能同步數據庫的帳號。 ?只能指定一個host,必須為主庫的IP ?在檢查時會向表加S鎖 ?運行之前需要從庫的同步IO和SQL進程是YES狀態 3.2 創建檢查帳號 mysql>grant select,process,super,replication slave on *.* to ‘mysql_check‘@‘x.x.x.x‘ identified by ‘123456‘; mysql>flush privileges; 3.3 執行檢測(在master上操作) pt-table-checksum --nocheck-replication-filters --databases=dy_qqopen --replicate=test.checksums --create-replicate-table --host=192.168.124.20 --port 3306 -umysql_check -pLooking_s123 --recursion-method=hosts 參數說明: ?--nocheck-replication: 不檢查復制過濾器,建議啟動。後面可以用--databases來指定需要檢查的數據庫。 ?--databases:指定需要被檢查的數據庫,多個則用逗號隔開 ?--tables:指定需要被檢查的標,多個用逗號隔開。 ?--replicate:把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。 ?--create-replicate-table:創建存放檢查信息的數據表,第一次運行需要加,以後就不需要添加了。 ?--recursion-method:查找 Slave 的方式,有三種, processlist, dsn, hosts ?h:Master地址 ?u:mysql的檢測用戶的用戶名 ?p:mysql檢測用戶的密碼 ?P:3306,mysql的端口號 執行結果: 參數說明: ?TS: 完成檢查的時間 ?ERRORS:檢查時發生錯誤和警告的數量 ?DIFFS:0 表示一致,1 表示不一致,當指定 --no-replicate-check 時,會一直為0,當指定 --replicate-check-onley 則會顯示不同的信息 ?ROWS:表的行數。 ?CHUNKS:被劃分到表中的塊的數目 ?SKIPPED:由於錯誤或警告過大,則跳過塊的數目。 ?TIME:執行的時間。 ?TABLES:被檢查的表名 說明:如果出現不一致的情況,就需要進行修復了。 3.4 命令錯誤 問題1:?執行命令時提示 "Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information."錯誤 解決方法:?在從服務器的?/etc/my.cnf?配置文件中添加兩行,report_host=192.168.124.10(slave_ip) report_port=3306(slave_port)。然後重啟 MySQL 服務 4. 不一致數據修復 4.1 介紹 使用 pt-table-sync 這個命令來修復。 pt-table-sync 命令介紹:高效的同步 MySQL 表之間的數據,他可以做單向和雙向的表數據。也可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式對象。所以在修復一致性之前需要保證他們表存在。 4.2 修復不一致的數據 pt-table-sync --print --user=mysql_check --password=Looking_s123 h=192.168.124.20,D=dy_qqopen,t=qq_task h=192.168.124.10 參數說明: ?--print:打印出修復語句,如果需要修復,將 --print 改成 --execute,會直接執行修復語句,但是建議先使用 print 看一下修復語句,以保證不會出錯。 ?--user:MySQL 檢測用戶的用戶名 ?--password:MySQL 檢測用戶的密碼 ?D:目標數據庫 ?t:數據表 ?h:兩個h,第一次出現的是 Master 的 IP ,第二次出現的是 Slave 的地址。 四、MySQL 主從錯誤處理 1. 說明: 解決和處理主從錯誤這個是最重要的,比配置更更要。提高處理問題的能力,要熟悉原理,多處理積累,多學習其他網友的處理方式。出現錯誤都會在 Last_SQL_Error 中顯示錯誤,一般根據錯誤提示進行處理,如果不太清楚,可以谷歌查詢一下,不過操作完之後,同步正常後,一定要核對一下數據是否一致。

搭建MySql主從復制與讀寫分離