本文檔將要介紹的內容:
1、mysql的主從複製的配置
2、配置半同步
3、基於SSL的複製
4、複製過濾
5、主主模型
一、系統環境
master: 192.168.56.101
slave: 192.168.56.102
基於MySQL-5.5.24
實現主服務器和從服務器之間的數據複製,關於mysql的安裝這裏不在重複敘述,如有需要可參考其他文檔,這裏假設兩個節點的服務器已經安裝完成並能夠正常啓動。
二、配置的mysql主從複製
1、配置主服務器
1.1、編輯MySQL主配置文件
[root@master ~]# vim /etc/my.cnf //編輯配置文件確保有以下兩行
log-bin=mysql-bin //定義開啓二進制日誌
server-id = 1 //定義server-id,主從服務器的id不能一樣
1.2、建立具有複製權限的用戶
[root@master ~]# /usr/local/mysql/bin/mysql -uroot -p
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO cpmysql@'192.168.56.102' IDENTIFIED BY 'cpmysql'; //創建cpmysql用戶並設置密碼爲cpmysql
mysql> FLUSH PRIVILEGES; //刷新授權表
查看當前使用的二進制文件和Posotions數值,後邊在從服務器上要設置這兩個值
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 358 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.05 sec)
2、配置從服務器
2.1、編輯MySQL主配置文件
[root@slave ~]# vim /etc/my.cnf
#log-bin=mysql-bin //可選,關閉二進制日誌文件
server-id = 11 //定義server-id不能和主服務器相同
relay-log=mysql-relay //開啓中繼日誌且名稱爲mysql-relay
[root@slave ~]# service mysqld restart //重新啓動mysql以使新配置生效
[root@slave ~]# /usr/local/mysql/bin/mysql -u root -p //以root用戶登錄mysql
確認relay_log已開啓:
mysql> SHOW GLOBAL VARIABLES LIKE 'relay_log';
+---------------+-------------+
| Variable_name | Value |
+---------------+-------------+
| relay_log | mysql-relay |
+---------------+-------------+
1 row in set (0.00 sec)
確認server_id配置生效其直不能與主服務器相同
mysql> SHOW GLOBAL VARIABLES LIKE 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 11 |
+---------------+-------+
1 row in set (0.00 sec)
2.2、配置主服務器相關參數
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.101',MASTER_USER='cpmysql',MASTER_PASSWORD='cpmysql',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=358;
說明:MASTER_LOG_FILE和MASTER_LOG_POS參數的值要和上邊在主服務器上查詢到的值一致。
啓動從服務器進程
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
查詢從服務器狀態,能看到Slave_IO_Running和Slave_SQL_Running兩個進程運行狀態爲Yes
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.101
Master_User: cpmysql
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 358
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
...
如果出現其他異常情況造成不能啓動,可查看mysql的錯誤日誌,裏邊有詳細的錯誤信息,例如這裏爲/mysqldata/slave.err
3、測試主從複製配置是否成功
在主服務器上創建一個數據庫testdb
[root@master ~]# /usr/local/mysql/bin/mysql -u root -p
mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.01 sec)
在從服務器上查看是否已經成功複製過來
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.05 sec)
可以看到已經成功複製。
4、一些建議配置
4.1、在主服務器上開啓隨時同步二進制日誌至文件中,默認主服務器生成的二進制日誌先放在緩存中,而從服務器需要靠主服務器上生成的二進制文件來保持和主服務器的一致,所以應該讓主服務器產生二進制文件後立即同步至二進制日誌文件中。
修改MySQL的主配置文件my.cnf添加如下行:
[root@master ~]# vim /etc/my.cnf
sync_binlog=1
[root@master ~]# service mysqld restart //重啓mysql服務使配置生效
在主服務器上查詢參數是否生效
mysql> SHOW GLOBAL VARIABLES LIKE 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (0.00 sec)
4.2、適用於innodb引擎,使沒一次產生的事務日誌同步到磁盤之後才返回成功,這樣可以有助於保證事務日誌的安全性,避免因爲特殊原因造成事務日誌的丟失,但這樣也會降低在執行大量需要記錄事務日誌操作時的執行速度。
修改Mysql的主配置文件my.cnf添加如下行:
[root@master ~]# vim /etc/my.cnf
innodb_flush_logs_at_trx_commit=1
4.3、設置從服務器爲只讀,避免誤操作造成主從服務器的數據不一致
[root@slave ~]# vim /etc/my.cnf
read_only=1
5、如果主服務器運行了一段時間,從服務器爲新增的服務器時就不能根據以上方法來配置了,需要現在主服務器上備份:
先在主服務器上給mysql施加讀鎖
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
通過邏輯卷創建快照備份mysql,這裏假設mysql的數據目錄的掛載的設備爲/dev/mysqlvg/mysqllv
[root@master ~]# lvcreate -L 50M -s -p r -n mysql-snap /dev/mysqlvg/mysqllv
在邏輯捲上創建好快照之後查看當前mysqld的二進制文件及Position的數值,完成後立即釋放之前施加的讀鎖
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 478 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
釋放讀鎖:
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
掛載剛創建的邏輯卷快照並備份至從服務器
[root@master ~]# mount /dev/mysqlvg/mysql-snap /mnt
[root@master ~]# tar cf allmysql.tar /mnt/ //如果數據文件過大就壓縮
拷貝該歸檔文件至從服務器,把內容覆蓋至從服務器mysql的數據目錄,並移除邏輯卷快照
[root@master ~]# umount /mnt
[root@master ~]# lvremove /dev/mysqlvg/mysql-snap
其他步驟與上邊的從服務器配置相同,參考-->2.2、配置主服務器相關參數,注意替換:MASTER_LOG_FILE和MASTER_LOG_POS參數的值爲釋放讀鎖時查看到的信息。
至此就可以實現主從複製了。
三、配置半同步複製
1、在主服務器端配置步驟
安裝插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.08 sec)
開啓插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.04 sec)
設置超時時間爲1000ms
mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000;
Query OK, 0 rows affected (0.00 sec)
驗證是否開啓成功
mysql> SHOW GLOBAL STATUS LIKE 'rpl%status';
+-----------------------------+-------------+
| Variable_name | Value |
+-----------------------------+-------------+
| Rpl_semi_sync_master_status | ON |
| Rpl_status | AUTH_MASTER |
+-----------------------------+-------------+
2 rows in set (0.00 sec)
如果想要永久生效需要在主配置文件my.cnf中添加如下行:
[mysqld] //在該選項中添加如下兩行
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
2、在從服務器端配置步驟
安裝插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.11 sec)
啓用插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.04 sec)
停止從服務進程
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
啓動從服務進程
mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)
驗證是否開啓,如果狀態爲ON即成功開啓
mysql> SHOW GLOBAL STATUS LIKE 'rpl%';
+----------------------------+-------------+
| Variable_name | Value |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | ON |
| Rpl_status | AUTH_MASTER |
+----------------------------+-------------+
2 rows in set (0.02 sec)
如果想要永久生效需在從服務器主配置文件my.cnf中添加如下行
[mysqld] //在該選項中添加如下行
rpl_semi_sync_slave_enabled=1
四、複製過濾
設置複製過濾可以讓從服務器只複製主服務器上的某個數據庫或者某個數據庫中的某個表等極大的提高了複製的靈活性,複製過濾可以在主服務器上設置,也可以在從服務器上設置,但是不推薦在主服務器上設置,因爲這樣設置後造成任何與該設置了複製的數據庫無關的寫操作都不會被記錄到二進制文件中,會對主服務器上其他數據庫安全性造成極大影響,但是這樣設置也減少了主從複製的內容大小,所以要根據具體的環境來考慮用何種設置。
在主服務器上設置:
在主配置文件my.cnf配置文件中添加如下行,根據需要選擇:
[mysqld] //在該選項中添加
binlog-do-db=testdb //設置二進制日誌文件只記錄與testdb相關,如果需要複製多個可以繼續添加如下:
binlog-do-db=test2db //添加test2db數據庫
或者
binlog-ignore-db=testdb //設置除了testdb之外的所有,與do-db相反
在從服務器上設置:
修改從服務器的主配置文件my.conf中添加如下內容,根據需要選擇:
[mysqld] //在該選項中添加
replicate-do-db=testdb //只複製testdb數據庫
replicate_ignore_db=test2db //只忽略test2db數據庫
replicate_do_table=testdb.tb1 //只複製testdb數據庫中的tb1表
replicate_ignore_table=testdb.tb1 //只忽略testdb數據庫中的tb1表
replicate_wild_do_table=testdb.tb% //只複製testdb數據庫中tb開頭的表
replicate_wild_ignore_table=testdb.tb% //只忽略testdb數據庫中tb開頭的表
五、開啓SSL複製
1、創建CA及自簽證書,主從服務器的創建私鑰申請證書和CA頒發證書的具體過程之前的文檔已經有詳細說明這裏不再給出,詳情請看《創建CA頒發證書》
這裏假設CA的證書存放目錄爲:/usr/local/mysql/ssl/cacert.pem
主服務器相關證書和密鑰:/usr/local/mysql/ssl/master.crt
/usr/local/mysql/ssl/master.key
從服務器相關證書和密鑰:/usr/local/mysql/ssl/slave.crt
/usr/local/mysql/ssl/slave.key
2、編輯主服務器配置文件my.cnf添加下行:
[mysqld]
ssl
ssl-ca=/usr/local/mysql/ssl/cacert.pem
ssl-cert=/usr/local/mysql/ssl/master.crt
ssl-key=/usr/local/mysql/ssl/master.key
[root@master ssl]# service mysqld restart //重啓服務至配置生效
驗證配置是否生效:
mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value |
+---------------+---------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /usr/local/mysql/ssl/cacert.pem |
| ssl_capath | |
| ssl_cert | /usr/local/mysql/ssl/master.crt |
| ssl_cipher | |
| ssl_key | /usr/local/mysql/ssl/master.key |
+---------------+---------------------------------+
7 rows in set (0.00 sec)
可以看到have_ssl和have_openssl的狀態由原來的DISABLE轉化爲YES
3、從服務器配置
從服務器不建議在配置文件中配置
停止從服務進程
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)
配置ssl相關參數
mysql> CHANGE MASTER TO MASTER_SSL=1,MASTER_SSL_CA='/usr/local/mysql/ssl/cacert.pem',MASTER_SSL_CERT='/usr/local/mysql/ssl/slave.crt',MASTER_SSL_KEY='/usr/local/mysql/ssl/slave.key';
Query OK, 0 rows affected (0.01 sec)
啓動從服務進程
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
驗證配置是否生效
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.101
Master_User: cpmysql
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay.000005
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000014
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 551
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt
Master_SSL_Cipher:
Master_SSL_Key: /usr/local/mysql/ssl/slave.key
...
確保:Slave_IO_Running、Slave_SQL_Running和Master_SSL_Allowed三個的值爲Yes
4、驗證ssl
在從服務器上使用之前創建的複製用戶cpmysql測試能否通過ssl登錄主服務器
[root@slave ~]# /usr/local/mysql/bin/mysql --ssl-ca=/usr/local/mysql/ssl/cacert.pem --ssl-cert=/usr/local/mysql/ssl/slave.crt --ssl-key=/usr/local/mysql/ssl/slave.key -u cpmysql --host 192.168.56.101 -p
mysql> \s;
--------------
/usr/local/mysql/bin/mysql Ver 14.14 Distrib 5.5.24, for linux2.6 (i686) using readline 5.1
Connection id: 10
Current database:
Current user: [email protected]
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.24-log MySQL Community Server (GPL)
Protocol version: 10
Connection: 192.168.56.101 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
...
可以看到已經使用了SSL加密。
5、修改cpmysql用戶使之強制必須使用ssl連接
在主服務器執行,添加REQUIRE SSL選項:
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO cpmysql@'192.168.56.102' IDENTIFIED BY 'cpmysql' REQUIRE SSL;
Query OK, 0 rows affected (0.03 sec)
刷新授權表
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
在從服務器上登錄測試:
[root@slave ~]# /usr/local/mysql/bin/mysql -u cpmysql -p --host 192.168.56.101
Enter password:
ERROR 1045 (28000): Access denied for user 'cpmysql'@'192.168.56.102' (using password: YES)
從上邊提示可以看到不指定ssl信息時連接被拒絕
使用ssl登錄
[root@slave ~]# /usr/local/mysql/bin/mysql --ssl-ca=/usr/local/mysql/ssl/cacert.pem --ssl-cert=/usr/local/mysql/ssl/slave.crt --ssl-key=/usr/local/mysql/ssl/slave.key -u cpmysql -p -h 192.168.56.101
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.5.24-log MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
登錄成功!
六、主主模型的配置
主主模型既是互爲主從關係,因此雙方都需要在各自的服務器上開啓二進制日誌和中繼日誌,且都需要創建能夠用來讓對方複製數據的用戶,由於主主模型本身存在很多問題且並不常用,配置也很簡單這裏只大概說明下配置過程:
1、修改了兩個節點的主配置文件都要開啓二進制日誌和中繼日誌,設置不同的server-id,然後重啓服務使生效;
2、分別在兩個節點上創建用於複製數據的mysql用戶,能夠讓該用戶登錄對方;
3、查看各自當前使用的二進制文件和Position值;
4、配置參數指定對方爲自己的主服務器,並啓動從服務進程即可,操作過程請看前邊主從複製時的說明。
說明:主主模型不推薦使用。