目錄
2 創建節點配置文件(master.cnf與slave.cnf)
結構模式-----各種不同的結構模式上面的爲一主一從(多從)
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: