主節點 IP:192.168.1.205 主機名:master1 從節點 IP:192.168.1.206 主機名:master2 機器準備 主節點 IP:192.168.229.204 主機名:master1 從節點 IP:192.168.229.205 主機名:master2 兩臺機器都啓動mysql 密碼www.roncoo.com MySQL 主從複製官方文檔 http://dev.mysql.com/doc/refman/5.6/en/replication.html MySQL 主從複製的方式 MySQL5.6 開始主從複製有兩種方式: 基於日誌(binlog)、基於 GTID(全局事務標示符) 。 在此主要基於日誌(binlog)的複製。 MySQL 主從複製(也稱 A/B 複製)的原理 (1) Master將數據改變記錄到二進制日誌(binary log)中,也就是配置文件log-bin指定的文件, 這些記錄叫做二進制日誌事件(binary log events); (2) Slave 通過 I/O 線程讀取 Master 中的 binary log events 並寫入到它的中繼日誌(relay log); (3) Slave 重做中繼日誌中的事件,把中繼日誌中的事件信息一條一條的在本地執行一次,完 成數據在本地的存儲,從而實現將改變反映到它自己的數據(數據重放)。 主 主從配置需要注意的點 (1)主從服務器操作系統版本和位數一致; (2) Master 和 Slave 數據庫的版本要一致; (3) Master 和 Slave 數據庫中的數據要一致; (4) Master 開啓二進制日誌,Master 和 Slave 的 server_id 在局域網內必須唯一; 主從配置的簡要步驟 1、Master 上的配置 (1) 安裝數據庫; (2) 修改數據庫配置文件,指明 server_id,開啓二進制日誌(log-bin); (3) 啓動數據庫,查看當前是哪個日誌,position 號是多少; (4) 登錄數據庫,授權數據複製用戶(IP 地址爲從機 IP 地址,如果是雙向主從,這裏的 還需要授權本機的 IP 地址,此時自己的 IP 地址就是從 IP 地址); (5) 備份數據庫(記得加鎖和解鎖); (6) 傳送備份數據到 Slave 上; (7) 啓動數據庫; 以下步驟,爲單向主從搭建成功,想搭建雙向主從需要的步驟: (1) 登錄數據庫,指定 Master 的地址、用戶、密碼等信息(此步僅雙向主從時需要) ; (2) 開啓同步,查看狀態; 2、Slave 上的配置 (1) 安裝數據庫; (2) 修改數據庫配置文件,指明 server_id(如果是搭建雙向主從的話,也要開啓二進制 日誌 log-bin) ; (3) 啓動數據庫,還原備份; (4) 查看當前是哪個日誌,position 號是多少(單向主從此步不需要,雙向主從需要); (5) 指定 Master 的地址、用戶、密碼等信息; (6) 開啓同步,查看狀態。 單向主從環境(也成MySQL A/B複製)的搭建 (1)兩臺數據庫服務器的的 selinux 都要 disable (永久關閉 selinux,請修改/etc/selinux/config, 將 SELINUX 改爲 disabled (2)都安裝了相同版本的數據庫(mysql5.6.26.tar.gz) master1其中/etc/my.conf配置如下 [root@master1 ~]# cat /etc/my.cnf [client] port = 3306 socket = /usr/local/mysql/mysql.sock [mysqld] character-set-server = utf8 collation-server = utf8_general_ci skip-external-locking skip-name-resolve user = mysql port = 3306 basedir = /usr/local/mysql datadir = /home/mysql/data tmpdir = /home/mysql/temp # server_id = ..... socket = /usr/local/mysql/mysql.sock log-error = /home/mysql/logs/mysql_error.log pid-file = /home/mysql/mysql.pid open_files_limit = 10240 back_log = 600 max_connections=500 max_connect_errors = 6000 wait_timeout=605800 #open_tables = 600 #table_cache = 650 #opened_tables = 630 max_allowed_packet = 32M sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 300 query_cache_type = 1 query_cache_size = 256M query_cache_limit = 2M query_cache_min_res_unit = 16k tmp_table_size = 256M max_heap_table_size = 256M key_buffer_size = 256M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M lower_case_table_names=1 default-storage-engine = INNODB innodb_buffer_pool_size = 2G innodb_log_buffer_size = 32M innodb_log_file_size = 128M innodb_flush_method = O_DIRECT ##################### thread_concurrency = 32 long_query_time= 2 slow-query-log = on slow-query-log-file = /home/mysql/logs/mysql-slow.log ## replication server_id=204 <--------與本機IP對應,192.168.229.204 #binlog-do-db=roncoo binlog-ignore-db=mysql log-bin=edu-mysql-bin binlog_cache_size=1M binlog_format=mixed expire_logs_days=7 slave_skip_errors=1062 [mysqldump] quick max_allowed_packet = 32M [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [root@master1 ~]# 其中master2的配置/etc/my.cnf如下 [root@master2 etc]# cat my.cnf [client] port = 3306 socket = /usr/local/mysql/mysql.sock [mysqld] character-set-server = utf8 collation-server = utf8_general_ci skip-external-locking skip-name-resolve user = mysql port = 3306 basedir = /usr/local/mysql datadir = /home/mysql/data tmpdir = /home/mysql/temp # server_id = ..... socket = /usr/local/mysql/mysql.sock log-error = /home/mysql/logs/mysql_error.log pid-file = /home/mysql/mysql.pid open_files_limit = 10240 back_log = 600 max_connections=500 max_connect_errors = 6000 wait_timeout=605800 #open_tables = 600 #table_cache = 650 #opened_tables = 630 max_allowed_packet = 32M sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 300 query_cache_type = 1 query_cache_size = 256M query_cache_limit = 2M query_cache_min_res_unit = 16k tmp_table_size = 256M max_heap_table_size = 256M key_buffer_size = 256M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M lower_case_table_names=1 default-storage-engine = INNODB innodb_buffer_pool_size = 2G innodb_log_buffer_size = 32M innodb_log_file_size = 128M innodb_flush_method = O_DIRECT ##################### thread_concurrency = 32 long_query_time= 2 slow-query-log = on slow-query-log-file = /home/mysql/logs/mysql-slow.log ## replication server_id=205 <--------與本機IP對應,192.168.229.205 #binlog-do-db=roncoo binlog-ignore-db=mysql log-bin=edu-mysql-slave1-bin binlog_cache_size = 1M binlog_format=mixed expire_logs_days=7 slave_skip_errors=1062 relay_log=edu-mysql-relay-bin log_slave_updates=1 read_only=1 [mysqldump] quick max_allowed_packet = 32M [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [root@master2 etc]# 重啓Master1和Master2節點的mysql服務 [root@master1 ~]# service mysql restart [root@master2 ~]# service mysql restart www.roncoo.com 在主節點上創建數據同步用戶,這個用戶允許從主要節點同步數據 mysql> use mysql; mysql> grant replication slave, replication client on *.* to 'repl'@'192.168.229.205' identified by 'roncoo.123'; mysql> grant replication slave, replication client on *.* to 'repl'@'*' identified by 'roncoo.123'; mysql> flush privileges; mysql> show master status; +----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------+----------+--------------+------------------+-------------------+ | edu-mysql-bin.000001 | 120 | | mysql | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> 4、創建 roncoo 庫、表,並寫入一定量的數據,用於模擬現有的業務系統數據庫 create database if not exists ron default charset utf8 collate utf8_general_ci; use ron; DROP TABLE IF EXISTS `edu_user`; CREATE TABLE `edu_user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶名', `pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密碼', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用戶信息表'; INSERT INTO `edu_user` VALUES (1,'吳水成','123456'),(2,'清風','123456'),(3,'龍果','roncoo.com'); 5 爲保證Master和Slave的數據一致,我們採用主備份,從還原來實現初始數據一致性 #先臨時鎖表 mysql> flush tables with read lock; (unlock tables; ) mysql> exit [root@master1 ~]# mysqldump -p3306 -uroot -p --add-drop-table ron > /tmp/edu-master-roncoo.sql Enter password: www.roncoo.com [root@master1 ~]# scp /tmp/edu-master-roncoo.sql root@master2:/tmp/ edu-master-roncoo.sql 100% 2079 1.5MB/s 00:00 [root@master1 ~]# slave上創建相同庫 [root@master2 ~]# mysql -uroot -p Enter password:www.roncoo.com mysql> create database if not exists roncoo default charset utf8 collate utf8_general_ci; mysql> use roncoo; [root@master2 ~]# mysql -uroot -p roncoo </tmp/edu-master-roncoo.sql Enter password:www.roncoo.com mysql> use roncoo; mysql> select * from edu_user; +----+-----------+------------+ | Id | userName | pwd | +----+-----------+------------+ | 1 | 吳水成 | 123456 | | 2 | 清風 | 123456 | | 3 | 龍果 | roncoo.com | +----+-----------+------------+ 3 rows in set (0.00 sec) mysql> 登錄Slave數據庫,添加相關參數 (Master的IP,端口,同步用戶,密碼,position號,讀取哪個日誌文件) mysql> change master to master_host='192.168.229.204', master_user='repl', master_password='roncoo.123', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=120, master_connect_retry=30; ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first mysql> stop slave; mysql> change master to master_host='192.168.229.204', master_user='repl', master_password='roncoo.123', master_port=3306, master_log_file='edu-mysql-bin.000002', master_log_pos=120, master_connect_retry=30; mysql> START slave; 上面執行的命令的解釋: master_host='192.168.1.205' ## Master 的 IP 地址 master_user='repl' ## 用於同步數據的用戶(在 Master 中授權的用戶) master_password='roncoo.123' ## 同步數據用戶的密碼 master_port=3306 ## Master 數據庫服務的端口 master_log_file='edu-mysql-bin.000001' ##指定 Slave 從哪個日誌文件開始讀複製數據(可 在 Master 上使用 show master status 查看到日誌文件名) master_log_pos=429 ## 從哪個 POSITION 號開始讀 master_connect_retry=30 ##當重新建立主從連接時,如果連接建立失敗,間隔多久後重試。 單位爲秒,默認設置爲 60 秒,同步延遲調優參數。 ## 查看主從同步狀態 mysql> show slave status\G; 可看到 Slave_IO_State 爲空, Slave_IO_Running 和 Slave_SQL_Running 是 No,表明 Slave 還 沒有開始複製過程。 ## 開啓主從同步 mysql> start slave; ## 再查看主從同步狀態 mysql> show slave status\G; 可查看 master 和 slave 上線程的狀態。在 master 上,可以看到 slave 的 I/O 線程創建的連接: Master : mysql> show processlist\G; 主要看一下兩個參數,這兩個參數如果是Yes就表示主從同步正常 Slave_IO_Running: Yes Slave_SQL_Running: Yes 可查看master和slave上線程的狀態。 在master上輸入命令,可以看到slave的I/O線程創建的連接 mysql> show processlist\G; *************************** 1. row *************************** Id: 24 User: root Host: 127.0.0.1:34102 db: NULL Command: Query Time: 0 State: init Info: show processlist *************************** 2. row *************************** Id: 25 User: repl Host: 192.168.229.205:39450 db: NULL Command: Binlog Dump Time: 381 State: Master has sent all binlog to slave; waiting for binlog to be updated Info: NULL 2 rows in set (0.00 sec) ERROR: No query specified mysql> 1.row 爲處理 slave 的 I/O 線程的連接。 2.row 爲處理 MySQL 客戶端連接線程。 3.row 爲處理本地命令行的線程 在slave上輸入命令,可以看到slave的I/O線程創建的連接 mysql> show processlist\G; *************************** 1. row *************************** Id: 3 User: root Host: localhost db: NULL Command: Query Time: 0 State: init Info: show processlist *************************** 2. row *************************** Id: 6 User: system user Host: db: NULL Command: Connect Time: 558 State: Waiting for master to send event Info: NULL *************************** 3. row *************************** Id: 7 User: system user Host: db: NULL Command: Connect Time: 558 State: Slave has read all relay log; waiting for the slave I/O thread to update it Info: NULL 3 rows in set (0.00 sec) ERROR: No query specified mysql> slave節點參數說明 1.row 爲 I/O 線程狀態。 2.row 爲 SQL 線程狀態。 3.row 爲處理本地命令行的線程 ---------------------------------------------------------------------- ---------------------------------------------------------------------- 主從數據複製同步測試 (1) 在 Master 中的 roncoo 庫上變更數據的同步測試; mysql> INSERT INTO `edu_user` VALUES (4,'同步測試 1','123456'),(5,'同步測試 2','123456'); Master 中添加完之後,登錄 Slave 中查看數據是否已同步。 show slave status\G; (2) 在 Master 上新建一個 ron 庫 mysql> create database if not exists ron default charset utf8 collate utf8_general_ci; 在 Slave 中查看數據庫 mysql> show databases; 最終的測試結果是,在 Master 中的操作,都成功同步到了 Slave。 10、測試過程中,如果遇到同步出錯,可在 Slave 上重置主從複製設置(選操作): (1) mysql> reset slave; (2) mysql> change master to master_host='192.168.1.205', master_user='repl', master_password='roncoo.123', master_port=3306, master_log_file='edu-mysql-bin.00000x',master_log_pos=xx,master_connect_retry=30; (此時,master_log_file 和 master_log_pos 要在 Master 中用 show master status 命令查看) 注意:如果在 Slave 沒做只讀控制的情況下,千萬不要在 Slave 中手動插入數據,那樣數據 就會不一致,主從就會斷開,就需要重新配置了 兩個可以減少主從複製延遲的參數(按需配置): MySQL 可以指定 3 個參數,用於複製線程重連主庫:--master-retry-count,--master-connectretry, --slave-net-timeout 。其中 master-connect-retry 和 master-retry-count 需要在 Change Master 搭建主備複製時指定,而 slave-net-timeout 是一個全局變量,可以在 MySQL 運行 時在線設置。具體的重試策略爲:備庫過了 slave-net-timeout 秒還沒有收到主庫來的數據, 它就會開始第一次重試。然後每過 master-connect-retry 秒,備庫會再次嘗試重連主庫。直 到重試了 master-retry-count 次,它纔會放棄重試。如果重試的過程中,連上了主庫,那麼 它認爲當前主庫是好的,又會開始 slave-net-timeout 秒的等待。slave-net-timeout 的默認值 是 3600 秒,master-connect-retry 默認爲 60 秒,master-retry-count 默認爲 86400 次。也 就是說,如果主庫一個小時都沒有任何數據變更發送過來,備庫纔會嘗試重連主庫。這就是 爲什麼在我們模擬的場景下,一個小時後,備庫纔會重連主庫,繼續同步數據變更的原因。 這樣的話,如果你的主庫上變更比較頻繁,可以考慮將 slave-net-timeout 設置的小一點,避 免主庫 Binlog dump 線程終止了,無法將最新的更新推送過來。當然 slave-net-timeout 設 置的過小也有問題,這樣會導致如果主庫的變更確實比較少的時候,備庫頻繁的重新連接主 庫,造成資源浪費。 slave-net-timeout=seconds 參數說明:當 Slave 從 Master 數據庫讀取 log 數據失敗後,等待多久重新建立連接並獲取數 據,單位爲秒,默認設置爲 3600 秒。
dubbo mysql主從備份
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.