dubbo mysql主從備份

主節點 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 秒。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章