linux下mysql雙機主從複製(一主一從)----方法2

   先介紹mysql主從複製或者主從同步的作用,然後介紹實驗過程,最後介紹mysql主從複製原理。

mysql主從同步作用:


   一、1、數據分佈;2、負載平衡;3、備份;4、高可用性(high availability)和容錯。


   二、實驗環境:一臺rhel5.6作爲mysql主服務器,ip爲192.168.65.151;另一臺rhel5.6作爲mysql從服務器,ip爲192.168.65.129


   三、實驗過程:

   在主從機器上分別安裝上mysql

#yum install mysql mysql-server mysql-devel -y

   接下來主從mysql做的內容相似,儘管如此,還是區分來寫。


   在主mysql上面操作:

#service mysqld start

#ps aux |grep mysqld

   /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock

   得到上面內容將其拷貝下來待用。

#service mysqld stop

#mkdir /var/log/mysql

#touch /var/log/mysql/mysql-bin.log

#chmod 777 /var/log/mysql/ -R

#vim /etc/my.cnf

   server-id=1

   log_bin=/var/log/mysql/mysql-bin.log    //在my.cnf中的[mysqld]區域中加上這兩行,保存退出


#/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock --port=3306 --server-id=1 --log-bin=/var/log/mysql/mysql-bin.log &            //將剛纔複製的命令在linux系統下粘貼,並且增加後面三段信息,這樣經過配置好的mysql服務器重新運行了。


# mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.0.77-log Source distribution


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> grant replication slave on *.* to 'slave'@'%' identified by '123';        //在主mysql上面創建同步賬號,用戶名爲slave,密碼爲123.

mysql> flush privileges;            //生效創建的賬號。

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |      378 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)


mysql>


在從mysql上面操作:

#service mysqld start

#ps aux |grep mysqld

   /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock

   得到上面內容將其拷貝下來待用。

#service mysqld stop

#mkdir /var/log/mysql

#touch /var/log/mysql/mysql-bin.log

#chmod 777 /var/log/mysql/ -R

#vim /etc/my.cnf

   server-id=2

   log_bin=/var/log/mysql/mysql-bin.log    //在my.cnf中的[mysqld]區域中加上這兩行,保存退出


#/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock --port=3306 --server-id=2 --log-bin=/var/log/mysql/mysql-bin.log &            //將剛纔複製的命令在linux系統下粘貼,並且增加後面三段信息,這樣經過配置好的mysql服務器重新運行了。

   到這裏開始在從mysql上使用change master從主mysql上同步:

mysql> change master to master_host='192.168.65.151', master_user='slave', master_port=3306, master_password='123', master_log_file='mysql-bin.000001', master_log_pos=378;        //這裏的master_host一定要是主mysql的ip,master_user和master_password是在主mysql上創建的同步賬號和密碼,master_log_file和master_log_pos是在主mysql上執行show master status時出現的file和position對應的東西。

mysql> start slave;        //開啓同步


   現在做個測試,如下圖:

wKiom1NLrbmxjc43AAJDZ38nHOo938.jpg


