文章介紹的是通過在RedHat6.4的64位系統平臺mysql5.6的主從複製、基於GTID複製、半同步、ssl加密以及讀寫分離這些配置應用在生產環境中是實用的,拿來和大家分享一下
Mysql5.6主從複製介紹
Slave服務器通過IO線程連接Master,並請求從指定指定的日誌開始複製,Master返回其Binary Log 文件的名稱以及在 BinaryLog 中的位置及內容信息,Slave端將複製過來的日誌信息保存到自己的中繼日誌中,然後在把中繼日誌中的事件信息一條一條的在本地執行一次,完成數據在本地的存儲
主從複製簡構圖
Mysql5.6半同步複製介紹
在一主多從模式下,Master與Slave端之間只完成一個Slave的同步複製(與主從複製機制一致);即提交事務的線程會被鎖定,直到至少一個Slave收到這個事務,事務的事件在被提交到存儲引擎之後才被髮送到Slave上
Mysql5.6一主多從模式下半同步簡構圖
原理部分這裏就以分批次的進行介紹了,下面我們就先一起來看一看Mysql複製的實現過程
Mysql5.6主從複製
Master服務器準備
創建mysql用戶
# groupadd -g 3306 mysql
# useradd -g 3306 -u 3306 mysql
創建數據目錄
# mkdir /mydata/data -pv
# cd /mydata/
# chown mysql.mysql data –R
配置Mysql5.6
# tar xf mysql-5.6.10-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv mysql-5.6.10-linux-glibc2.5-x86_64mysql
# chown .mysql * -R
初始化mysql
# scripts/mysql_install_db --user=mysql--datadir=/mydata/data
準備服務腳本
# cp support-files/mysql.server/etc/init.d/mysqld
# chkconfig --add mysqld
初始化後會自動在當前目錄下創建一個my.cnf配置文件,直接修改就可以
修改配置文件
#vim my.cnf
添加內容是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
binlog-format=ROW log-bin=master-bin.log log-slave-updates= true gtid-mode=on enforce-gtid-consistency= true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info= 1 slave-parallel-workers= 2 binlog-checksum=CRC32 master-verify-checksum= 1 slave-sql-verify-checksum= 1 binlog-rows-query-log_events= 1 server-id= 1 report-port= 3306 port= 3306 datadir=/mydata/data socket=/tmp/mysql.sock report-host=master.magedu.com |
添加環境變量
# vim /etc/profile.d/mysql.sh
內容是
export PATH=$PATH:/usr/local/mysql/bin
# . /etc/profile.d/mysql.sh
啓動mysql
# mysql
在從服務器上進行mysql的安裝與主服務器相同,這裏就不再過多的敘述了
其中從服務器的my.cnf配置文件添加內容爲
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
binlog-format=ROW log-slave-updates= true gtid-mode=on enforce-gtid-consistency= true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info= 1 slave-parallel-workers= 2 binlog-checksum=CRC32 master-verify-checksum= 1 slave-sql-verify-checksum= 1 binlog-rows-query-log_events= 1 server-id= 11 report-port= 3306 port= 3306 log-bin=mysql-bin.log datadir=/mydata/data socket=/tmp/mysql.sock report-host=slave.magedu.com |
在主服務器上授權具有複製權限的用戶
mysql> GRANT REPLICATION SLAVE ON *.* [email protected] IDENTIFIED BY 'test';
mysql> FLUSH PRIVILEGES;
查看主服務器狀態信息
在從服務器上連接到主服務器
mysql> CHANGE MASTER TOMASTER_HOST='172.16.51.20',
-> MASTER_USER='test',
-> MASTER_PASSWORD='test',
-> MASTER_LOG_FILE='master-bin.000001',
->MASTER_LOG_POS=919;
查看連接後從服務器狀態
啓動從服務器服務
mysql> start slave;
狀態信息查看
在主服務器上創建相關數據進行測試
在從服務器上查看
mysql> SHOW SLAVE STATUS\G
查看從服務器上所有數據庫
以上內容介紹的是mysql5.6不基於GTID完成的複製,下面我們來一起看一看基於GTID完成的mysql複製
這次實驗是在上述實驗完成之後做,這裏已經把之前所有的相關信息都已經刪除,重新進行的初始化才進行下面的實驗
基於GTID完成的mysql複製介紹
mysql5.6基於GTID完成複製簡構圖
GTID是什麼
由服務器的UUID(全局唯一標識,128位隨機字符串,並結合事務的ID號組合成一個唯一的標識某一個主機上某一個事務的表示碼mysql5.6的二進制日誌中binlog在每個事務語句記錄是在事務的首部都會記錄相關聯的GTID;優點是GTID追蹤,比較複製事務更加簡單,並且能夠實現從崩潰中快速進行恢復
工作機制
A爲主BC爲從時,BC複製速度會不同,則在A故障的那一刻,BC上的數據也會有不同,此時B若爲一個新的MASTER通過GTID的方式實現的話就是在C上有的但B上沒有的都先要複製到B上,然後把B提升爲主的,然後再把C成爲B的從,GTID功能會把記錄在二進制中每個事務中首部都記錄一個GTID號;此時B可向C發出通告告知C已經完成了哪些事務,有了GTID後,每個事務中都有其相關事務的信息;實現了服務器兩端自動的發現各自在對方上缺少什麼不需要再進行手動指定的位置、指定文件進行復制
相關命令介紹
mysqlreplicate:複製相關工具能夠快速啓動從服務器,幫助從服務器檢查本地所有已經在本地執行過的事務,通過追蹤GTID判斷,跳過這些執行過的事務,快速從未執行過的事務開始
mysqlrplcheck:兼具複製與檢查的功能,用於實現簡單的驗證部署,並實現快速故障解決(快速故障修復的相關功能)檢查binlog是否被啓用了並顯示相關的配置信息
mysqlrplshow:發現並顯示覆制拓撲圖(以樹狀圖的形式顯示是否是多級複製,已經主從服務器的個數等相關信息)
msyqlfailover:故障轉移工具(快速的通過手動或者自動將一個slave轉換成master)獲取另一個slave中本身不具有的事務
msyqlrpladmin:調度管理工具(手動的讓一個slave上線,下線)
在主服務器上的my.cnf配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
binlog-format=ROW log-bin=master-bin.log log-slave-updates= true gtid-mode=on enforce-gtid-consistency= true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info= 1 slave-parallel-workers= 2 binlog-checksum=CRC32 master-verify-checksum= 1 slave-sql-verify-checksum= 1 binlog-rows-query-log_events= 1 server-id= 1 report-port= 3306 port= 3306 datadir=/mydata/data socket=/tmp/mysql.sock report-host=master.magedu.com |
從服務器上my.cnf配置文件添加的內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
binlog-format=ROW log-slave-updates= true gtid-mode=on enforce-gtid-consistency= true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info= 1 slave-parallel-workers= 2 binlog-checksum=CRC32 master-verify-checksum= 1 slave-sql-verify-checksum= 1 binlog-rows-query-log_events= 1 server-id= 11 report-port= 3306 port= 3306 log-bin=master-bin datadir=/mydata/data socket=/tmp/mysql.sock report-host=slave.magedu.com |
啓動mysql服務器,在主從服務器查看是否啓動gtid功能
將172.16.51.20(master.magedu.com)定義爲主服務器
創建賬戶
mysql> GRANT REPLICATION SLAVE ON *.* TO[email protected] IDENTIFIED BY 'test';
mysql> FLUSH PRIVILEGES;
讓172.16.51.21(slave.magedu.com)定義爲從連接到主服務器上
mysql> CHANGE MASTER TOMASTER_HOST='172.16.51.20',MASTER_USER='test',MASTER_PASSWORD='test',MASTER_AUTO_POSITION=1;
啓動slave
mysql> START SLAVE;
查看slave狀態信息
mysql> show slave status\G;
在主服務器上創建一個數據庫進行測試
mysql> CREATE DATABASE magedudb1;
在從服務器上驗證
查看數據庫
查看Slave主機
ssl加密複製實現
ssl加密複製是生產環境中對數據安全性的一個保障,配置過程也比較簡單,之前在前面的文章中都有對ssl加密實現有詳細介紹這裏就不再過多贅述了
準備私有CA
# mkdir ca
# cd ca
# (umask 077;openssl genrsa 2048 >ca-key.pem)
# openssl req -new -x509 -nodes -days 3665-key ca-key.pem -out ca-cert.pem
爲master服務器生成證書
# openssl req -newkey rsa:2048 -days 3665-nodes -keyout master-key.pem -out master-req.pem
# openssl rsa -in master-key.pem -out master-key.pem
# openssl x509 -req -in master-req.pem-days 3665 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -outmaster-cert.pem
更改屬主屬組
# chown mysql.mysql -R *
# chmod 600 *
爲從服務器生成證書
# openssl req -newkey rsa:2048 -days 3665-nodes -keyout slave-key.pem -out slave-req.pem
# openssl x509 -req -in slave-req.pem -days3665 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out slave-cert.pem
將CA證書、簽署的slave端證書、master證書及私鑰傳送到slave服務器上
# scp ca-cert.pem slave-key.pemslave-cert.pem master-cert.pem master-key.pem 172.16.51.21:/ssl/
更改證書屬主屬組
# cd /ssl
# chown mysql.mysql -R *
# chmod 600 *
編輯master服務器my.cnf配置文件
# vim /usr/local/mysql/my.cnf ---添加內容如下
ssl
ssl-ca = /ca/ca-cert.pem
ssl-cert = /ca/master-cert.pem
ssl-key = /ca/master-key.pem
編輯slave服務器my.cnf配置文件
# vim /usr/local/mysql/my.cnf ---添加內容如下
ssl
ssl-ca = /ssl/ca-cert.pem
ssl-cert = /ssl/slave-cert.pem
ssl-key = /ssl/slave-key.pem
重啓mysql服務器查看ssl功能是否啓用
在master服務器查看SSl功能開啓狀態
mysql> show variables like '%ssl%';
在slave服務器查看SSl功能開啓狀態
mysql> show variables like '%ssl%';
SSL加密複製驗證實現
Master服務器授權
mysql> GRANT FILE,SELECT,REPLICATION SLAVEON*.* TO 'test11'@'%' IDENTIFIED BY 'test11' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;
Slave服務器連接
# mysql -utest11 -ptest11 -h172.16.51.20--ssl-cert=/ssl/master-cert.pem --ssl-key=/ssl/master-key.pem
查看狀態信息
mysql> status;
ssl加密複製相關配置就完成了,具體的實現與GTID主從複製驗證相同
Mysql5.6半同步配置
在主服務器上安裝插件
mysql> INSTALL PLUGINrpl_semi_sync_master SONAME 'semisync_master.so';
修改my.cnf配置文件—添加一下選項
rpl_semi_sync_master_enabled=ON
在從服務器上安裝的插件
slave> INSTALL PLUGINrpl_semi_sync_slave SONAME 'semisync_slave.so';
修改從服務器配置文件添加一下選項
rpl_semi_sync_slave_enabled=ON
重新啓動mysql服務器
驗證半同步功能是否開啓
mysql> CREATE DATABASE magedudb3;
mysql> SHOW GLOBAL STATUS LIKE 'rpl%';
Mysql-5.6讀寫分離實現
讀寫分離實現基本機制
基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫複製被用來把事務性查詢導致的變更同步到集羣中的從數據庫;主服務器對向從服務器請求的請求產生的I/o會很多。可以實現多級複製;實現機制是在主服務器爲從服務器產生一個進程,有一個單獨的服務器器爲從服務器提供讀進程即是多級複製模式;單獨提供查詢進程服務器採用black hole存儲引擎
Mysql-5.6實現讀寫分離簡構圖
Mysql-proxy配置選項介紹
--proxy-address=host:port ————代理服務監聽的地址和端口;
--admin-address=host:port ————管理模塊監聽的地址和端口;
--proxy-backend-addresses=host:port ————後端mysql服務器的地址和端口;
--proxy-read-only-backend-addresses=host:port ————後端只讀mysql服務器的地址和端口;
--proxy-lua-script=file_name ————完成mysql代理功能的Lua腳本;
--daemon ————以守護進程模式啓動mysql-proxy;
--keepalive ————在mysql-proxy崩潰時嘗試重啓之;
--log-file=/path/to/log_file_name ————日誌文件名稱;
--log-level=level ————日誌級別;
--log-use-syslog ————基於syslog記錄日誌;
--plugins=plugin,.. ————在mysql-proxy啓動時加載的插件;
--user=user_name ————運行mysql-proxy進程的用戶;
--defaults-file=/path/to/conf_file_name ————默認使用的配置文件路徑;其配置段使用[mysql-proxy]標識;
--proxy-skip-profiling ————禁用profile;
--pid-file=/path/to/pid_file_name ————進程文件名;
安裝mysql-proxy
# useradd -r mysql-proxy
# tar xf mysql-proxy-0.8.3-linux-glibc2.3-x86-32bit.tar.gz-C /usr/local/
# cd /usr/local/
# ln -sv mysql-proxy-0.8.3-linux-glibc2.3-x86-32bitmysql-proxy
添加環境變量
# vim /etc/profile.d/mysql-proxy.sh
添加內容爲
exportPATH=$PATH:/usr/local/mysql-proxy/bin
# . /etc/profile.d/mysql-proxy.sh
爲mysql-proxy提供SysV服務腳本以及配置文件mysql-proxy由於腳本配置文件過長所以就上傳到附件了
添加執行權限,加進服務控制列表
# cd /etc/init.d/
# chmod +x mysql-proxy
# chkconfig --add mysql-proxy
# chkconfig --level 2345 mysql-proxy on
相關配置文件已經準備完成,現在就可啓動mysql-proxy,然後使用另一客戶端(這裏的客戶端IP爲172.16.51.77)進行連接測試
# mysql -uadmin -padmin -h172.16.51.23--port=4041
mysql> select * from backends;
讀寫分離測試
在負責讀寫的服務器上進行遠程用戶授權
mysql> GRANT ALL ON *.* TO 'root'@'%'IDENTIFIED BY 'redhat';
mysql> flush privileges;
在客戶端172.16.51.77進行一次寫操作
# mysql -uroot -predhat -h172.16.51.23 -e'create database chuangjian;'
# mysql -uadmin -padmin -h172.16.51.23--port=4041
在客戶端172.16.51.77進行一次讀操作
# mysql -uroot -predhat -h172.16.51.23 -e'select user,password from mysql.user;'
172.16.51.20服務器支持讀寫,所以在第一次進行查詢時172.16.51.21服務器可能響應不到,所以就再一次的進行了查詢測試(有不周的地方還望見諒哦)