MySQL主從分離實現

前言

  大型網站爲了減輕服務器處理海量的併發訪問,所產生的性能問題,採用了不少解決方案,其中最主流的解決方案就是讀寫分離,即將讀操做和寫操做分別導流到不一樣的服務器集羣執行,到了數據業務層,數據訪問層,若是仍是傳統的單靠一臺服務器去扛,面對如此多的數據庫鏈接操做,必然會崩潰,若是形成數據的丟失,是不堪設想的。本文將利用mysql的主從配置,實現讀寫分離。mysql

主從庫理論知識

主從同步如何實現?
  同步工做主要又三步,第一步就是主服務器(master)將對數據的操做記錄到二進制日誌文件(Binary log)中,也就是說,在每一個事務更新數據完成以前,mster在日誌裏記錄這些改變,mysql將事務串行地寫入二進制文件中,在事件寫入二進制日誌完成後,master通知存儲引擎提交事務,提交好事務後,就會進入第二步,須要補充一點的是,咱們對數據的一次操做就稱爲一次二進制日誌事件,也就是Binary log event。在第二步呢,Slave將master的Binary log拷貝到它的中繼日誌(Relay log)中,也就是Slave會首先開啓一個工做線程(I/O thread),I/O線程在master上打開一個普通的鏈接,作Binary log的拷貝,從master的二進制日誌文件中讀取事件,若是已經跟上了master,就會睡眠並等待master產生新的事件,I/O線程而後將這些事件寫入中繼日誌中;第三步就是Slave重作中繼日誌事件,SQL線程從中繼日誌中讀取事件,並重放其中的事件,更新Slave中的數據,使其與Master中的數據一致。
linux

主從庫配置

  我在本身VMware虛擬機上裝了兩個centOs系統,使用命令:# cat /etc/redhat-release 能夠看到我本身的CentOs版本爲7.6.1810的
sql

CentOS7.6安裝mysql5.7.31

1. 解壓到/usr/local目錄
# tar -zxvf mysql-5.7.31.tar.gz -C /usr/local

2. mysql-5.7.31-linux-glibc2.5-i686文件夾重命名爲mysql
# cd /usr/local
# mv mysql-5.7.18-linux-glibc2.5-i686/ mysql

3. 新建mysql用戶組和mysql用戶
# groupadd mysql
# useradd -r -g mysql mysql

4. 新建數據目錄
# cd /usr/local/mysql
# mkdir data

5. 更改全部者以及受權755
# cd /usr/local
# chown -R mysql:mysql mysql/
# chmod -R 755 mysql/

6. 初始化mysqld
# cd /usr/local/mysql
# ./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize

若是執行初始化時出現報錯:./bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory,就是少東西,centos使用yum裝yum -y install numactl,裝了後在執行初始化命令就能夠了。

若是出現錯誤:initialize specified but the data directory has files in it. Aborting.大意是提示data目錄有文件,把mysql安裝目錄\data文件夾裏的內容清空(建議讀者備份到其餘地方)。再次執行"mysqld --initialize",沒有報錯了!

記錄下root的初始密碼: Wg;iqpl_P5os數據庫

7. 將mysqld添加成服務,並啓動它
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
創建mysql默認的配置文件/etc/my.cnf,並添加圖片中內容
# vim /etc/my.cnf
vim

按esc,輸入 :wq,保存並退出my.cnf,啓動mysqld
# service mysqld start
查看mysql是否啓動成功
# ps -ef|grep mysql
出現以下信息表示啓動成功
centos

固然也能夠查看mysqld的狀態
# service mysqld status

8. 登陸mysql並修改root密碼
# cd /usr/local/mysql
# ./bin/mysql -uroot –p
輸入初始密碼,步驟6中有生成,出現以下信息表示登陸成功
服務器

修改root密碼
mysql> SET PASSWORD = PASSWORD('123456');
mysql> FLUSH PRIVILEGES;
初次登陸沒有修改root的密碼,操做數據庫會出現以下錯誤提示,那麼須要修改root用戶的密碼
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

