mysql被動模式下的主主配置
mysql 架構最簡單用得也最多的的是主從,主主等,主從有個切換的問題,從庫不可寫,在主庫一定的情況下,切換挺麻煩,這裏可以用主主模式。
但是主主也有個問題,就是兩邊同時寫有可能沖突,主鍵沖突,雖然可以用奇偶主鍵方式來解決,或者程序來做,但是增加了麻煩,這裏用被動模式下的主主就方便多了。
兩臺服務器設置
1.兩臺服務器都設置上二進制日誌和relay日誌:
#給服務器命名一個id
server_id=140
#聲明二進制日誌的文件為mysql-bin.xxx
log-bin=mysql-bin
#二進制日誌的格式:mixed/row/statement
binlog_format=mixed
#主主復制時都需要配置relay-log
relay-log=mysql-relay
2.都給對付賦權並設置對付對方為自己的主
20:GRANT replication slave ON *.* to ‘repl‘@‘10.0.67.19‘ identified by ‘123456‘;
19:change master to master_host=‘10.0.67.20‘, master_user=‘repl‘, master_password=‘123456‘,master_port=3306, master_log_file=‘mysql-bin.000004‘, master_log_pos=1318;
19:GRANT replication slave ON *.* to ‘repl‘@‘10.0.67.20‘ identified by ‘123456‘;
20:change master to master_host=‘10.0.67.19‘, master_user=‘repl‘, master_password=‘123456‘,master_port=3306, master_log_file=‘mysql-bin.000004‘, master_log_pos=1318;
3.開啟slave:
start slave
4.查看slave狀態
show slave status\G
被動模式下的主主復制:
1.概念:是指2臺服務器地位一樣,但其中一臺為只讀,並且業務中也只寫某1臺服務器;
2.好處:如果供寫入的服務器出了故障,能迅速的切換到從服務器,或者出於檢修等目的,把寫入功能切換到另一臺服務器也比較方便;
3.實現:在只讀服務器的my.cnf中加入如下配置:read-only=on;
同步沖突問題:
摘錄:
1.主主復制下一定要註意避免的問題,同步沖突,例:
create table stu (
id int primary key auto_increment.
)......
2臺mysql地位相等, 假如2個請求同時到達2臺服務器,請求的A節點stu的id為1,請求的B節點stu的id為1,此時就產生了同步沖突的問題;
2.解決方案:
讓A服務器的主鍵通過奇數增長,B服務器的主鍵通過偶數增長;
A服務器:
set global auto_increment_increment = 2; //每次自增步長
set global auto_increment_offset = 1; //初始自增的數字
set session auto_increment_increment = 2;
set session auto_increment_offset = 1;
B服務器:
set global auto_increment_increment = 2;
set global auto_increment_offset = 2;
set session auto_increment_increment=2;
set session auto_increment_offset = 2;
註:auto-increment-increment 和auto-increment-offset要寫到配置文件中,防止下次重啟後失效;
註:如果後期需要加服務器,這個辦法就有限制了
方法:我們可以在業務邏輯上來解決,比如在oracle有sequence序列,序列每次訪問生成遞增/遞減的數據,以redis為例,我們可以專門構建一個 global:userid,每次PHP插入Mysql前,先 incr->global:userid,得到一個不重復的userid;
mysql被動模式下的主主配置