以前感覺集群、讀寫分離,xxxx 都是狂拽牛逼吊炸天的東西。弄完之后發現其實都是很簡單的,只要你感興趣。
兩臺機器:
mysql01:192.168.1.222
mysql02:192.168.1.223
注意,如果你是虛擬機復制模擬的,得改下mysql/data下的auto.cnf,兩臺機器的uuid不能相同。服務器的的 selinux 都要 disable(修改/etc/selinux/config,將 SELINUX 改為 disabled)。
MySQL5.6 開始主從復制有兩種方式:基于日志(binlog)、基于 GTID(全局事務標示符)。
主從復制(也稱 A/B 復制)的原理
(1) Master將數據改變記錄到二進制日志(binary log)中,也就是配置文件log-bin指定的文件,這些記錄叫做二進制日志事件(binary log events);
(2) Slave 通過 I/O 線程讀取 Master 中的 binary log events 并寫入到它的中繼日志(relay log);
(3) Slave 重做中繼日志中的事件,把中繼日志中的事件信息一條一條的在本地執行一次,完
成數據在本地的存儲,從而實現將改變反映到它自己的數據(數據重放)。
mysql01:
vi /etc/my.cnf
## 在 [mysqld] 中增加以下配置項
## 設置 server_id,一般設置為 IP
server_id=222
## 復制過濾:需要備份的數據庫,輸出 binlog
#binlog-do-db=roncoo
## 復制過濾:不需要備份的數據庫,不輸出(mysql 庫一般不同步)
binlog-ignore-db=mysql
## 開啟二進制日志功能,可以隨便取,最好有含義
log-bin=master-mysql
## 為每個 session 分配的內存,在事務過程中用來存儲二進制日志的緩存
binlog_cache_size=1M
## 主從復制的格式(mixed,statement,row,默認格式是 statement)
binlog_format=mixed
## 二進制日志自動刪除/過期的天數。默認值為 0,表示不自動刪除。
expire_logs_days=7
## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免 slave 端復制中斷。
## 如:1062 錯誤是指一些主鍵重復,1032 錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
## relay_log 配置中繼日志
relay_log=relay01
## log_slave_updates 表示 slave 將復制事件寫進自己的二進制日志
log_slave_updates=1
啟動/重啟 Master 數據庫服務,登錄數據庫,創建數據同步用戶,并授予相應的權限
service?mysql?restart mysql?-uroot?-p
##創建數據同步用戶,并授予相應的權限
mysql>?grant?replication?slave,?replication?client?on?*.*?to?'repl01'@'192.168.1.223'?identified?by '123456'; Query?OK,?0?rows?affected?(0.00?sec)
## 刷新授權表信息
mysql>?flush?privileges; Query?OK,?0?rows?affected?(0.00?sec)
## 查看 position 號,記下 position 號(從機上需要用到這個 position 號和現在的日志文件)
mysql>?show?master?status; mysql02:
?vi /etc/my.cnf
## 在 [mysqld] 中增加以下配置項
## 設置 server_id,一般設置為 IP
server_id=223
## 復制過濾:需要備份的數據庫,輸出 binlog
#binlog-do-db=roncoo
##復制過濾:不需要備份的數據庫,不輸出(mysql 庫一般不同步)
binlog-ignore-db=mysql
## 開啟二進制日志,以備 Slave 作為其它 Slave 的 Master 時使用
log-bin=slave-mysql
## 為每個 session 分配的內存,在事務過程中用來存儲二進制日志的緩存
binlog_cache_size = 1M
## 主從復制的格式(mixed,statement,row,默認格式是 statement)
binlog_format=mixed
## 二進制日志自動刪除/過期的天數。默認值為 0,表示不自動刪除。
expire_logs_days=7
## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免 slave 端復制中斷。
## 如:1062 錯誤是指一些主鍵重復,1032 錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
## relay_log 配置中繼日志
relay_log=relay02
## log_slave_updates 表示 slave 將復制事件寫進自己的二進制日志
log_slave_updates=1
重啟數據庫 ???service mysql restart
添加相關參數
mysql>? change?master?to?master_host='192.168.1.222',?master_user='repl01',master_password='123456',?master_port=3306,?master_log_file='mysql01.000001',master_log_pos=429,?master_connect_retry=30; Query?OK,?0?rows?affected,?2?warnings?(0.01?sec)
上面執行的命令的解釋:
master_host=’192.168.1.222′ ## Master 的 IP 地址
master_user=’repl’ ## 用于同步數據的用戶(在 Master 中授權的用戶)
master_password=’123456′ ## 同步數據用戶的密碼
master_port=3306 ## Master 數據庫服務的端口
master_log_file=’master-mysql.000001′ ##指定 Slave 從哪個日志文件開始讀復制數據(可
在 Master 上使用 show master status 查看到日志文件名)
master_log_pos=429 ## 從哪個 POSITION 號開始讀
master_connect_retry=30 ##當重新建立主從連接時,如果連接建立失敗,間隔多久后重試。
單位為秒,默認設置為 60 秒,同步延遲調優參數。
## 查看主從同步狀態
mysql> show slave statusG;
可看到 Slave_IO_State 為空, Slave_IO_Running 和 Slave_SQL_Running 是 No,表明 Slave 還
沒有開始復制過程。
## 開啟主從同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
## 再查看主從同步狀態
mysql> show slave statusG;
主要看以下兩個參數,這兩個參數如果是 Yes 就表示主從同步正常
Slave_IO_Running:?Yes Slave_SQL_Running:?Yes
可查看 master 和 slave 上線程的狀態。在 master 上,可以看到 slave 的 I/O 線程創建的連接:
mysql01:?mysql>?show?processlistG; mysql02:?mysql>?show?processlistG;
完成,測試在mysql01上新建數據庫db1,查看mysql02。
從mysql02到mysql01是一樣的步驟:
切換到mysql02上
##創建數據同步用戶,并授予相應的權限
mysql>?grant?replication?slave,?replication?client?on?*.*?to?'repl02'@'192.168.1.222'?identified?by '123456'; Query?OK,?0?rows?affected?(0.00?sec)
## 刷新授權表信息
mysql>?flush?privileges; Query?OK,?0?rows?affected?(0.00?sec)
## 查看 position 號,記下 position 號(從機上需要用到這個 position 號和現在的日志文件)
mysql>?show?master?status; change?master?to?master_host='192.168.1.223',?master_user='repl02',master_password='123456',?master_port=3306,master_log_file='mysql02.000002',master_log_pos=567, master_connect_retry=30; mysql>?start?slave;Query?OK,?0?rows?affected?(0.00?sec)
## 再查看主從同步狀態
mysql>?show?slave?statusG;
在mysql02上創建數據庫db2,查看mysql01即可