主從複製的前提:
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
後面還有兩種複製的方法,待下一章介紹。