Mysql雙主部署
解釋:
所謂雙主備份,其實也就是互做主從復制,每台master既是master,又是另一台服務器的slave。這樣,任何一方所做的變更,都會通過復制應用到另外一方的數據庫中。
要求:部署Mysql雙主復制,部署期間生產服務器可正常訪問,但無法進行登錄/注冊/退出等涉及到對Mysql寫的操作。
環境:
系統:centos 6.7
mysql版本:5.6.28
生產環境共2台mysql服務器(以下對兩台mysql分別簡稱為A B)
A:192.168.1.1 (master)
B:192.168.1.2 (slave)
部署前的准備
分別檢查A、B兩台Mysql服務器是否作為其他master的slave,並停止復制,以免受到影響。
#show slave status\G;
#mysql>stop slave;
- master(A庫) ---> slave(B庫)
開始部署
1. 同步數據:以A庫的數據為准,同步A B數據,使AB數據保持一致。
1.1 A中導出數據
(1)對A庫加鎖,避免同步時數據發生改變:
mysql>use database_name;
mysql> flush tables with read lock; #關閉所有打開的表,同時對於所有數據庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操作常常用於數據備份的時候。也就是將所有的臟頁都要刷新到磁盤,然后對所有的表加上了讀鎖,於是這時候直接拷貝數據文件也就是安全的。為此庫下的所有表施加讀鎖,退出會話后失效,所謂讀鎖,也就是只能讀,不能寫。
(2)使用mysqldump工具導出數據:
mysqldump -uroot -pxxx -R database_name >database_name.sql # -R參數表示同時備份函數
(3)記下binlog日志中Position的位置(用於slave連接A做復制時會用到)
mysql> show master status\G; # mysql-bin.000003 pos=443
(4)解鎖數據庫:
mysql>unlock tables;
1.2 將A備份的數據導入到B中
[root@localhost ~]# mysql -uroot -pxxx < database_name.sql
2. 配置Master(A)
(1)master中創建一個僅用於主從復制的賬號,給與REPLICATION SLAVE權限。此權限僅允許slave訪問Master的bin-log日志。
在Master中創建一個僅用於復制的mysql用戶,並僅給與復制權限。
mysql> create user 'repl_A'@'192.168.1.2' identified by '123';
mysql> grant replication slave on *.* to 'repl_A'@'192.168.1.2';
或
mysql>grant replication slave on *.* to ‘repl_A’@ ‘192.168.1.2’ identified by ‘123’; #上面兩句可以直接簡略為這一句。
(2)master開啟二進制日志
vim /etc/my.cnf 或者 vim /usr/my.cnf (在[mysqld]下添加:)
server-id=1 #指定master主機的id,不可為0,否則拒絕所有slave連接。
log-bin=mysql_bin #指定bin-log文件前綴名稱,開啟binlog日志
binlog_do_db=database_name #指定binlog日志是記錄的是哪個庫
replicate-do-db=database_name #指定復制哪一個庫
auto-increment-increment = 2
//每次增長2
auto-increment-offset = 1
//設置自動增長的字段的偏移量,即初始值為1
log_bin_trust_function_creators=1 #詳解如下方
expire_logs_days = 10 #保留10天的bin_log日志,防止日志太多占用磁盤空間
max_binlog_size = 100M #限制每個bin_log日志大小最大為100M。
log-slave-updates=1 #slave執行master的sql后,將sql記錄在binlog日志中(默認是不記錄的)——實際生產我沒開啟這條
max_connections=600 #指定最大連接數
wait_timeout=5 #等待超時
#重啟mysql使配置生效。
3. 配置Slave(B)
(1)配置slave的server-id
示例:[root@iZ2z usr]# vim my.cnf
[mysqld]
server-id=2
auto-increment-increment = 2
//每次增長2
auto-increment-offset = 2
//設置自動增長的字段的偏移量,即初始值為2
注:二都只有server_id不同和 auto-increment- offset不同
auto-increment-increment的值應設為整個結構中服務器的總數,本案例用到兩
台服務器,所以值設為2。
重啟mysql使配置生效。
(2)配置連接master的相關信息配置。
在slave中指定master相關參數。
你可以一行一行的配置master連接信息。
mysql>change master to master_host='192.168.1.1', #指定master主機IP地址
>master_user='repl_A', #指定一個(在master中)有復制權限的用戶
>master_port=3306,
>master_password='123', #指定上述有復制權限用戶的密碼
>master_log_file='mysql-bin.000003', #指定開始復制的binlog二進制文件。
>master_log_pos=443; #指定(在master二進制文件中)要開始復制的位置。#注意: master_log_pos的值無需加引號,否則報錯!
或者
將master連接信息配置寫在一行。
mysql>change master to master_host='192.168.1.1',master_user='repl',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=443;
解釋:
連接master的配置信息在命令行中配置好后,默認存在/var/lib/mysql/master.info文件,可以使用show master status\G;命令查看,所有就算重啟也不用擔心連接master的配置丟失。
(3)開啟slave
slave中:start slave;
Slave_IO_Running和Slave_SQL_Running的狀態都是YES,說明同步開啟成功。
- master(B庫) ---> slave(A庫)
Master(B)配置
(1)master中創建一個僅用於主從復制的賬號
mysql> grant REPLICATION SLAVE on *.* to 'repl_B'@'192.168.1.1' identified by '123';
(2)查看B庫中binlog日志的位置
mysql> show master status\G; # mysql_bin.000004 pos=558
(3)同步數據
mysql>change master to master_host='192.168.1.2',
>master_user='rel_B,
>master_port=3306,
>master_password='123',
>master_log_file='mysql_bin.000004',
>master_log_pos=558;
(4)開啟slave
A(slave)庫中:start slave;
(5)測試驗證
解釋:
log_bin_trust_function_creators=1
當二進制日志啟用后,這個變量就會啟用。它控制是否可以信任存儲函數創建者,不會創建寫入二進制日志引起不安全事件的存儲函數。如果設置為0(默認值),用戶不得創建或修改存儲函數,除非它們具有除CREATE ROUTINE或ALTER ROUTINE特權之外的SUPER權限。如果變量設置為1,MySQL不會對創建存儲函數實施這些限制。 此變量也適用於觸發器的創建。
server-id=1
原理:在master中,您必須配置一個獨特的服務器ID(可能需要重新啟動服務器)和啟用二進制日志,slave的復制基於master的二進制日志。如果沒有使用log-bin選項啟用二進制日志,復制是不可能的。每個slave與master必須配置一個獨特的ID。這個ID用於識別主從服務器,而且必須是一個正整數1和(232)−1之間。
驗證:
1. ls /var/lib/mysql/ 會發現有mysql-bin.000001mysql、mysql-bin.index ,表示啟用二進制日志成功。
mysql_bin.000001: Master記錄操作的二進制日志文件。
mysql_bin.index: 二進制文件的索引文件,存放二進制日志文件的名字和路徑。
2. 命令查看
#查看否開啟了bin-log mysql> show variables like '%log_bin%';
#查看bin-log相關參數 mysql> show variables like '%binlog%';
#當前mysql二進制日志文件的默認位置 mysql> show variables like '%datadir%';
#查看mysql二進制文件名稱及大小 mysql> show binary logs;
3. Master常用命令
#查看Master復制狀態 mysql> show master status;
#查看二進制日志文件事件內容 mysqlbinlog mysql-bin.xxx ---可讀性差
#查看二進制日志文件事件內容 mysql> show binlog events in 'mysql-bin.000003';
4. 管理二進制日志文件
#刪除二進制日志文件
手動刪除:
語法: > PURGE {MASTER | BINARY} LOGS TO 'log_name'
> PURGE {MASTER | BINARY} LOGS BEFORE 'date'
#我使用時沒發現MASTER 和BINARY的區別,都一樣用,都可以。
mysql> purge binary logs to 'mysql_bin.000002';
//刪除mysql_bin.000002之前的二進制日志文件,並同步刪除日志索引文件mysql_bin.index中mysql_bin.000002之前的索引信息。注意不包含mysql_bin.000002
mysql> purge master logs before '2017-07-20 21:58:00'; //清除2017-07-20 21:58:00 之前的二進制日志,並同步清楚日志索引文件的信息。
自動刪除:
my.cnf中加入以下,然后重啟:
SET GLOBAL expire_logs_days = 7 \\設置二進制日志只保留7天的
-------如果不想重啟直接mysql> SET GLOBAL expire_logs_days = 7
#重置master二進制日志文件及內容
mysql> reset master;
或者是
mysql>flush logs;