一. 說之前前兩天 MTSC 2018 在北京國際會(huì)議中心圓滿召開,并取得非常好的反響,雖然臨時(shí)有事,沒去成,但還是非常贊許為此會(huì)議付出的朋友和小伙伴們~ 二. 背景最近在公司做內(nèi)部平臺(tái)架構(gòu)上的調(diào)整,期間順便弄了一下數(shù)據(jù)庫的高可用的方案,一來記錄一下,二來近一年公眾號(hào)上的文章貢獻(xiàn)太少了,爭(zhēng)取補(bǔ)上來~ 三. 今天分享啥沒錯(cuò),正如標(biāo)題上寫的,今天會(huì)先給大家講一下,如何《基于docker+mysql實(shí)現(xiàn)主從同步配置方法》 ,當(dāng)然docker只是輔助,重點(diǎn)是Mysql如何實(shí)現(xiàn)高可用的方法。 注:有的測(cè)試小伙伴會(huì)說,這個(gè)不是開發(fā)或者是架構(gòu)師的事嗎,測(cè)試要關(guān)注這個(gè)干嘛?現(xiàn)在互聯(lián)網(wǎng)正式在線上運(yùn)營的產(chǎn)品我相信都是高可用架構(gòu)的,掌握產(chǎn)品架構(gòu)的實(shí)現(xiàn),幫助測(cè)試更好的掌握先機(jī),再說,讓你們多學(xué)點(diǎn)知識(shí),總不見得是壞事吧? 四. 具體操作4.1 先建立數(shù)據(jù)存放目錄(~/test/mysql_test/) --mysql --master --data --conf --my.cnf --slave --data --conf --my.cnf 4.2 準(zhǔn)備好 Mysql Master(主庫)和Mysql Slave(從庫)的my.cnf文件 Master my.cnf 配置文件: [mysqld] server_id = 1 log-bin= mysql-bin read-only=0 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ Slave my.cnf 配置文件: [mysqld] server_id = 2 log-bin= mysql-bin read-only=1 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ 注:在本文中,由上述my.cnf配置文件可得知,主從同步針對(duì)的數(shù)據(jù)庫(除了mysql,sys,information_schema,performance_schema這些以外)的其它所有數(shù)據(jù)庫都會(huì)進(jìn)行同步(含數(shù)據(jù)庫、表、數(shù)據(jù)等) 小結(jié):
4.3 創(chuàng)建master主容器 docker run --name mastermysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/master/data:/var/lib/mysql -v ~/test/mysql_test/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7 4.4 創(chuàng)建slave從容器 docker run --name slavemysql -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/slave/data:/var/lib/mysql -v ~/test/mysql_test/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7 4.5 master容器設(shè)置 //進(jìn)入master容器 docker exec -it mastermysql bash //啟動(dòng)mysql命令,剛在創(chuàng)建窗口時(shí)我們把密碼設(shè)置為:root mysql -u root -p //創(chuàng)建一個(gè)用戶來同步數(shù)據(jù),每個(gè)slave使用標(biāo)準(zhǔn)的MySQL用戶名和密碼連接master。進(jìn)行復(fù)制操作的用戶會(huì)授予REPLICATION SLAVE 權(quán)限。 CREATE USER 'slave'@ '%' IDENTIFIED BY '123456'; (其實(shí)可省略) GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456'; //這里表示創(chuàng)建一個(gè)slaver同步賬號(hào)slave,允許訪問的IP地址為%,%表示通配符 //查看狀態(tài),記住File、Position的值,在Slave中將用到 show master status/G; 4.6 slave容器設(shè)置 //進(jìn)入slaver容器 docker exec -it slavemysql bash //啟動(dòng)mysql命令,剛在創(chuàng)建窗口時(shí)我們把密碼設(shè)置為:root mysql -u root -p //設(shè)置主庫鏈接 change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306; //啟動(dòng)從庫同步 start slave; //查看狀態(tài) show slave status\G; 如果 show slave status\G命令結(jié)果中出現(xiàn): Slave_IO_Running: Yes Slave_SQL_Running: Yes 以上兩項(xiàng)都為Yes,那說明沒問題了。 五、注意事宜5.1 首先在主從沒有生效的時(shí)候,要保持兩臺(tái)服務(wù)器數(shù)據(jù)庫、表相同,數(shù)據(jù)相同 那如何實(shí)現(xiàn)主從庫在開始之間的同步呢,別怕,繼續(xù)看? master容器上執(zhí)行: mysqldump -uroot -p --all-databases >/root/all_database.sql 將all_database.sql拷貝到從庫中來,在slave從庫容器上執(zhí)行: mysql -uroot -p <all_database.sql 如此兩步驟,主庫和從庫數(shù)據(jù)會(huì)追加相平,保持同步! 再此過程中,若主庫存在業(yè)務(wù),在同步的時(shí)候要先鎖表,讓其不要有修改! #如需要,可以master容器中,執(zhí)行以下命令鎖定數(shù)據(jù)庫以防止寫入數(shù)據(jù)。mysql>FLUSH TABLES WITH READ LOCK; 等待主從數(shù)據(jù)追平,主從同步后在打開鎖! #解鎖數(shù)據(jù)表。 mysql>UNLOCK TABLES; 主從數(shù)據(jù)追平后,定位好從庫到主庫日志的文件名字,和相應(yīng)的位置 master主庫運(yùn)行: mysql> show master status\G; 看到且記住相應(yīng)文件名字和位置,下面會(huì)用到哦! slave從庫運(yùn)行: #設(shè)置主庫鏈接 change master to master_host='172.17.0.9',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=2037,master_port=3306; #執(zhí)行從庫同步 start slave; #查看從庫同步狀態(tài) show slave status\G; 在結(jié)果中看到: Slave_IO_Running: Yes Slave_SQL_Running: Yes 即可成功同步! 六、主從同步驗(yàn)證6.1 如當(dāng)前數(shù)據(jù)庫情況如下: 6.2、在master主庫容器中,創(chuàng)建數(shù)據(jù)庫master_demo,并在此庫下創(chuàng)建表userinfo,并插入一條記錄 create database master_demo; use master_demo; create table userinfo(username varchar(50),age int); insert into userinfo values('Tom',18); 6.3、此時(shí),進(jìn)入從庫容器中,查看: 確實(shí)已經(jīng)將在master主庫新建的數(shù)據(jù)庫和表記錄都同步過來了。 既然是主從同步,那反過來驗(yàn)證一下,在從庫下插入記錄后,會(huì)不會(huì)同步到主庫中來呢? 在從庫上操作插入記錄: insert into userinfo values('slave',20); 查看: 切到master主庫中,查看: 發(fā)現(xiàn)在master主庫中,還是只有一條記錄,說明與預(yù)期設(shè)想的一樣,在從庫中插入記錄,是不會(huì)同步到master主庫中來的 再來一波,在主庫master上,插入新記錄: insert into userinfo values('master',25); 在從庫中,查看 發(fā)現(xiàn)在master主庫中新加入的master記錄,在從庫中同步過來了。 到此,基于docker mysql數(shù)據(jù)庫的主從同步配置,驗(yàn)證到此結(jié)束,命令、配圖給的如此詳細(xì),還不來點(diǎn)個(gè)贊~ 七. 未完待續(xù)接下來,還會(huì)給大家介紹的有
|
|