mysql的主從複製(一)

主從複製的前提:

   1、雙方的mysql版本最好能保持一致,如果不一致主的要低於從的。

   2、指定從服務器從哪個時間開始複製,如裏主從服務器運行過很長一段時間,並且存在不小的數據集,可以先把主服務器做一下備份,然後在從的上面進行恢復,從主服務器上備份時所處的位置開始複製。

   3、主從服務器時間要保持同步

準備兩臺mysql服務器

   mysql1: 172.16.24.88(主服務器)

   mysql2:  172.16.24.99(從服務器)

保持時間同步:(兩邊的服務器都要執行)

crontab -e

*/5 * * * */usr/sbin/ntpdate 172.16.0,1 &> /dev/null



一、主從基礎配置過程:

1)、修改主服務器的配置文件:

root@www ~]# vim /etc/my.cnf

    log-bin=/mydata/binlogs/master-bin  #啓動二進制日誌

    server-id = 1                       #指定server-id

2)創建二進制文件的存放目錄,並修改其用戶限:

    [root@www ~]# mkdir -pv /mydata/binlogs

    [root@www ~]# chown -R mysql.mysql /mydata/binlogs

3)啓動mysql服務器:

[root@www ~]# service mysqld start

Starting MySQL..                                           [  OK  ]

4)連上mysql我們授於172.16.24.99對本機開放所有權限,授權的密碼爲mypass[root@www ~]#grant replication slave,replication client on *.* to 'myuser'@'172.16.24.99' identified by 'mypass';

[root@www ~]# FLUSH PRIVILEGES;

二、從服務器配置過程

1)、修改主服務器的配置文件:

    [root@www ~]# vim /etc/my.cnf     註釋掉 下面兩項#

    #log-bin=mysql-bin    #註釋掉 #

    #binlog_format=mixed  #註釋掉 #

    relay-log       = /mydata/relaylogs/resay-bin  #在server-id下添加這一行。

2)創建二進制文件的存放目錄,並修改其用戶限:

    [root@www ~]# mkdir -pv /mydata/relaylogs

    [root@www ~]# chown mysql.mysql /mydata/relaylogs


3)連上mysql確保中繼日誌是啓動的

[root@www ~]# mysql

MariaDB [(none)]> show global variables like '%relay%';   #查看中繼日誌是否啓動了

+-----------------------+-----------------------------+

| Variable_name         | Value                       |

+-----------------------+-----------------------------+

| max_relay_log_size    | 1073741824                  |

| relay_log             | /mydata/relaylogs/resay-bin |   顯示已經啓用了中繼日誌

| relay_log_index       |                             |

| relay_log_info_file   | relay-log.info              |

| relay_log_purge       | ON                          |

| relay_log_recovery    | OFF                         |

| relay_log_space_limit | 0                           |

| sync_relay_log        | 0                           |

| sync_relay_log_info   | 0                           |

+-----------------------+-----------------------------+

9 rows in set (0.03 sec)

4)查看一下主服務器現在二進制文件的狀態,以便一會我們啓動起復制功能後做比較。

MariaDB [(none)]> show master status;           #查看一下現在主服務器二進制文件現在的記錄位置

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000001 |      638 |              |                  |

+-------------------+----------+--------------+------------------+

1 row in set (0.03 sec)


MariaDB [(none)]> show processlist;       #查看是否有啓用的線程和啓用的功能

+----+------+-----------+------+---------+------+-------+------------------+----------+

| Id | User | Host      | db   | Command | Time | State | Info             | Progress |

+----+------+-----------+------+---------+------+-------+------------------+----------+

|  5 | root | localhost | NULL | Query   |    0 | init  | show processlist |    0.000 |

+----+------+-----------+------+---------+------+-------+------------------+----------+

1 row in set (0.00 sec)

5)查看複製功能是否打開

MariaDB [(none)]> show slave status\G;   #查看從服務器的狀態信息

*************************** 1. row ***************************

              Slave_IO_State:

                 Master_Host: 172.16.24.88

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File:

         Read_Master_Log_Pos: 4

              Relay_Log_File: resay-bin.000001

               Relay_Log_Pos: 4

       Relay_Master_Log_File:

Slave_IO_Running: No    #關鍵看這兩項,複製功能是否啓動。

           Slave_SQL_Running: No    #


6)複製功能默認都不會啓動,要想啓動只能我們自己手動啓動,啓動命令

MariaDB [(none)]> start slave;  

   MariaDB [(none)]> show slave status\G;    #查看啓動狀態

*************************** 1. row ***************************

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 172.16.24.88

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: master-bin.000001

         Read_Master_Log_Pos: 638

              Relay_Log_File: resay-bin.000002

               Relay_Log_Pos: 926

       Relay_Master_Log_File: master-bin.000001

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes        

