利用 docker 實現(xiàn) mysql 主從同步/讀寫分離勾邦,附贈 docker 搭建 mycat 讀寫分離

作者:Da'sBlog
原文:www.sunhao.win/articles/mysql-replication.html

1. 利用 docker 實現(xiàn) mysql 主從同步 / 讀寫分離

為了保證數(shù)據(jù)的完整和安全,mysql 設(shè)計了主從同步,一個掛掉還可以用另個跃须。最近重構(gòu)論壇,想來改成主從吧娃兽。擔心失誤菇民,就先拿 docker 練練手。

通過本文實際你會操作到投储。

  1. mysql 的主從同步
  2. docker 鏡像和容器的創(chuàng)建
  3. docker 容器間的數(shù)據(jù)傳遞
  4. mycat 入門

以下需要大于 100 的智商和 mysql 基礎(chǔ) docker 基礎(chǔ)第练,linux 基礎(chǔ)。

沒有也沒事玛荞,就是看著會有點吃力娇掏。

環(huán)境是 centos,mycat 是 1.6.docker 是 1.12.6

1.1 下載 mysql 鏡像

docker pull mysql
// ps:如果下載太慢勋眯,請?zhí)砑域v訊源,依次執(zhí)行
echo "OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'" >> /etc/sysconfig/docker
systemctl daemon-reload
service docker restart

或者直接去阿里倉庫下 https://dev.aliyun.com/search.html 把上面的 --registry-mirror=https://mirror.ccs.tencentyun.com 換成你的專屬源就可以

下載完輸入 docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql             latest              44a8e1a5c0b2        8 days ago          407 MB

1.2 利用 mysql 鏡像婴梧,創(chuàng)建用于主從同步的兩個新鏡像

我們當前所在的服務器叫宿主服務器

我們要利用 docker 虛擬兩個 docker 容器服務器客蹋,一個主服務器塞蹭,一個從服務器。

1.2.1 創(chuàng)建 master(主) 和 slave(從) 兩個文件夾

/usr/mysql/master
/usr/mysql/slave

1.2.2 在 master 和 slave 文件夾下 創(chuàng)建 Dockerfile 內(nèi)容為

FROM mysql
COPY my.cnf /etc/mysql/  
EXPOSE 3306
CMD ["mysqld"]

1.2.3 在 master 文件夾下 創(chuàng)建 my.cnf 內(nèi)容為

[mysqld]
log-bin=mysql-bin    //[必須]啟用二進制日志
server-id=1          //[必須]服務器唯一ID讶坯,默認是1番电,一般取IP最后一段,這里看情況分配

1.2.4 在 slave 文件夾下 創(chuàng)建 my.cnf 內(nèi)容為

[mysqld]
log-bin=mysql-bin    //[必須]啟用二進制日志
server-id=2          //[必須]服務器唯一ID辆琅,默認是1漱办,一般取IP最后一段担汤,這里看情況分配

1.2.5 切換到 master 目錄下構(gòu)建 master/mysql 鏡像

docker build -t master/mysql .

(命令最后有個.,不要忘記洼冻,代表當前目錄)

1.2.6 然后切換到 slave 目錄下構(gòu)建 slave/mysql 鏡像

docker build -t slave/mysql .

(命令最后有個.崭歧,不要忘記,代表當前目錄)

1.2.7 查看是否創(chuàng)建成功

