MySQL 5.7發佈後,在複製方面有了很大的改進和提高。好比開始支持多源複製(multi-source)以及真正的支持多線程複製了。多源複製可使用基於二進制日子的複製或者基於事務的複製。下面咱們說一說如何配置基於二進制日誌的多源複製。html
首先,咱們要清楚幾種常見的複製模式:node
一主一從mysql
一主多從linux
級聯複製sql
multi-master數據庫
MySQL 5.7 以前只能支持一主一從,一主多從或者多主多從的複製。若是想實現多主一從的複製 只能使用mariadb,可是mariadb又與官方的mysql版本不兼容。緩存
MySQL 5.7 開始支持了多主一從的複製方式也就是多源複製。MySQL 5.7 版本相比以前的版本,不管是功能仍是性能仍是安全等方面都已經有了很多的提高。安全
首先咱們要清楚multi-master OR multi-source 複製不是同樣的。multi-master複製一般是環形的複製,能夠在任意的主機上將數據複製給其餘的主機。如圖:bash
multi-source 是不一樣的。簡單的說,多源複製就是將多個主庫同步到一個從庫,從而增長從的利用率,節省了機器。如圖:服務器
數據分析部門會須要各個業務部門的部分數據作數據分析,這個時候就可使用到多源複製把各個主數據庫的數據複製到統一的數據庫中
在從服務器進行數據的彙總,若是咱們的主服務器進行了分庫分表的操做,爲了實現後期的一些數據的統計功能,每每要把數據彙總在一塊兒在進行統計
在從服務器對全部主服務器的數據進行備份,在MySQL 5.7以前每一個主服務器都須要一臺從服務器,這樣很容易形成資源的浪費,同時也加大了DBA的維護成本,但MySQL 5.7引入的多源複製,能夠把多個主服務器的數據同步到一臺從服務器進行備份。
不論是使用基於二進制日誌的複製或者基於事務的複製,要開啓多源複製功能必需要在從庫上設置master-info-repository AND relay-log-info-repository 這兩個參數。
這兩個參數是用來存儲同步信息的,能夠設置的值爲FILE和TABLE,默認是FILE。好比master-info就保存在master.info文件中,relay-log-info保存在relay-log.inf文件中服務器若是意外關閉,正確的relay-log-info沒有來的及更新帶relay-log.info文件,這樣就會形成數據的丟失。
爲了數據更加安全,一般設置爲TABLE。這些表都是innodb類型的,支持事務。相對文件存儲安全得多。在MySQL庫下能夠看到這兩個表的信息,分別是mysql.slave_master_info AND mysql.slave_relay_log_info 。
這兩個參數也是能夠動態調整的。
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
若是要啓用enhanced multi-threaded slave(多線程複製),能夠設置一下參數
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
relay_log_recovery=ON
若是SLAVE已經爲開啓狀態,那麼須要首先關閉SLAVE(stop slave;)
hostname |
IP |
mysql |
dev-master-01 |
192.168.1.131 |
master |
dev_node-01 |
192.168.1.132 |
master |
dev-node-02 |
192.168.1.133 |
slave |
可參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
MySQL 5.7軟件包下載地址:https://dev.mysql.com/downloads/repo/yum/
下載yum源rpm安裝包:wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
安裝yum源:yum localinstall mysql57-community-release-el7-11.noarch.rpm
檢查mysql源是否安裝成功:yum repolist enable | grep "mysql.*-community.*"
安裝MySqL:yum install mysql-community-server
啓動MySQL服務:systemctl start mysqld
查看MySQL的啓動狀態:systemctl status mysqld
設置開機自啓:systemctl enable mysqld ----> systemctl daemon-reload
修改root默認密碼(這裏出現了一些小問題)下面作問題的闡述
在修改密碼的過程當中出現了和官網上說法不一致的問題
mysql安裝完成後,在/var/log/mysqld.log文件中給root生成一個默認的密碼,經過下面的方式能夠找到root的默認密碼,而後登陸mysql進行修改:
找密碼:grep 'temporary password' /var/log/mysqld.log
登陸mysql:mysql -uroot -p
修改密碼:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'
注意:MySQL的 validate_password 插件默認安裝。這將要求密碼至少包含一個大寫字母,一個小寫字母,一位數字和一個特殊字符,而且總密碼長度至少爲8個字符。
使用官方提供的找密碼的命令根本就在mysqld.log文件中找不到默認的密碼,只能想辦法本身解決mysql的密碼的問題了 嘗試了一些mysql5.7以前的版本的修改密碼的方法可是仍是不可行,可是最後仍是想到了一種至關簡單的方法:
修改/etc/my.cnf 在[mysqld]下面添加 skip-grant-tables=1 這一行配置 讓mysql啓動的時候不對密碼進行驗證
重啓mysqld服務:systemctl restart mysqld
使用root用戶登陸到mysql:mysql -uroot
切換到mysql數據庫:use mysql;
更新user表:UPDATE user SET authentication_string = PASSWORD('sycx_2009abc') WHERE user = 'root';
使修改後生效:FLUSH PRIVILEGES;
退出mysql,編輯/etc/my.cnf文件 註釋掉skip-grant-tables=1
重啓mysqld服務,再用新密碼登陸便可
上面咱們已經把MySQL 5.7版本的mysql安裝成功了 如今咱們只要修改my.cnf配置文件重啓mysql驗證多源複製便可。步驟以下:
修改192.168.1.131和192.168.1.132下面的/etc/my.cnf文件,修改以下:記得修改配置參數中的server-id(192.168.1.131爲1,那麼192。168.1.132就得是2,每臺服務器中的這個id不能同樣,切記!!!)
[mysqld] # 指定端口 不指定默認3306 #port=5603 # mysql數據存放路徑 datadir=/var/lib/mysql # mysql socker文件存放路徑 socket=/var/lib/mysql/mysql.sock # 建立符號連接(建議禁用符號連接,以防止各類安全風險。開啓將參數的值設置爲1) symbolic-links=0 # 錯誤日誌存放路徑 log-error=/var/log/mysqld.log # 啓動pid文件存放路徑 pid-file=/var/run/mysqld/mysqld.pid # 設置主從的時候的惟一ID 每臺主機的ID不可重複 server-id=1 # #打開日誌(主機須要打開),這個mysql-bin也能夠自定義,這裏也能夠加上路徑,如:/home/www/mysql_bin_log/mysql-bin log-bin=mysql-bin # 設定mysql的複製模式(STATEMENT ROW MIXED) binlog_format=mixed # 繞過密碼驗證可直接使用root登陸(用於修改密碼) #skip-grant-tables=1 # 啓動服務器來禁用主機名緩存 skip-host-cache # 若是這個參數設爲OFF,則MySQL服務在檢查客戶端鏈接的時候會解析主機名;若是這個參數設爲ON,則MySQL服務只會使用IP,在這種狀況下,受權表中的Host字段必須是IP地址或localhost。 skip-name-resolve # 網絡傳輸時單個數據包的大小 max_allowed_packet = 500M # 設置數據庫的時間 default-time-zone = '+8:00' # 內部內存臨時表的最大內存 tmp_table_size=200M # MySQL服務器用來做普通索引掃描、範圍索引掃描和不使用索引而執行全表掃描這些操做所用的緩存大小。 join_buffer_size = 32M # 每一個會話執行排序操做所分配的內存大小。 sort_buffer_size = 1M # 每一個客戶端線程和鏈接緩存和結果緩存交互,每一個緩存最初都被分配大小爲net_buffer_length的容量,並動態增加,直至達到max_allowed_packet參數的大小 net_buffer_length = 8K # 爲每一個線程對MyISAm表執行順序讀所分配的內存。若是數據庫有不少順序讀,能夠增長這個參數,默認值是131072字節。 read_buffer_size = 512K # 這個參數用在MyISAM表和任何存儲引擎表隨機讀所使用的內存。 read_rnd_buffer_size = 32M # 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操做中,MyISAM索引排序使用的緩存大小。 myisam_sort_buffer_size = 256M # 設置客戶端的併發鏈接數量 max_connections = 8000 # mysql關閉非交互鏈接前的等待時間,單位是秒 wait_timeout = 604800 # Mysql關閉交互鏈接前的等待時間,單位是秒 interactive_timeout = 604800 # 設定遠程用戶必須迴應PORT類型數據鏈接的最大時間 connect_timeout = 30 # 若是客戶端嘗試鏈接的錯誤數量超過這個參數設置的值,則服務器再也不接受新的客戶端鏈接。能夠經過清空主機的緩存來解除服務器的這種阻止新鏈接的狀態,經過FLUSH HOSTS或mysqladmin flush-hosts命令來清空緩存。 max_connect_errors = 30000 # mysql關閉鏈接前的等待時間,單位是秒 interactive_timeout = 86400 # 慢查詢的時間設置,單位爲秒 long_query_time = 20 # mysql服務緩存以重用的線程數 thread_cache_size = 120 # 爲查詢結果所分配的緩存 query_cache_size = 256M # 若是一個事務須要的內存超過這個參數,就會報錯 max_heap_table_size=2097152000
二、修改192.168.1.133也就是從庫的/etc/my.cnf 配置參數,配置以下:(記得修改server-id爲3,不能和其餘服務器id同樣,切記!!!)
[mysqld] # 指定端口 不指定默認3306 #port=5603 # mysql數據存放路徑 datadir=/var/lib/mysql # mysql socker文件存放路徑 socket=/var/lib/mysql/mysql.sock # 建立符號連接(建議禁用符號連接,以防止各類安全風險。開啓將參數的值設置爲1) symbolic-links=0 # 錯誤日誌存放路徑 log-error=/var/log/mysqld.log # 啓動pid文件存放路徑 pid-file=/var/run/mysqld/mysqld.pid # 設置主從的時候的惟一ID 每臺主機的ID不可重複 server-id=1 # #打開日誌(主機須要打開),這個mysql-bin也能夠自定義,這裏也能夠加上路徑,如:/home/www/mysql_bin_log/mysql-bin log-bin=mysql-bin # 設定mysql的複製模式(STATEMENT ROW MIXED) binlog_format=mixed # 繞過密碼驗證可直接使用root登陸(用於修改密碼) #skip-grant-tables=1 # 啓動服務器來禁用主機名緩存 skip-host-cache # 若是這個參數設爲OFF,則MySQL服務在檢查客戶端鏈接的時候會解析主機名;若是這個參數設爲ON,則MySQL服務只會使用IP,在這種狀況下,受權表中的Host字段必須是IP地址或localhost。 skip-name-resolve # 網絡傳輸時單個數據包的大小 max_allowed_packet = 500M # 設置數據庫的時間 default-time-zone = '+8:00' # 內部內存臨時表的最大內存 tmp_table_size=200M # MySQL服務器用來做普通索引掃描、範圍索引掃描和不使用索引而執行全表掃描這些操做所用的緩存大小。 join_buffer_size = 32M # 每一個會話執行排序操做所分配的內存大小。 sort_buffer_size = 1M # 每一個客戶端線程和鏈接緩存和結果緩存交互,每一個緩存最初都被分配大小爲net_buffer_length的容量,並動態增加,直至達到max_allowed_packet參數的大小 net_buffer_length = 8K # 爲每一個線程對MyISAm表執行順序讀所分配的內存。若是數據庫有不少順序讀,能夠增長這個參數,默認值是131072字節。 read_buffer_size = 512K # 這個參數用在MyISAM表和任何存儲引擎表隨機讀所使用的內存。 read_rnd_buffer_size = 32M # 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操做中,MyISAM索引排序使用的緩存大小。 myisam_sort_buffer_size = 256M # 設置客戶端的併發鏈接數量 max_connections = 8000 # mysql關閉非交互鏈接前的等待時間,單位是秒 wait_timeout = 604800 # Mysql關閉交互鏈接前的等待時間,單位是秒 interactive_timeout = 604800 # 設定遠程用戶必須迴應PORT類型數據鏈接的最大時間 connect_timeout = 30 # 若是客戶端嘗試鏈接的錯誤數量超過這個參數設置的值,則服務器再也不接受新的客戶端鏈接。能夠經過清空主機的緩存來解除服務器的這種阻止新鏈接的狀態,經過FLUSH HOSTS或mysqladmin flush-hosts命令來清空緩存。 max_connect_errors = 30000 # mysql關閉鏈接前的等待時間,單位是秒 interactive_timeout = 86400 # 慢查詢的時間設置,單位爲秒 long_query_time = 20 # mysql服務緩存以重用的線程數 thread_cache_size = 120 # 爲查詢結果所分配的緩存 query_cache_size = 256M # 若是一個事務須要的內存超過這個參數,就會報錯 max_heap_table_size=2097152000 # mysql5.7 多源複製從庫的配置參數 master-info-repository = table # 這個參數是必須的 relay-log-info-repository = table # 這個參數是必須的 report-port = 3306 report-host = 192.168.1.131 replicate-do-db = master1 replicate-do-db = master2 replicate_wild_do_table=master1.% replicate_wild_do_table=master2.%
三、從新啓動mysql服務:systemctl restart mysqld
四、升級mysql受權表:mysql_upgrade -uroot -p
五、登陸192.168.1.131和192.168.1.132的mysql:mysql -uroot -p
六、如下的執行都是在192.168.1.131和192.168.1.132的mysql中執行sql語句
建立mysql的主從受權用戶:grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '2017123';
刷新生效:FLUSH PRIVILEGES;
七、登陸192.168.1.133的mysql執行sql語句:
CHANGE MASTER TO MASTER_HOST='192.168.1.131', MASTER_USER='slave', MASTER_PORT=3306, MASTER_PASSWORD='2017123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1 FOR CHANNEL 'master1'; CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_USER='slave', MASTER_PORT=3306, MASTER_PASSWORD='2017123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1 FOR CHANNEL 'master2';
八、所有顯示sql語句執行ok,而後查看主從的狀態:
執行sql語句:show slave status\G;
若是要查看單一信道的複製的詳細狀態,可使用如下命令:
SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;
九、在主庫(192.168.1.131)實例建立一些數據。
create database master1; use master1; CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL); insert into test1 values(1,1);
十、在主庫(192.168.1.132)實例建立一些數據。
create database master2; use master2; CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL); insert into test2 values(1,1);
十一、在從庫(192.168.1.133)實例檢查數據是否成功複製。
select * from master1.test1; select * from master2.test2;
十二、列出全部的複製信道的複製狀態概況:
select * from performance_schema.replication_applier_status_by_worker;
1三、在 performance_schema 庫中,提供了複製相關的一些視圖,可供查看複製相關的信息。
use performance_schema; show tables like '%repl%';
這些表裏分別有多源通道的配置信息和多源通道的狀態信息,另外還有鏈接配置信息和鏈接狀態信息,若是配置了多線程複製的話,還會有多線程配置信息和多線程狀態信息。
其它一些須要注意的點:
初次配置耗時較長,須要將各個 master 的數據 dump 下來,再 source 到 slave 上。
須要考慮各 master 數據增加頻率,slave 的數據增加頻率是這些數據的總和。若是過高,會致使大量的磁盤IO,形成數據更新延遲,最嚴重的是會影響正常的查詢。
若是多個主數據庫實例中存在同名的庫,則同名庫的表都會放到一個庫中;
若是同名庫中的表名相同且結構相同,則數據會到一塊兒;若是結構不一樣,則先建的有效。