wKioL1NLraGhNevvAAHzjW2R6uk304.jpg

   實驗表明在主數據庫服務器上新建數據庫可以立即在從數據庫上顯示,這證明實驗成功,即雙機主從mysql複製做成功。


   mysql主從複製原理:

   複製是指將主數據庫的DDL和DML操作通過二進制日誌傳到從服務器上,然後在從服務器上對這些日誌重新執行(也叫重做),從而使得從服務器和主服務器的數據保持同步。MYSQL支持一臺主服務器同時向多臺從服務器進行復制,從服務器同時也可以作爲其他服務器的主服務器,實現鏈狀的複製。mysql複製的優點主要包括以下3個方面:a、如果主服務器出現問題,可以快速切換到從服務器提供服務;可以在從服務器上執行查詢操作,降低主服務器的訪問壓力;可以在從服務器上執行備份,以避免備份期間影響主服務器的服務。注意:由於mysql實現的是異步的複製,所以主從服務器之間存在一定的差距,在從服務器上進行的查詢操作需要考慮到這些數據的差異,一般只有更新不頻繁的數據或者對實時性要求不高的數據可以通過從服務器查詢,實時性要求高的數據仍然需要從主數據庫獲得。

   mysql的複製至少需要兩個mysql服務,這些mysql服務可以分佈在不同的服務器上,也可以在一臺服務器上啓動多個服務。複製配置的步驟比較簡單,下面進行詳細介紹:(1)確保主從服務器上安裝了相同版本的數據庫。因爲複製的功能在持續的改進中,所以在可能的情況下推薦安裝最新的穩定版本。(2)在主服務器上,設置一個複製使用的賬戶,並授予replication salve權限。這裏創建一個複製用戶slave,可以從ip爲任意的主機進行連接,也可以做成只從ip爲192.168.65.151的主機進行連接:mysql> grant replication slave on *.* to 'slave'@'192.168.65.151'identified by '123';(3)修改主數據庫服務器的配置文件my.cnf,開啓binlog,並設置server-id的值,修改完後記得重啓數據庫服務以生效;(4)在主服務器上,設置讀鎖定有效,這個操作是爲了確保沒有數據庫操作,以便獲得一個一致性的快照,在這裏由於我實驗了好幾遍,每次驗證都要鎖定和解鎖,挺麻煩的就沒有做鎖。可以接着第(3)步後面這樣設置鎖:mysql> flush tables with read lock; 解鎖:mysql> unlock tables;(5)然後得到主服務器上當前的二進制日誌名和偏移量值。這個操作的目的是爲了在從數據庫啓動以後,從這個點開始進行數據的恢復。mysql> show master status;(6)現在主數據庫服務器已經停止了更新操作,需要生成主數據庫的備份,備份的方式有多種,可以直接在操作系統下cp全部的數據文件到從數據庫服務器上,也可以通過mysqldump導出數據或者使用ibbackup工具進行數據庫的備份,還可以直接在從數據庫上啓動從mysql服務開始主從同步。如果主數據庫的服務可以停止,那麼直接cp數據文件應該是最快的生成快照的方法:[mysql@db]$ tar -cvf data.tar data,然後將主數據庫的一致性備份恢復到從數據庫上,這裏用.tar打包的文件包只需要解開到相應的目錄即可;用mysqldump備份:1)[mysql@db]$ mysqldump -uroot -p --all-database > all.sql  //備份所有數據庫。2)[mysql@db]$ mysqldump -uroot -p test > test.sql  //備份一個數據庫(test)。 3)[mysql@db]mysqldump -uroot -p test emp > emp.sql  //備份一個數據庫的某張表(數據庫test下的表emp) 4)[mysql@db]mysqldump -uroot -p test emp dept > emp_dept.sql  //備份一個數據庫的多張表(數據庫test下的表emp、dept)。(7)修改從數據庫的配置文件my.cnf,增加server-id (8)對從數據庫服務器做相應設置,指定複製使用的用戶,主數據庫服務器的ip、端口以及開始執行復制的日誌文件和位置等。

   下面再通過圖文並茂的形式解釋mysql主從複製原理:

wKioL1NQmgCwWFZiAAcP3qWt8yY370.jpg

   大致描述過程如下:從服務器的IO線程從主服務器獲取二進制日誌,並在本地保存爲中繼日誌,然後通過sql線程來在從上執行中繼日誌中的內容,從而使從庫和主庫保持一致。主從同步詳細過程如下:

1、主服務器驗證連接。

2、主服務器爲從服務器開啓一個線程。

3、從服務器將主服務器日誌的偏移位告訴主服務器。

4、主服務器檢查該值是否小於當前二進制日誌偏移位。

5、如果小於,澤通知從服務器來取數據。

6、從服務器持續從主服務器取數據,直至取完,這時,從服務器線程進入睡眠,主服務器線程同時進入睡眠。

7、當主服務器有更新時,主服務器線程被激活,並將二進制日誌推送給從服務器,並通知從服務器線程進入工作狀態。

8、從服務器sql線程執行二進制日誌,隨後進入睡眠狀態。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章