1. 程式人生 > >Mysql的主從配置

Mysql的主從配置

osi sla ava cati 安裝 mysql主從 var 阿裏雲 發送

前言:這次學習分布式的思想要配置mysql的主從復制和讀寫分離,我在主從配置上踩到很多坑,在此演示一遍配置過程,並附上問題的說明和自己的一些見解

Mysql主從復制的原理

附上原理圖:

技術分享圖片

mysql的主從復制原理其實挺簡單,主要由兩種類型3個線程完成:I/O 和 sql thread

主服務器上有一個I/O thread用來生成二進制日誌,每當有事務產生便寫入二進制文件,所有主服務器上需要配置mysql 打開日誌服務,新的日誌內容會通過從服務器的I/O thread 更新到從服務器上的日誌

從服務器更新日誌後會用sql thread 寫入數據庫,從而實現復制

顯而易見,這種復制方式在數據傳輸的時候會占用一定時間產生延遲,我們接下來的配置用於測試,一般不會出現延遲

主從復制的配置

測試環境

兩臺服務器都是阿裏雲上的ubuntu16,開始之前先ping一下看看ping不ping的通,如果是新買的服務器可能ping不通,好像是什麽阿裏雲的保護機制

主服務器:120.78.85.213

從服務器:120.79.205.19

mysql版本:5.7.21 (這次演示都是新下的mysql)

mysql下載:

sudo apt-get update
sudo apt-get install mysql-client mysql-server

(附帶mysql刪除,說不定你會用的到)

sudo apt-get remove mysql-*

dpkg -l |grep ^rc|awk ‘{print $2}‘ |sudo xargs dpkg -P

主服務器配置

在 /etc/mysql/mysql.conf.d/ 目錄下(按上述安裝一般在這裏)的mysqld.cnf 的[mysqld]下配置server-id 和 log_bin

server-id 是服務器號(我這樣理解),具體值隨意,只要不和從服務器不重疊

log_bin 就是開啟二進制服務(必須要有的)

其他的配置可配可不配(比如:備份那些數據庫等等)這是最簡單的配置

技術分享圖片

然後重啟mysql讓配置生效

service mysql restart

登錄到mysql,如果你想遠程連接數據庫先把mysql 庫(mysql 的基礎數據庫)中的user 表中的 root 用戶的host 更新為 %

use mysql;

update user set host=‘%‘ where user=‘root‘;

其次在剛剛的配置文件裏面bind-address 這行

你可以配置為bind-address = 0.0.0.0 或者直接註釋掉

如果你的遠程還是無法連接可以重啟mysql 或者 調用一個fush什麽的命令使配置文件有效


現在開始正式的配置

先在主服務器上設置一個賬號讓從服務器能夠訪問

create user ‘dba‘@‘120.79.205.%‘ identified by ‘123456‘;
grant replication slave on *.* to dba@‘120.79.205.%‘;

這裏用了兩步,網上有些配置只用了一步會有一個警告,這個警告好像在mysql5 之後才有的,具體內容就是不能太暴露什麽的(比如 mysql -uroot -pXXXX 這時在Linux下你的密碼也會暴露,一般warning不用管),用show warning可以查看

這兩步的意思很簡單

一:創建一個名為dba 密碼為123456的賬號在120.79.205這個網段上都能訪問

二:授權120.79.205這個網段名為 dba 的用戶可以和主服務器建立 slave 連接

訪問mysql.user 表可以看到此用戶


然後在主服務器上創建數據庫/表,並插入(我自己打的,可能有錯,如果你復制的話)

create database dba;

create table t(id int,name varchar(10),primary key(id));

insert into t values(1,‘aa‘),(2,‘aa‘),(3,‘aa‘);

插入數據成功後,網上有的配置直接開始配置從數據庫,但是這裏需要發送一份.sql 到從數據庫先同步一道,畢竟如果不是測試數據庫一般不一樣,需要在開始就同步(所以一般會在第一步配置,指定要同步的數據庫)

退出數據庫

備份

mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p > all.sql;

輸入數據庫密碼

發送到從數據庫

scp all.sql [email protected]:/tmp

輸入連接密碼

發送到從數據庫的 /tmp 目錄下


從數據庫配置

參考主數據庫的配置打開 mysqld.cnf 只用配置server-id = 2(不和其他數據庫的id相同)

從 /tmp下導入.sql 文件

cd /tmp

mysql -uroot -p <all.sql

重啟mysql(這裏不是因為導入需要重啟,而是改了配置文件需要重啟,照顧某些強迫癥患者)

你可以查看一下是否導入成功


現在我們前期工作做好了,準備開始連接

在主服務器上mysql 操作下輸入命令:show master status\G;

*************************** 1. row ***************************
             File: master-bin.000002
         Position: 1483
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

ERROR:
No query specified

  這個error 不用管

記住

File: master-bin.000002
Position: 1483
這是你主服務器的日誌名和日誌位置,錯了就無法連接

然後再從服務器的mysql 操作下輸入:

show slave status\G;

如果顯示不為空則先停止slave :stop slave

嘗試建立連接

change master to master_host=‘120.78.85.213‘,master_user=‘dba‘,master_password=‘123456‘,master_log_file=‘master-bin.000002‘,master_log_pos=1483;

這裏一定要註意!!!

master_log_file=‘master-bin.000002‘,master_log_pos=1483 對應的就是主服務器上的日誌名和位置

千萬千萬不要錯了,我當時在配置的時候看了很多博客,有些在配置主服務器的時候是log_bin = mysql 有些是 log_bin = master ,導致後面的命名不同就一直連不上,切記切記

開啟slave: start slave

查看slave 狀態:show slave status\G;

技術分享圖片

如果兩個狀態都為yes 則代表連接成功

如果io 為no 則代表I/O線程失敗,你可以查看Last_IO_Errno:裏面的信息為失敗原因

不外乎兩種:前面提到的server id 重疊,或者就是change master 不對應

或者是防火墻問題:

安裝防火墻:

sudo apt-get install ufw

你可以通過以下兩個命令開啟允許訪問的端口:

ufw allow 端口號(3306)

ufw allow from ip(120.79.94.90)

兩個服務器都查看一下

ufw status看看是否開啟

如果sql _running:no 一般是你沒開啟slave ,start slave就OK


最後你就可以在主服務器上測試插入數據看是否同步了

以上是我配置主從的過程,可參考

Mysql的主從配置