mysql 主從服務器 mysql數據庫

             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


架構圖:數據庫

wKiom1PSBcTRdOHEAABGjXzp-_c957.jpg

spacer.gif

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

相關文章
相關標籤/搜索