引言
實(shí)際生產(chǎn)中要求數(shù)據(jù)庫的高可用性殊霞,就要考慮mysql的主從、主主汰蓉。若針對的是上云的機(jī)器绷蹲,比如使用阿里云,那可以購買相應(yīng)廠商的服務(wù)顾孽,只需要修改相應(yīng)的配置就可以做到熱備祝钢,冷備的效果。但是若針對的是使用自己的服務(wù)器的企業(yè)若厚,那只能自己擼起袖子來干了拦英。
參考網(wǎng)址
1.mysql主從
Mysql主從復(fù)制原理及搭建
http://www.reibang.com/p/b0cf461451fb
2.mysql設(shè)置步長
mysql修改數(shù)據(jù)表自增步
3.更進(jìn)一步,mysql雙主
http://www.reibang.com/p/469279c1ad39
主主搭建
本文將以174,175兩臺服務(wù)器為例子测秸,介紹給讀者雙主數(shù)據(jù)庫的搭建方法疤估。
1. Mysql安裝
安裝方法在網(wǎng)上有很多灾常,此處本文就不在重復(fù)了,但是要強(qiáng)調(diào)一點(diǎn)铃拇,兩臺機(jī)器上的mysql至少安裝5.7以上的版本钞瀑,且兩臺機(jī)器上的mysql版本,安裝路徑慷荔,配置雕什,最好是一模一樣的。
2. Mysql配置
修改my.cnf配置信息显晶,默認(rèn)安裝存放在 /etc/my.cnf中
2.1 開啟relay log配置
這里以174上的mysql作為例子贷岸,同理可修改175上的配置,建議配置均以后綴IP不同作為區(qū)分磷雇。
[mysqlId]
# 同一局域名內(nèi)注意要唯一
server-id=174
# 開啟二進(jìn)制日志功能凰盔,可以隨便取(關(guān)鍵)
log-bin=mysql-bin-174
# relay_log配置中繼日志
relay_log=mysql-relay-bin-174
2.2 設(shè)置步長
在主主同步是先寫入一臺機(jī)器倦春,然后在同步到另外一臺機(jī)器上面户敬,本質(zhì)上并不是數(shù)據(jù)的同步,而是sql語言的同步睁本∧蚵基于這個(gè)原理,在雙主模式下如果只是單純使用mysql的自增長策略呢堰,那將會(huì)導(dǎo)致沖突(比如A機(jī)器插入一條id為3的數(shù)據(jù)抄瑟,B機(jī)器也插入了一條id為3的數(shù)據(jù),這樣子AB機(jī)器之間就無法同步了)枉疼。
這個(gè)問題其實(shí)可以擴(kuò)大成分布式環(huán)境下數(shù)據(jù)庫id一致性問題皮假。解決辦法有很多,比如本博主之前寫到的另外一篇文章骂维,采用雪花算法保證全局id的唯一性惹资。
這里因?yàn)槭莾膳_機(jī)器,所以我們可以做一種簡單處理航闺,針對mysql的自增長一臺為單數(shù)褪测,一臺為復(fù)數(shù)進(jìn)行區(qū)分。因此修改mysql配置如下
[mysqlId]
#設(shè)置步長潦刃,兩臺機(jī)器均為2
auto_increment_increment=2
#設(shè)置初始值侮措,一臺為1,另一臺為2
auto_increment_offset=1
修改完成mysql的配置后記得要重啟
sevice mysql restart
3. mysql主主實(shí)現(xiàn)
在兩臺機(jī)器174,175上均用root用戶訪問mysql
3.1 創(chuàng)建slave用戶
174
create user 'slave'@'xx.xx.xx.175' identified by 'pwd';
grant replication slave,replication client on *.* to 'slave'@'xx.xx.xx.175';
flush privileges;
175
create user 'slave'@'xx.xx.xx.174' identified by 'pwd';
grant replication slave,replication client on *.* to 'slave'@'xx.xx.xx.174';
flush privileges;
3.2 配置主主
在174上配置自己為slave乖杠,主指向175分扎;
在175上配置自己為slave,主指向174胧洒。
174
show master status \G; #記錄下 file和position
master_host='xx.xx.xx.175',master_user='slave',master_password='pwd',master_port=3306,master_log_file='175上記錄下的file',master_log_pos=175上記錄下的position;
175
show master status \G; #記錄下 file和position
master_host='xx.xx.xx.174',master_user='slave',master_password='pwd',master_port=3306,master_log_file='174上記錄下的file',master_log_pos=174上記錄下的position;
命令說明
master_host :Master的地址
master_port:Master的端口號
master_user:用于數(shù)據(jù)同步的用戶
master_password:用于同步的用戶的密碼
master_log_file:指定 Slave 從哪個(gè)日志文件開始復(fù)制數(shù)據(jù)畏吓,即上文中提到的 File 字段的值
master_log_pos:從哪個(gè) Position 開始讀环揽,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗,重試的時(shí)間間隔庵佣,單位是秒歉胶,默認(rèn)是60秒
分別在174和175中中查看主從同步狀態(tài):
show slave status \G;
此時(shí)的SlaveIORunning 和 SlaveSQLRunning 都是No,因?yàn)槲覀冞€沒有開啟主從復(fù)制過程巴粪。
開啟主從復(fù)制:
start slave;
再次查看同步狀態(tài):
show slave status \G;
SlaveIORunning 和 SlaveSQLRunning 都是Yes說明主從復(fù)制已經(jīng)開啟通今。
4. 更多
4.1 問題
若SlaveIORunning一直是Connecting,有下面4種原因:
1肛根、網(wǎng)絡(luò)不通辫塌,檢查ip端口
2、密碼不對派哲,檢查用于同步的用戶名和密碼
3臼氨、pos不對,檢查Master的Position
4芭届、mysql8特有的密碼規(guī)則問題引起:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';
將密碼規(guī)則修改為:mysql_native_password
4.2 指定數(shù)據(jù)庫主從
如果需要指定想要主從同步哪個(gè)數(shù)據(jù)庫储矩,可以在master的my.cnf添加配置:
binlog-do-db:指定mysql的binlog日志記錄哪個(gè)db
或者在slave的my.cnf添加配置:
replicate-do-db=需要復(fù)制的數(shù)據(jù)庫名,如果復(fù)制多個(gè)數(shù)據(jù)庫褂乍,重復(fù)設(shè)置這個(gè)選項(xiàng)即可
replicate-ignore-db=需要忽略的數(shù)據(jù)庫名持隧,如果忽略多個(gè)數(shù)據(jù)庫,重復(fù)設(shè)置這個(gè)選項(xiàng)即可
4.3 slave的啟動(dòng)
若遇到奇怪的問題逃片,可以先關(guān)閉slave屡拨,調(diào)整好file和position,在重新開啟褥实。不過此時(shí)應(yīng)該注意兩邊數(shù)據(jù)的完整性
stop slave;
start slave;