[root@VM_118_220_centos ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
slave/mysql                 latest              8c496048d7ba        About an hour ago   407 MB
master/mysql                latest              7be30b0b631b        2 hours ago         407 MB
docker.io/mysql             latest              44a8e1a5c0b2        8 days ago          407 MB

1.3 用鏡像創(chuàng)建容器

docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=mysql -d master/mysql
docker run -p 3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d slave/mysql

1.3.1 從這里開始撞牢,建議打開兩個終端窗口率碾,方便操作

master 終端執(zhí)行

docker exec -it mysql-master bash
mysql -uroot -p

輸入密碼 mysql 進入到 mysql 環(huán)境

slave 終端執(zhí)行

docker exec -it mysql-slave bash
mysql -uroot -p

輸入密碼 mysql 進入到 mysql 環(huán)境

1.4 mysql 主從配置

mysql 配置

1.4.1 在主容器 mysql 中輸入以下命令:

mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'192.168.99.100' IDENTIFIED BY 'mysql';(指定ip)
或者
mysql>GRANT REPLICATION SLAVE ON *.* to 'user'@'%' identified by 'mysql';(所有ip)

然后查看主容器數(shù)據(jù)庫狀態(tài):

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1338 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

記錄 File 的值和 Position 的值。

下面要用到屋彪,到這里為止所宰,主庫千萬不要再做任何操作,防止狀態(tài)改變畜挥。

1.4.2 然后我們配置一下從庫

查看 master/mysql 的對外端口號

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
8d1e3b87d499        slave/mysql         "docker-entrypoint.sh"   2 hours ago         Up 2 hours          0.0.0.0:32769->3306/tcp   mysql-slave
980e5ea48152        master/mysql        "docker-entrypoint.sh"   2 hours ago         Up 2 hours          0.0.0.0:32768->3306/tcp   mysql-master

0.0.0.0:32768->3306/tcp 其中 32768 為 master 的端口

mysql>change master to
master_host='x.x.x.x',
master_user='user',
master_log_file='mysql-bin.000003',
master_log_pos=1201,
master_port=32768,
master_password='mysql';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

master_host=’x.x.x.x’ // 這里填 master 主機 ip

master_log_file=’mysql-bin.000003’, // 這里填寫 File 的值

master_log_pos=1338,// 這里填寫 Position 的值仔粥。

mysql> start slave;// 啟動從服務器復制功能

如果不小心配置錯, 輸入 mysql> stop slave; 然后重新錄入一遍

mysql>change master to
master_host='x.x.x.x',
master_user='user',
master_log_file='mysql-bin.000003',
master_log_pos=1201,
master_port=32768,
master_password='mysql';

就可以了

1.5 檢查主從連接狀態(tài)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: x.x.x.x
                  Master_User: user
                  Master_Port: 32768
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1338
               Relay_Log_File: 8d1e3b87d499-relay-bin.000002
                Relay_Log_Pos: 1221
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1338
              Relay_Log_Space: 1435
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: cd327a00-5e18-11e7-98f7-0242ac110006
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

這兩個必須是 Yes 為 No 或者 connect 說明沒有連接上

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

1.6 測試主從連接

注意設(shè)置主從后,操作只能在 master 終端上蟹但,slave 上的操作不會同步到 master 上躯泰。

1.6.1 登陸 master 終端

mysql> create database sunhao;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sunhao             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use sunhao
Database changed
mysql>  create table sunhao(id int(3),name char(10));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into sunhao values(1,'xiaoshuai');
Query OK, 1 row affected (0.01 sec)
mysql> select * from sunhao;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | xiaoshuai |
+------+-----------+
1 row in set (0.00 sec)

1.6.2 登陸 slave 服務器

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sunhao             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use sunhao
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from sunhao;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | xiaoshuai |
+------+-----------+

1.6.3 如果主服務器已經(jīng)存在應用數(shù)據(jù),則在進行主從復制時华糖,需要單獨復制處理(注意此操作麦向,如果對從服務器單獨錄入的數(shù)據(jù),會被覆蓋掉客叉。):

這里我們做一次完整的測試

(1) 在主服務器數(shù)據(jù)庫插入新的數(shù)據(jù)诵竭,并進行鎖表操作,不讓數(shù)據(jù)再進行寫入動作

mysql> insert into sunhao values(2,'xiaoshuai');
Query OK, 1 row affected (0.01 sec)
mysql> select * from sunhao;                   
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | xiaoshuai |
|    2 | xiaoshuai |
+------+-----------+
2 rows in set (0.00 sec)
mysql> FLUSH TABLES WITH READ LOCK;
mysql> show full processlist; 

(2) 退出 mysql兼搏,用 mysqldump 備份數(shù)據(jù)文件到 / var/lib, 然后順便多余的用 tar 打包一下玩卵慰。哈哈。

mysql> exit
Bye
root@980e5ea48152:/var/lib/mysql# mysqldump -u root -p  sunhao > /var/lib/sunhao.dump    
Enter password: 
root@980e5ea48152:/var/lib# tar -zcvf ./sunhao.dump .tar  ./sunhao.dump

(3) 打開宿主服務器佛呻,復制 mysql 主服務器文件 sunhao.dump.tar裳朋。到宿主服務器

[root]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
8d1e3b87d499        slave/mysql         "docker-entrypoint.sh"   4 hours ago         Up 4 hours          0.0.0.0:32769->3306/tcp   mysql-slave
980e5ea48152        master/mysql        "docker-entrypoint.sh"   4 hours ago         Up 4 hours          0.0.0.0:32768->3306/tcp   mysql-master
mkdir -p /var/mydata
docker cp 980e:/var/lib/sunhao.dump.tar /var/mydata/
cd /var/mydata
[root@VM_128_230_centos mydata]# ls
sunhao.dump.tar

解釋: docker cp 980e:/var/lib/sunhao.dump.tar /var/mydata/

980e 是 980e5ea48152 的縮寫。保證不重復簡寫就可以

980e:/var/lib/sunhao.dump.tar 意思就是選中的容器下面你的文件下的 sunhao.dump.tar 文件

/var/mydata/ 目標文件

(4) 在宿主主機上輸入

[root]# docker cp /var/mydata/sunhao.dump.tar 8d1e3b87d49936414c0e91ffdc60a054e7f4ef8b15baee295350565519abba0e:/var/lib/

(5) 在從服務器上輸入

root@8d1e3b87d499:/# cd /var/lib/
root@8d1e3b87d499:/var/lib# tar -zcvf sunhao.dump.tar

(6) 在從服務器上輸入

tar -zxvpf /var/lib/mysqlbak.sql.tar
mysql -uroot -pmysql sunhao < /var/lib/sunhao.dump;

如果寫入成功, 這個時候就可以用 select 查詢到數(shù)據(jù)件相。

(2) 取消主服務器數(shù)據(jù)庫鎖定

mysql> UNLOCK TABLES;

再扭。氧苍。夜矗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市让虐,隨后出現(xiàn)的幾起案子紊撕,更是在濱河造成了極大的恐慌,老刑警劉巖赡突,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对扶,死亡現(xiàn)場離奇詭異区赵,居然都是意外死亡,警方通過查閱死者的電腦和手機浪南,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門笼才,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人络凿,你說我怎么就攤上這事骡送。” “怎么了絮记?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵摔踱,是天一觀的道長。 經(jīng)常有香客問我怨愤,道長派敷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任撰洗,我火速辦了婚禮篮愉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘差导。我一直安慰自己潜支,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布柿汛。 她就那樣靜靜地躺著冗酿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪络断。 梳的紋絲不亂的頭發(fā)上裁替,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音貌笨,去河邊找鬼弱判。 笑死,一個胖子當著我的面吹牛锥惋,可吹牛的內(nèi)容都是我干的昌腰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膀跌,長吁一口氣:“原來是場噩夢啊……” “哼遭商!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捅伤,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劫流,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祠汇,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡仍秤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了可很。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗力。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖我抠,靈堂內(nèi)的尸體忽然破棺而出姜骡,到底是詐尸還是另有隱情,我是刑警寧澤屿良,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布圈澈,位于F島的核電站,受9級特大地震影響尘惧,放射性物質(zhì)發(fā)生泄漏康栈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一喷橙、第九天 我趴在偏房一處隱蔽的房頂上張望啥么。 院中可真熱鬧,春花似錦贰逾、人聲如沸悬荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氯迂。三九已至,卻和暖如春言缤,著一層夾襖步出監(jiān)牢的瞬間嚼蚀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工管挟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轿曙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓僻孝,卻偏偏與公主長得像导帝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子穿铆,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容