9. 設置mysql遠程可訪問(前提是防火牆必須關閉,chkconfig iptables off:設置自動啓動爲關閉,service iptables stop:關閉防火牆)
先登陸到mysql
mysql> use mysql
mysql> update user set host = '192.168.0.148' where user = 'root';
mysql> FLUSH PRIVILEGES;
192.168.0.148便是可遠程訪問本地mysql的遠程ip,若想任意ip都能訪問本地mysql,那麼只須要將192.168.0.148換成%便可
mysql> update user set host = '%' where user = 'root';
併發

MySQL主從庫配置

  本文將ip爲192.168.0.188的主機做爲master,ip爲192.168.0.152的主機做爲slave,我用的mysql版本爲:5.7.31。固然咱們也能夠在本機下載兩套mysql軟件,設置不一樣端口後進行啓動,也是能夠配置出主從同步來。
1. master上配置bin-log日誌
修改mysql的配置文件:# vim /etc/my.cnf,加上以下內容,修改配置後須要重啓mysql服務器性能

log-bin= master-bin  #[必須]啓用二進制日誌
log-bin-index=master-bin.index
server-id         = 4          #[必須]服務器惟一ID,默認是1,最好取ip的後3位
expire-logs-days  = 7           #只保留7天的二進制日誌,以防磁盤被日誌佔滿

測試log_bin是否成功開啓
mysql> show variables like '%log_bin%';
出現下圖,log_bin爲ON則表示開啓成功,OFF表示開啓失敗
測試

配置好後,查看主服務器狀態:show master status

2. slave上配置relay-log
配置從服務器:vim /etc/my.cnf,點擊 i 進入編輯模式,添加以下配置:

relay-log-index=slave-relay-bin.index
relay-log=slave-bin
server-id=152 #只要和master的server-id不同就能夠了

3. 將master和slave聯繫起來,slave須要知道master的地址

  • master的數據庫中創建備份帳號
    repl爲用戶名,192.168.0.152表明從數據庫的主機地址,以下表示遠程地址爲密碼爲123的,用戶名是repl就能夠鏈接到master主機,併爲其授予 replication slave 權限。123爲master的鏈接密碼。
    mysql> create user repl; # 建立用戶名爲repl的用戶
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.152' IDENTIFIED BY '123';
    mysql> FLUSH PRIVILEGES;
    mysql> use mysql;
    mysql> select user,authentication_string,host from user;
    可看到咱們剛建立的備份帳號:

重啓MySQL服務並設置讀取鎖定:登陸mysql],mysql> flush tables with read lock;讀取鎖定的意思是隻能讀取,不能更新,以便得到一個一致性的快照
查看主服務器上當前的二進制日誌名和偏移量值:

4. 咱們已經在主庫配置好了容許從庫訪問主庫的用戶名和密碼,下面咱們對slave進行操做:
mysql> change master to master_host='192.168.0.188',master_port=3306,master_user='repl',master_password='123',master_log_file='master-bin.000001',master_log_pos=154;
其中的master_log_file,就是主庫中file,在主庫中使用 show master status;就能夠看到了。

啓動slave: mysql> start slave;
查看slave從機的狀態(\G表示豎着展現): mysql> show slave status \G

5. 關閉掉主數據庫的讀取鎖定
mysql> unlock tables;
6. 測試
  纔開始的時候,個人主庫和從庫中的數據庫是相同的,使用show databases查看,以下:


我如今主庫執行建立庫語句,執行:create database o2o; 咱們去從庫查詢,會發現該數據庫會自動同步到從庫,以下:

  經過測試驗證,咱們的mysql主從同步就配置好了,這裏須要注意的是主庫的mysql版本不能高於從庫的mysql版本,由於MySQL總的語法是高版本兼容底版本的,若是從庫的版本要比主庫的版本低,可能主庫執行的sql語句,從庫執行就會報錯,致使主從同步失敗;從庫只能讀數據,不能在從庫寫數據,主庫既能夠讀數據,也能夠寫數據。

相關文章
相關標籤/搜索