7)這樣一個簡得的主從複製就配置好了,如果想要停止則使用下面的命令

   MariaDB [(none)]> stop slave;              #想要停止則用這個命令

    Query OK, 0 rows affected (0.01 sec)  


主從複製之二:

一、如何對主從服務器做限定:

1)如何限定從服務器只讀,在從服務器的配置文件中,添加如下一項:

read-only = ON

MariaDB [(none)]> show global variables like '%read_only%';

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| innodb_read_only | OFF   |

| read_only        | ON    |

| tx_read_only     | OFF   |

+------------------+-------+

2、我們授權一個用戶驗證其效果:(在主服務器上執行以下操作)

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| binlogs            |

| information_schema |

| mydb               |

| mysql              |

| performance_schema |

| test               |

+--------------------+

我們把mydb的表授權給從服務器,授權用戶爲testuser,授權密碼爲testpass

MariaDB [(none)]> grant all on mydb.* to 'testuser'@'172.16.24.99' identified by 'testpass';

Query OK, 0 rows affected (0.00 sec)

3)到從服務器上驗證一下用戶信息:


MariaDB [(none)]> use mysql;

Database changed

MariaDB [mysql]> select User,Host from user;

+----------+-------------------------+

| User     | Host                    |

+----------+-------------------------+

| root     | 127.0.0.1               |

| myuser   | 172.16.24.99            |

| testuser | 172.16.24.99            |

| root     | ::1                     |

| root     | localhost               |

| root     | station96.magelinux.com |

+----------+-------------------------+

注意:僅能限制那不具有SUPER權限用戶無法執行寫操作;想限制所有用戶則:

mysql> FLUSH TABLES WITH READ LOCK;

主從複製之三

1)主從複製時的事務安全(每當有事務提交時,立即將與事務相關的日誌同步至從服務器)

   在從服務器的配置文件中,添加如下一項:

  [root@www ~]# vim /etc/my.cnf

   sync_binlog=1


[root@www ~]# service mysqld restart  #修改完成之後重啓一下mysql;

Shutting down MySQL..                                      [  OK  ]

Starting MySQL..                                           [  OK  ]

[root@www ~]# mysql        #連上mysql


MariaDB [(none)]> show global variables like '%sync_binlog'; #查看修改之後的結果

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| sync_binlog   | 1     |

+---------------+-------+

主從複製之四 (半同步複製)

半同步複製時,主服務器上安裝semisync.master.so,從服務器上則安裝semisync.slave.so.半同步複製時只要從從服務器中找一個就可以了,所以只需要在從服務器中的一臺服務器上裝上semisync.slave.so即可。具體操作如下:

1)主服務器上執行:

  MariaDB [(none)]> Install plugin rpl_semi_sync_master soname 'semisync_master.so';

  MariaDB [(none)]> show global variables like '%semi%';   #查看一下安裝之後的功能是否啓用了沒有:

           +------------------------------------+-------+

           | Variable_name                      | Value |

           +------------------------------------+-------+

           | rpl_semi_sync_master_enabled       | OFF   |  #安裝完成之後默認是沒有啓用的

           | rpl_semi_sync_master_timeout       | 10000 |  #等待從服務器多長時間,單位是毫秒

           | rpl_semi_sync_master_trace_level   | 32    |  #跟蹤級別

           | rpl_semi_sync_master_wait_no_slave | ON    |  #如果沒有從服務器時是否等待它上線

           +------------------------------------+-------+


2)對於我們所要操作的只有以下兩項

MariaDB [(none)]> set global rpl_semi_sync_master_enabled=1;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> set global rpl_semi_sync_master_timeout=2000;

Query OK, 0 rows affected (0.00 sec)


3)MariaDB [(none)]> show global variables like '%semi%';  #再查看一下啓動狀態

+------------------------------------+-------+

| Variable_name                      | Value |

+------------------------------------+-------+

| rpl_semi_sync_master_enabled       | ON    |

| rpl_semi_sync_master_timeout       | 2000  |

| rpl_semi_sync_master_trace_level   | 32    |

| rpl_semi_sync_master_wait_no_slave | ON    |

+------------------------------------+-------+


4)從服務器上的操作:

因爲只有管理員才能修改權限,所以先看一下當前是以哪個用戶的身份運行的確保是root用戶

MariaDB [(none)]> select user();

+----------------+

| user()         |

+----------------+

| root@localhost |

+----------------+


MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';


MariaDB [(none)]> show global variables like '%semi%';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled     | OFF   |

