標籤:
一、前言:為什麼MySQL要做主從複製(讀寫分離)?
通俗來講,如果對資料庫的讀和寫都在同一個資料庫伺服器中操作,業務系統效能會降低。
為了提升業務系統效能,最佳化使用者體驗,可以通過做主從複製(讀寫分離)來減輕主要資料庫的負載。
而且如果主要資料庫宕機,可快速將業務系統切換到從資料庫上,可避免資料丟失。
二、MySQL主從複製(讀寫分離)和叢集的區別:
我對MySQL也是剛開始研究,不是很專業。我的理解是:
1、主從複製(讀寫分離):一般需要兩台及以上資料庫伺服器即可(一台用於寫入資料,一台用於同步主的資料並用於資料查詢操作)。
局限性:
(1)配置好主從複製之後,同一張表,只能對一個伺服器寫操作。如果在從上執行了寫操作,而之後主也操作了這張表,或導致主從不同步;據說可以配置成主主方式,但我還沒有研究到。
(2)主要資料庫伺服器宕機,需要手動將業務系統切換到從資料庫伺服器。無法做到高可用性(除非再通過部署keepalive做成高可用方案)。
2、叢集是由N台資料庫伺服器組成,資料的寫入和查詢是隨機到任意一台資料庫伺服器的,其他資料庫伺服器會自動同步資料庫的操作。
任何一台資料庫宕機,不會對整個叢集造成大的影響。
局限性:我經過測試才知道目前mysql叢集版本(MySQL Cluster)只能對NDB儲存引擎的資料進行叢集同步,如果是INNODB或其他的MySQL儲存引擎是不行的。這個也導致了我放棄了在業務系統中應用這種方案。
三、迴歸正題,接下來開始MySQL5.6.12的主從複製教程:
1、MySQL5.6開始主從複製有兩種方式:基於日誌(binlog);基於GTID(全域事務標示符)。
需要注意的是:GTID方式不支援暫存資料表!所以如果你的業務系統要用到暫存資料表的話就不要考慮這種方式了,至少目前最新版本MySQL5.6.12的GTID複製還是不支援暫存資料表的。
所以此篇教程主要是告訴大家如何通過日誌(binlog)方式做主從複製!
2、MySQL官方提供的MySQL Replication教程:
http://dev.mysql.com/doc/refman/5.6/en/replication.html
這個官方教程強烈建議大家閱讀(需要一定的英語閱讀能力哦!不行就google翻譯後再閱讀吧~)。
三:準備工作
配置MySQL主從複製(讀寫分離)之前,需要在主從兩台伺服器先安裝好MySQL5.5。我的環境是2台做的實驗
系統:CentOS6.4 32位
Mysql:5.5版本
selinux關閉 防火牆關閉
setenfore 0setvice iptables stop
Master:42.51.153.157
Slave:42.51.155.219
2.就是要確定伺服器上的Mysql
yum install mysql mysql-server -y
3.確認時間同步
[[email protected] ~]# yum install ntp -y[[email protected] ~]# vi /etc/ntp.conf #添加以下2行server 127.127.1.0fudge 127.127.1.0 stratum 8
[[email protected] ~]# /etc/init.d/ntpd restart #重啟ntpd服務
2)在節點伺服器上進行時間同步
[[email protected] ~]# /etc/init.d/iptables stop[[email protected] ~]# chkconfig iptables off[[email protected] ~]# yum install -y ntpdate[[email protected] ~]# /usr/sbin/ntpdate 42.51.153.157
四:配置Mysql
1.首先修改Mysql主配置的設定檔(Master)
[[email protected] ~]# \cp /etc/my.cnf /etc/my.cnf.old ##修改之前備份[[email protected] ~]# vi /etc/my.cnf ##修改server-id = 11 //修改log-bin=master-bin //修改 log-slave-updates=true //增加[[email protected] ~]# /etc/init.d/mysqld restart ##重啟Mysql[[email protected] ~]# 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)
[[email protected] shell]# vi /etc/my.cnf server-id = 33 //修改 此處ID只要比Master大就可以relay-log=relay-log-bin //增加relay-log-index=slave-relay-bin.index //增加修改完成之後重啟mysql服務登入Mysql,配置同步[[email protected] shell]# service mysqld restart[[email protected] ~]# mysql -u root –ppasswordmysql> 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的包 網上有很多
[[email protected] ~]# unzip Discuz_7.2_FULL_SC_UTF8.zip [[email protected] ~]# mv upload/ /usr/share/nginx/html/[[email protected] ~]# cd /usr/share/nginx/html/[[email protected] html]# mv upload/ Discuz[[email protected] html]# chmod 777 -R ./Discuz/[[email protected] ~]# service nginx restart
Master:
Slave:
上面可以看出主從複製成功~~
Linux下Mysql主從複製