docker---mysql容器的主從同步

目錄

 

mysql主從複製同步

一 前提條件

二 mysql集羣配置文件

1  創建配置集結構如下

2 創建節點配置文件(master.cnf與slave.cnf)

三、搭建mysql環境

創建mysql容器

創建從庫容器

創建主庫容器

主庫從庫賦權

主庫

從庫

結構模式-----各種不同的結構模式上面的爲一主一從(多從)


mysql主從複製同步

一 前提條件

1 具有docker環境的centos7

yum install docker

service docker start

2 mysql鏡像5.7或5.7.28(更高版本主從複製配置不同)

docker pull mysql:8.0

 

二 mysql集羣配置文件

1  創建配置集結構如下

 

mkdir  /docker/mysql/data/master    MySQL主庫數據位置

mkdir  /docker/mysql/data/slave MySQL從庫數據位置

mkdir  /docker/mysql/master MySQL主庫配置文件

mkdir  /docker/mysql/slave MySQL主庫配置文件

2 創建節點配置文件(master.cnf與slave.cnf)

cd /docker/mysql/master

vim master.cnf

cd /docker/mysql/slave

vim slave.cnf

主庫內容如下

 

[mysqld]

user=mysql

character-set-server=utf8

lower_case_table_names = 1

#開啓二進制日誌   名字爲日誌文件的名字隨便填即可

log_bin=master1_log

#開啓主從在局域網內應該有唯一的server_id  1~255

server_id=1

binlog_format="mixed"



[client]

default-character-set=utf8



[mysql]

default-character-set=utf8

從庫內容如下

[mysqld]

user=mysql

character-set-server=utf8

lower_case_table_names = 1

server_id=2



[client]

default-character-set=utf8



[mysql]

default-character-set=utf8

 

 

 

三、搭建mysql環境

創建mysql容器

從dockerhub拉去一個5.7.28或者5.7的鏡像

Docker pull mysql:5.7.28

創建從庫容器

docker run --privileged=true --name mysqlslave -p 3340:3306 -v /docker/mysql/slave/slave.cnf:/etc/mysql/my.cnf -v /docker/mysql/data/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.28

創建主庫容器

docker run --privileged=true --name mysqmaster -p 3339:3306 -v /docker/mysql/master/master.cnf:/etc/mysql/my.cnf -v /docker/mysql/data/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.28

 

*根據實際情況修改路徑

 

--privileged=true #賦予權限

--name #別名

-p #端口映射

-v #容器數據卷my.cnf爲配置文件

MYSQL_ROOT_PASSWORD        #mysql數據庫的賬號密碼

 

查看運行狀態

 

docker ps -a

全部在運行狀態就是正常的

 

主庫從庫賦權

主庫

查看容器局域網

docker network inspect bridge

 

可以看到容器局域網內的連接信息

遠程連接主庫mysql

Mysql -uroot -proot -h 127.18.0.3       ##-u數據庫賬號  -p數據庫密碼 -h 數據庫局域網ip地址

 

如果連接不上可以用navicat連接

 

然後右鍵連接-------->命令列界面

Grant replication slave on  *.*  root@172.18.0.3 identified by ‘root’

grant replication slave on *.* to '用戶名'@'ip' identified by '密碼';#授權給從服務器,單個數據庫授權無效,必須設置*.*   ip是從庫的內網ip

輸入show master status;

 

從庫

遠程連接從庫mysql

在命令列界面輸入

mysql> change master to

    -> master_host='ip',     #主庫的內網ip

    -> master_user='root', #主庫登陸賬號

    -> master_password='root', #主庫登錄密碼

-> master_log_file='master1_log.000003',  #與主庫binlog日誌名相同

-> master_log_pos=1908;    #偏移量,與主庫相同 

然後運行

start slave;

擴展配置不需要加

Log_slave_update   記錄從庫更新,允許鏈式複製(a-b-c)

Relay_log=dbsvr2-relay-bin指定中繼日誌文件名

Replicate_do_db=mysql僅複製指定庫,其他庫將被忽略,此選項可設置多條

Replicate_ignore_d=test   不復制哪些庫,其他庫將被忽略

輸入show slave status\G找到

Slave_IO_Running: Yes 
Slave_SQL_Running: Yes

即主從同步成功

如果有一個爲no即同步失敗

下面介紹兩種解決方法: 
方法一:忽略錯誤後,繼續同步 
該方法適用於主從庫數據相差不大,或者要求數據可以不完全統一的情況,數據要求不嚴格的情況 
解決: 
stop slave; 
#表示跳過一步錯誤,後面的數字可變 
set global sql_slave_skip_counter =1; 
start slave; 
之後再用mysql> show slave status\G 查看: 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 
ok,現在主從同步狀態正常了。。。 