| rpl_semi_sync_slave_trace_level | 32    |

+---------------------------------+-------+

MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=1;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> show global variables like '%semi%';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled     | ON    |

| rpl_semi_sync_slave_trace_level | 32    |

+---------------------------------+-------+

5)因爲主服務器上設置了是否等待從服務器上線,所以我們從服務器設置完成之後要從起一下IO。

MariaDB [(none)]> stop slave io_thread;

Query OK, 0 rows affected (0.02 sec)


MariaDB [(none)]> start slave io_thread;

Query OK, 0 rows affected (0.00 sec)

這樣半同步複製就完成了。

主從複製之五:(複製過濾器

  有時我們期望從服務器只複製主服務器的一部分時,用到了複製過濾器

1)在主服務器上做過濾(則使用以下選項)

master:

binlog_do_db=   #做白名單,表示複製哪些數據庫

binlog_ignore_db=   #忽略哪些數據庫

(注:兩個參數不應該同時使用)

2)從服務器上做過慮(注:要想過濾的更精細一些就在從服務器上做過濾,因爲主服務器只能過濾到庫級別)

slave:

replicate_do_db=                       #僅複製哪些數據庫

replicate_ignore_db=                   #忽略哪些數據庫


replicate_do_table= db_name.table_name #僅複製哪些表,要指定數據庫名

replicate_ignore_table=                #忽略哪些表


replicate_wild_do_table=               #支持使用通配符複製哪些表

replicate_wild_ignore_table=

如果期望在哪個服務器上做過濾,只要把這些參數寫入主配置文件的[mysqld]段中即可。

主從複製之六(多主模型)

1)編輯主服務器的配置文件

server-id       = 1

relay_log   =  /mydata/relaylogs/relay-bin

log-bin=/mydata/binlogs/master-bin

auto_increment_increment = 2

auto_increment_offset = 1

skip_slave_start

2)新建中繼日誌存放目錄並修改權限

[root@www ~]# mkdir /mydata/relaylogs

[root@www ~]# chown -R mysql.mysql /mydata/relaylogs/

3)編輯從服務器的配置文件

log-bin= /mydata/binlogs/master-log

binlog_format=mixed

server-id       = 11

relay-log       = /mydata/relaylogs/resay-bin

auto_increment_increment = 2

auto_increment_offset = 2

skip_slave_start

4)新建二進制日誌存放目錄並修改權限

[root@www etc]# mkdir /mydata/binlogs

[root@www etc]# chown -R mysql.mysql /mydata/binlogs

注:這裏都是接着上面的試驗而來的,如裏你只是配置這一個功能,那麼二制日誌和中繼日誌要定義好)

5)先查看一下當前所處日誌文件的位置:

主服務器:

MariaDB [(none)]> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000003 |      327 |              |                  |

+-------------------+----------+--------------+------------------+

6)服務器上建立一個具有複製權限的用戶

MariaDB [(none)]> grant replication slave, replication client on *.* to 'myuser'@'172.16.%.%' identified by 'mypass';

MariaDB [(none)]> flush privileges;

7)從服務器上配置:

MariaDB [(none)]> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-log.000002 |      529 |              |                  |

+-------------------+----------+--------------+------------------+

8)服務器上建立一個具有複製權限的用戶

MariaDB [(none)]> grant replication slave, replication client on *.* to 'myuser'@'172.16.%.%' identified by 'mypass';

MariaDB [(none)]> flush privileges;

9)把服務器各自指向對方

主:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.24.99',MASTER_USER='myuser',MASTER_PASSWORD='mypass',MASTER_LOG_FILE='master-log.000002',MASTER_LOG_POS=529;

從:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.24.88',MASTER_USER='myuser',MASTER_PASSWORD='mypass',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=327;

Query OK, 0 rows affected (0.06 sec)


10)各自啓動並查看狀態

MariaDB [(none)]> start slave;


MariaDB [(none)]> show slave status\G

*************************** 1. row ***************************

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 172.16.24.99

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: master-log.000002

         Read_Master_Log_Pos: 529

              Relay_Log_File: relay-bin.000002

               Relay_Log_Pos: 536

       Relay_Master_Log_File: master-log.000002

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

             Replicate_Do_DB:




MariaDB [(none)]> start slave;

Query OK, 0 rows affected (0.05 sec)


MariaDB [(none)]> show slave status\G

*************************** 1. row ***************************

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 172.16.24.88

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: master-bin.000003

         Read_Master_Log_Pos: 661

              Relay_Log_File: resay-bin.000002

               Relay_Log_Pos: 870

       Relay_Master_Log_File: master-bin.000003

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

後面還有兩種複製的方法,待下一章介紹。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章