mysql系列之複製2----主從同步部署mysql
原做品出處:http://nolinux.blog.51cto.com/4824967/1530108linux
通過了上一篇mysql系列之複製1----原理篇,相信你們已經對mysql的複製有所瞭解了。本篇博文將帶你們一塊兒來部署下mysql的主從同步架構。sql
1
2
3
4
5
6
7
8
|
環境:
CentOS 6.5 x86_64位 採用最小化安裝,系統通過了基本優化
selinux 爲關閉狀態,iptables 爲無限制模式
主機名:master==>ip:172.16.100.1==>MySQL版本:mysql-5.5.32
主機名:slave ==>ip:172.16.100.2==>MySQL版本:mysql-5.5.32
源碼包存放位置:/usr/local/src
源碼包編譯安裝位置:/usr/local/mysql
數據庫存放位置:/mydata
|
架構圖:數據庫
1、主從複製前環境檢查安全
主服務器檢查:服務器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@master ~]# hostname
master
[root@master ~]# uname -a
Linux master 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@master ~]# mysql -uroot -psunsky -e 'select version();'
+------------+
| version() |
+------------+
| 5.5.32-log |
+------------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like '%datadir%';"
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| datadir | /mydata/ |
+---------------+----------+
|
從服務器檢查:架構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@slave ~]# hostname
slave
[root@slave ~]# uname -a
Linux slave 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@slave ~]# mysql -uroot -psunsky -e 'select version();'
+-----------+
| version() |
+-----------+
| 5.5.32 |
+-----------+
[root@slave ~]# mysql -uroot -psunsky -e "show variables like '%datadir%';"
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| datadir | /mydata/ |
+---------------+----------+
|
2、主庫執行操做ide
a、設置server-id值並開啓binlog參數測試
因爲咱們知道,mysql的主從同步的關鍵因素就是 binlog 日誌,因此咱們須要先在主服務器打開 binlog 日誌的功能。而且,咱們也要保證主服務器的server-id惟一,通常咱們都將主服務器的server-id設置爲1.優化
下面是須要修改的內容:
1
2
3
4
5
|
[mysqld]
server-id = 1
log-bin = /mydata/mysql-bin # 設定binlog日誌的位置
binlog_format=mixed # 設定 binlog 日誌格式爲混合格式
sync-binlog = 1 # 在主服務器設定,用於事務安全
|
提示:
一、上面兩參數要放在my.cnf中的[mysqld]模塊下,不然會出錯
二、咱們也要保證主服務器的server-id惟一。server-id的值要使用服務器ip地址的最後8位如1,目的是避免不一樣機器或實例ID重複,不適合多實例。server-id的範圍: 0 < server-id < 2的32次方-1的天然數
三、要先在 my.cnf 配置文件中查找相關參數,並按要求修改,不存在時再添加參數,切記,參數不能重複
b、修改 my.cnf 配置後重啓數據庫
1
2
3
|
[root@master ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
|
檢查配置後的結果:
檢查方法一:
1
2
3
4
5
|
[root@master ~]# egrep 'server-id|log-bin|binlog_format|sync' /etc/my.cnf
server-id = 1
log-bin = /mydata/mysql-bin
binlog_format=mixed
sync-binlog = 1
|
檢查方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[root@master ~]# mysql -uroot -psunsky -e "show variables like 'log_bin';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like '%server_id%'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like 'binlog_format';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
[root@master ~]# mysql -uroot -psunsky -e "show variables like 'sync_binlog';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
|
c、創建用於同步的帳號rep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@master ~]# mysql -uroot -psunsky -e "grant replication slave on *.* to rep@'172.16.100.%' identified by 'sunsky';"
[root@master ~]# mysql -uroot -psunsky -e "select user,host from mysql.user where user='rep';"
+------+--------------+
| user | host |
+------+--------------+
| rep | 172.16.100.% |
+------+--------------+
[root@master ~]# mysql -uroot -psunsky -e "show grants for rep@'172.16.100.%';"
+--------------------------------------------------------------------------------------+
| Grants for rep@172.16.100.% |
+--------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'172.16.100.%' IDENTIFIED BY PASSWORD '*5C275EDDF185436A097C27336FB99357638439A4' |
+--------------------------------------------------------------------------------------+
[root@master ~]# mysql -uroot -psunsky -e "show grants for rep@'172.16.100.%';"
+--------------------------------------------------------------------------------------+
| Grants for rep@172.16.100.% |
+--------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'172.16.100.%' IDENTIFIED BY PASSWORD '*5C275EDDF185436A097C27336FB99357638439A4' |
+--------------------------------------------------------------------------------------+
|
d、對數據庫鎖表只讀,並查看主庫狀態以及導出數據庫數據
因爲對數據庫鎖表後,不能退出當前的會話,一旦退出就自動解鎖了。所以,咱們將鎖表、查看主庫狀態以及導出數據庫數據放到一步來作!
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@master ~]# mkdir /bak
[root@master ~]# mysql -uroot -p'sunsky' << EOF
flush tables with read lock;
system echo '----show master status result----'
system mysql -uroot -p'sunsky' -e "show master status"
system mysqldump -uroot -p'sunsky' -A -B --events|gzip > /bak/master.$(date +%F).sql.gz
EOF
----show master status result----
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000001 257
[root@master ~]# ll /bak/master.2014-06-03.sql.gz
-rw-r--r--. 1 root root 144360 Jun 3 23:50 /bak/master.2014-06-03.sql.gz
|
注意:
在執行鎖表命令的時候,在不一樣的引擎的狀況,會受下面參數的控制。鎖表的時候,若是超過設置的時間不操做會自動解鎖。主要受下面2個參數影響!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@master ~]# mysql -uroot -p'sunsky' -e "show variables like '%timeout%';"
+--------------------------------+-----------+
| Variable_name | Value |
+--------------------------------+-----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+--------------------------------+-----------+
|
e、把主庫備份的MYSQL數據遷移到從庫
1
2
3
|
[root@master ~]# scp /bak/master.2014-06-03.sql.gz 172.16.100.2:/tmp/
root@172.16.100.2's password:
master.2014-06-03.sql.gz 100% 141KB 141.0KB/s 00:00
|
3、從庫執行操做
a、設置server-id值並關閉binlog參數
咱們要對從服務器設置惟一的server-id,而且要註釋掉從服務器的 binlog 參數配置。
修改後參數以下:
1
2
3
|
[mysqld]
server-id = 2
#log-bin = /data/3307/mysql-bin
|
提示:
一、上面兩參數要放在my.cnf中的[mysqld]模塊下,不然會出錯
二、咱們也要保證主服務器的server-id惟一。server-id的值要使用服務器ip地址的最後8位如1,目的是避免不一樣機器或實例ID重複,不適合多實例。server-id的範圍: 0 < server-id < 2的32次方-1的天然數
三、要先在 my.cnf 配置文件中查找相關參數,並按要求修改,不存在時再添加參數,切記,參數不能重複
四、修改 my.cnf 配置後須要重啓數據庫
另外,在如下兩種狀況下,咱們須要在從服務器上打開 log-bin 來記錄數據庫更新的sql語句:
1
2
|
a、級聯同步,A==>B==>C 那中間的B就要開啓log-bin
b、在從庫作數據庫備份,數據庫備份必需要有全備 + binlog
|
檢查配置後的結果:
1
2
3
4
5
|
[root@slave ~]# egrep 'server-id|log-bin' /etc/my.cnf
server-id = 2
#log-bin=mysql-bin
[root@slave ~]# /etc/init.d/mysqld stop
[root@slave ~]# /usr/local/mysql/bin/mysqld_safe --skip-slave-start &
|
b、還原主庫導出的數據到從庫
1
2
3
4
5
6
|
[root@slave ~]# ll /tmp/master.2014-06-03.sql.gz
-rw-r--r--. 1 root root 144360 Jun 4 02:10 /tmp/master.2014-06-03.sql.gz
[root@slave ~]# gunzip /tmp/master.2014-06-03.sql.gz
[root@slave ~]# ll /tmp/master.2014-06-03.sql
-rw-r--r--. 1 root root 528663 Jun 4 02:10 /tmp/master.2014-06-03.sql
[root@slave ~]# mysql -uroot -psunsky < /tmp/master.2014-06-03.sql
|
c、登錄從庫配置同步參數
1
2
3
4
5
6
7
8
9
|
[root@slave ~]# mysql -uroot -psunsky << EOF
> CHANGE MASTER TO
> MASTER_HOST='172.16.100.1', # 指定主庫的 IP 地址
> MASTER_PORT=3306, # 指定主庫的端口
> MASTER_USER='rep', # 指定負責同步的用戶爲rep
> MASTER_PASSWORD='sunsky', # rep用戶的密碼
> MASTER_LOG_FILE='mysql-bin.000001', #這裏是經過 show master status 看到的二進制日誌文件名稱,注意不能多空格
> MASTER_LOG_POS=257; #這裏是經過 show master status 時查看到的二進制日誌偏移量,注意不能多空格
> EOF
|
上述操做的實質,mysql會把用戶和密碼等信息寫入到 master.info 文件中
d、啓動從庫同步開關
接下來,咱們啓動從庫同步的開關,而且查看從庫的同步狀態
1
2
3
4
5
|
[root@slave ~]# mysql -uroot -psunsky -e 'slave start'
[root@slave ~]# mysql -uroot -p'sunsky' -e 'show slave status\G'|egrep "Seconds_Behind_Master|_Running"
Slave_IO_Running: Yes # I/O線程運行是否正常
Slave_SQL_Running: Yes # SQL線程運行是否正常
Seconds_Behind_Master: 0 # 同步延時
|
e、測試複製結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@master ~]# mysql -uroot -psunsky -e "create database sunsky; "
[root@master ~]# mysql -uroot -p'sunsky' -e "show databases;"
+------------------------+
| Database |
+------------------------+
| information_schema |
| mysql |
| performance_schema |
| sunsky |
| test |
+------------------------+
[root@slave ~]# mysql -uroot -p'sunsky' -e "show databases;"
+------------------------+
| Database |
+------------------------+
| information_schema |
| mysql |
| performance_schema |
| sunsky |
| test |
+------------------------+
|
OK!
這樣子,咱們的MySQL主從同步架構就部署完成了!但願能對你們有所幫助!
本文出自 「Not Only Linux」 博客,請務必保留此出處http://nolinux.blog.51cto.com/4824967/1530108