方式二:重新做主從,完全同步 
該方法適用於主從庫數據相差較大,或者要求數據完全統一的情況 
解決步驟如下: 
1.先進入主庫,進行鎖表,防止數據寫入 
使用命令: 
mysql> flush tables with read lock; 
注意:該處是鎖定爲只讀狀態,語句不區分大小寫 
2.進行數據備份 
#把數據備份到mysql.bak.sql文件 
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql 
這裏注意一點:數據庫備份一定要定期進行,可以用shell腳本或者python腳本,都比較方便,確保數據萬無一失 
3.查看master 狀態 
mysql> show master status; 
+-------------------+----------+--------------+-------------------------------+ 
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+-------------------+----------+--------------+-------------------------------+ 
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema | 
+-------------------+----------+--------------+-------------------------------+ 
1 row in set (0.00 sec) 
4.把mysql備份文件傳到從庫機器,進行數據恢復 
#使用scp命令 
[root@server01 mysql]# scp mysql.bak.sql [email protected]:/tmp/ 
5.停止從庫的狀態 
mysql> stop slave; 
6.然後到從庫執行mysql命令,導入數據備份 
mysql> source /tmp/mysql.bak.sql 
7.設置從庫同步,注意該處的同步點,就是主庫show master status信息裏的| File| Position兩項 
change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260; 
8.重新開啓從同步 
mysql> stop slave; 
9.查看同步狀態 
mysql> show slave status\G 查看: 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 

 

 

驗證主從

主庫創建任何數據,從庫隨即更新!

 

結構模式-----各種不同的結構模式上面的爲一主一從(多從)

--結構模式

基本應用

單向複製:主-->從

擴展應用

鏈式複製:主-->從-->從   #主從從

互爲主從:主<-->主   #不能同時被訪問,不能單獨使用

一主多從:從<--主-->從

1)一主多從

[root@mysql-51 ~]# mysqldump -uroot -p123456 db1 > db1.sql

[root@mysql-51 ~]# scp db1.sql 192.168.4.53:/root

mysql> create database db1;    #53主機

mysql> source /root/db1.sql;    #可以直接執行sql語句

[root@mysql-53 ~]# mysql -uroot -p123456 db1 <  db1.sql

[root@mysql-53 ~]# vim /etc/my.cnf

[mysqld]

server_id=53

[root@mysql-53 ~]# systemctl restart mysqld

mysql> change master to

    -> master_host="192.168.4.51",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file="master51.000005",

    -> master_log_pos=574;

mysql> start slave;

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.4.51

                  Master_User: repluser

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master51.000005

          Read_Master_Log_Pos: 574

               Relay_Log_File: mysql-53-relay-bin.000002

                Relay_Log_Pos: 319

        Relay_Master_Log_File: master51.000005

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

2)主從從

#延續上面的實驗

[root@mysql-52 mysql]# vim /etc/my.cnf   #設置52即爲從又爲主庫

[mysqld]

log_bin=master52

binlog_format="mixed"

server_id=52

Log_slave_updates                           #記錄從庫更新,允許鏈式複製

[root@mysql-52 mysql]# systemctl restart mysqld

mysql> show master status\G;

*************************** 1. row ***************************

             File: master52.000001

         Position: 154

     Binlog_Do_DB:

 Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

mysql> grant replication slave on *.* to repluuser@'%'

    -> identified by '123456';

配置53的主庫是52

mysql> change master to

    -> master_host="192.168.4.52",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file='master52.000001',

    -> master_log_pos=442;

mysql> start slave;

注意:

Slave-io線程讀取主庫中binlog日誌放入中繼日誌(relay-log),slave-sql線程在執行中繼日誌的語句時是不寫入binlog日誌中,需要添加Log_slave_updates才能寫入binlog日誌中

3)互爲主從

主機54:

[root@mysql-54 ~]# vim /etc/my.cnf

[mysqld]

log_bin=master54

server_id=54

binlog_format="mixed"

[root@mysql-54 ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to masteruser@'%' identified by '123456';

mysql> show master status\G;

*************************** 1. row ***************************

             File: master54.000001

         Position: 443

....

mysql> change master to \

    -> master_host='192.168.4.55',

    -> master_user='masteruser2',

    -> master_password='123456',

    -> master_log_file='master55.000001',

    -> master_log_pos=444;

mysql> start slave;

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.4.55

                  Master_User: masteruser2

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master55.000001

          Read_Master_Log_Pos: 444

               Relay_Log_File: mysql-54-relay-bin.000002

                Relay_Log_Pos: 319

        Relay_Master_Log_File: master55.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

主機55:

[root@mysql-55 ~]# vim /etc/my.cnf

[root@mysql-55 ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to masteruser2@'%' identified by '123456';

mysql> show master status\G;

*************************** 1. row ***************************

             File: master55.000001

         Position: 444

.....

mysql> change master to\

    -> master_host="192.168.4.54",

    -> master_user="masteruser",

    -> master_password="123456",

    -> master_log_file='master54.000001',

    -> master_log_pos=443;

mysql> start slave;

mysql> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.4.54

                  Master_User: masteruser

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master54.000001

          Read_Master_Log_Pos: 595

               Relay_Log_File: mysql-55-relay-bin.000002

                Relay_Log_Pos: 471

        Relay_Master_Log_File: master54.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章