Linux下MySQL主從複製(Master-Slave)與讀寫分離(Amoeba)實踐

來源:互聯網
上載者:User

Linux下MySQL主從複製(Master-Slave)與讀寫分離(Amoeba)實踐

一、為什麼要做Mysql的主從複製(讀寫分離)?
通俗來講,如果對資料庫的讀和寫都在同一個資料庫伺服器中操作,業務系統效能會降低。
為了提升業務系統效能,最佳化使用者體驗,可以通過做主從複製(讀寫分離)來減輕主要資料庫的負載。
而且如果主要資料庫宕機,可快速將業務系統切換到從資料庫上,可避免資料丟失。

二、MySQL主從複製 Mysql主從複製(讀寫分離)和叢集的區別

我對MySQL也是剛開始研究,不是很專業。我的理解是:
1、主從複製(讀寫分離):一般需要兩台及以上資料庫伺服器即可(一台用於寫入資料,一台用於同步主的資料並用於資料查詢操作)。
局限性:
(1)配置好主從複製之後,同一張表,只能對一個伺服器寫操作。如果在從上執行了寫操作,而之後主也操作了這張表,或導致主從不同步;據說可以配置成主主方式,但我還沒有研究到。
(2)主要資料庫伺服器宕機,需要手動將業務系統切換到從資料庫伺服器。無法做到高可用性(除非再通過部署keepalive做成高可用方案)。
2、叢集是由N台資料庫伺服器組成,資料的寫入和查詢是隨機到任意一台資料庫伺服器的,其他資料庫伺服器會自動同步資料庫的操作。
任何一台資料庫宕機,不會對整個叢集造成大的影響。
局限性:我經過測試才知道目前mysql叢集版本(MySQL Cluster)只能對NDB儲存引擎的資料進行叢集同步,如果是INNODB或其他的MySQL儲存引擎是不行的。這個也導致了我放棄了在業務系統中應用這種方案。

三、迴歸正題,接下來開始MySQL5.5.12的主從複製教程:
1、MySQL5.5開始主從複製有兩種方式:基於日誌(binlog);基於GTID(全域事務標示符)。
需要注意的是:GTID方式不支援暫存資料表!所以如果你的業務系統要用到暫存資料表的話就不要考慮這種方式了,至少目前最新版本MySQL5.5.12的GTID複製還是不支援暫存資料表的。
所以此篇教程主要是告訴大家如何通過日誌(binlog)方式做主從複製!

2、MySQL官方提供的MySQL Replication教程:
http://dev.mysql.com/doc/refman/5.6/en/replication.html
這個官方教程強烈建議大家閱讀(需要一定的英語閱讀能力哦!不行就google翻譯後再閱讀吧~)。

因此,一般來說都是通過 主從複製(Master-Slave)的方式來同步資料,再通過讀寫分離(MySQL-Proxy)來提升資料庫的並發負載能力 這樣的方案來進行部署與實施的。

如所示:

MySQL5.6基於GTID的主從複製

Ubuntu下Nginx做負載實現高效能WEB伺服器5---MySQL主主同步

生產環境MySQL主主同步主鍵衝突處理

MySQL主從失敗 錯誤Got fatal error 1236

MySQL主從複製,單台伺服器上實施

搭建MySQLProxy 伺服器實現讀寫分離+主從同步

MySQL 5.5 主從雙向同步

MySQL 5.5主從同步排錯

MySQL主從複製非同步半同步執行個體

三、MySQL主從複製
情境描述:

主要資料庫伺服器:42.51.153.157,MySQL已經安裝,並且無應用資料。
從資料庫伺服器:42.51.155.219,MySQL已經安裝,並且無應用資料。

系統:CentOS6.4 32位

Mysql:5.5版本

selinux關閉 防火牆關閉

setenforce 0
service iptables stop

2.就是要確定伺服器上的Mysql

yum install mysql mysql-server -y

3.確認時間同步

[root@master ~]# yum install ntp -y
[root@master ~]# vi /etc/ntp.conf    #添加以下2行
server 127.127.1.0
fudge 127.127.1.0 stratum 8

[root@master ~]# /etc/init.d/ntpd restart  #重啟ntpd服務

2)在節點伺服器上進行時間同步

[root@slave1 ~]# /etc/init.d/iptables stop
[root@slave1 ~]# chkconfig iptables off
[root@slave1 ~]# yum install -y ntpdate
[root@slave1 ~]# /usr/sbin/ntpdate 42.51.153.157

四:配置Mysql

1.首先修改Mysql主配置的設定檔(Master)

[root@master ~]# \cp /etc/my.cnf /etc/my.cnf.old        ##修改之前備份
[root@master ~]# vi /etc/my.cnf                        ##修改
server-id      = 11                                    //修改

log-bin=master-bin                                        //修改

        log-slave-updates=true                                  //增加

[root@master ~]# /etc/init.d/mysqld restart          ##重啟Mysql
[root@master ~]# mysql -u root –ppassword                  //登入資料庫,給從伺服器授權
mysql> grant replication slave on *.* to 'yanghongfei'@'42.51.155.219' identified by '123456';
mysql> flush privileges;
mysql> show master status;                ##這個日誌後面會用的到
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      343 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

2.配置從伺服器  (Slave)

[root@master ~]# \cp /etc/my.cnf /etc/my.cnf.old        ##修改之前備份

[root@salve shell]# vi /etc/my.cnf
server-id      = 33                                                        //修改    此處ID只要比Master大就可以

relay-log=relay-log-bin                                                    //增加

relay-log-index=slave-relay-bin.index                          //增加

修改完成之後重啟mysql服務

登入Mysql,配置同步

[root@salve shell]# service mysqld restart

[root@slave1 ~]# mysql -u root –ppassword

mysql> stop slave;                                          ##首先停止

mysql>  change master to master_host='42.51.153.157',master_user='yanghongfei',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=343;

mysql> start slave;

mysql> show slave status \G;

查看是否成功~

上面2處都為Yes的時候表示已經成功了~~

3. 測試主從是否複製成功,主伺服器建立資料庫看是不是被同步過去了

Master:

Slave:

下面我來裝一個Discuz論壇 我們來測試下資料表會不會被同步進去,這裡安裝網站不再詳細說了 我這面用的環境是lnmp  首先下載一個Discuz的包 網上有很多

[root@master ~]# unzip Discuz_7.2_FULL_SC_UTF8.zip     

[root@master ~]# mv upload/ /usr/share/nginx/html/

[root@master ~]# cd /usr/share/nginx/html/

[root@master html]# mv upload/ Discuz

[root@master html]# chmod 777 -R ./Discuz/

[root@master ~]# service nginx restart

Master:

Slave:

上面可以看出主從複製成功~~

Mysql主從複製常用命令

1.停止主節點複製

mysql> stop master;

2.清除主節點複製檔案

mysql> reset master;

3.停止從節點複製

mysql> stop slave;

4.清除從節點複製檔案

mysql> reset slave;

5.開啟從節點複製

mysql> start slave;

6.查看主要資料庫的Master複製資訊

mysql> show master status;

7.查看主節點的複製狀態

mysql> show master status \G;

8.查看從節點的複製狀態

mysql> show slave status \G;

更多詳情見請繼續閱讀下一頁的精彩內容:

  • 1
  • 2
  • 下一頁

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.