---------------------------------目錄----------------------------------
前期扯淡:mysql主從復制和集群區別
一、 Mysql數據庫主從復制一主一從
二、 Mysql數據庫主從復制雙主雙從
-----------------------------------------------------------------------
哈哈!歡迎你的到來,俗話說磨刀不誤砍柴工,來吧,咱們先看看Mysql的主從復制和集群概念的區別。
MySQL集群是一個無共享的(shared-nothing)、分布式節點架構的存儲方案,其目的是提供容錯性和高性能。
集群所涉及到的三個概念:
SQL節點(多個):應用程序和數據節點的一個橋梁,應用程序不能直接訪問數據節點,只能先訪問SQL節點,然后SQL節點再去訪問數據節點來返回數據,Cluster中可以有多個SQL節點,通過每個SQL節點查詢到的數據都是一致的,一般來說,SQL節點越多,分配到每個SQL節點的負載就越小,系統的整體性能就越好;
數據節點(多個):用於存儲數據,數據存放內存中,數據節點中數據保存后自動復制並存儲到其他節點,數據節點之間采用的是同步復制來保證各節點之間的數據一致性
管理節點(一個):主要負責管理數據節點和SQL節點,還有集群配置文件和集群日志文件。它監控其他節點的工作狀態,能夠啟動、關閉或者重啟某個節點。其他節點從管理節點檢索配置數據,當數據節點有新事件就把事件信心發送給管理節點並寫入集群日志。
同步復制流程:
a) Master執行提交語句時,事務被發送到Slave,Slave開始准備事務的提交。
b) 每個slave都要准備事務,然后向Master發送OK(或ABORT)消息,表明事務已經准備好(或者無法准備該事務)。
c) Master等待所有Slave發送OK或ABORT消息,如果Master收到所有Slave的OK消息,它就會向所有Slave發送提交消息,告訴Slave提交該事務;如果 Master收到來自任何一個Slave的ABORT消息,它就向所有 Slave發送ABORT消息,告訴Slave去中止事務。
e) 每個Slave等待來自Master的OK或ABORT消息。如果Slave收到提交請求,它們就會提交事務,並向Master發送事務已提交 的確認;如果Slave收到取消請求,它們就會撤銷所有改變並釋放所占有的資源,從而中止事務,然后向Masterv送事務已中止的確認。
f) Master收到來自所有Slave的確認后,就會報告該事務被提交(或中止),然后繼續進行下一個事務處理。
由於同步復制一共需要4次消息傳遞,故mysql cluster的數據更新速度比單機mysql要慢。所以mysql cluster要求運行在千兆以上的局域網內,節點可以采用雙網卡,節點組之間采用直連方式。
主從復制是通過Mysql的Replication來保證數據的一致性。相對Mysql Cluster的異步數據同步方式。
Replication:首先主從服務器必須設置一個唯一的服務器id(局域網內唯一);其中主節點要開啟binlog日志功能,binlog記錄了master上的所有操作,同時也會被復制到從節點的Relaylog上,並在從節點上binlog回放執行。操作流程入下圖所示:
主從復制的日志記錄類型
基於SQL語句的復制(statement):在Master上執行的SQL語句,在Slave根據主機系統時間去執行同樣的語句。SQL執行同步根據系統時間來確定,MySQL默認采用基於語句的復制,效率比較高。弊端:SQL在主機執行和從機執行時間不一致,導致數據不一致。
基於行的復制(row):把改變的數據內容復制到Slave,而不是把命令在Slave上執行一遍。從MySQL5.0開始支持。弊端:如果執行一天update語句,影響1000萬行,那么需要在從庫執行1000萬次,效率太低。
混合類型的復制(mixed):默認采用基於SQL語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。弊端:是不能識別@@host name 系統變量,同時每太主機的系統變量都不一致導致數據不一致。
一、 Mysql數據庫主從復制一主一從
1、拉取鏡像
登錄docker 鏡像官網搜索mysql,找到制定的版本拉去,這里使用mysql5.7.30,版本查找文檔:Linux Centos7(Mac) 安裝Docker教程
docker pull mysql:5.7.30
2、查看docker的鏡像
docker images
3、創建容器本地映射文件,目的持久化數據。
master文件夾與文件准備,my.cnf文件重點關注屬性server_id、log_bin、binlog_format、binlog_do_db、binlog_ignore_db.
mkdir -p /root/mysql/master/data /root/mysql/master/logs /root/mysql/master/conf touch /root/mysql/master/conf/my.cnf
在主節點的my.cnf配置文件中添加一下內容
[mysqld] server_id = 1 # 唯一標識,主庫從庫不能重復 log_bin = mysql-bin # 開啟日志 binlog_format=STATEMENT # 日志記錄的格式類型 # max_binlog_size = 512M # 單個日志文件最大 # # expire_logs_day = 3 # 日志有效期(天) # # binlog_do_db = test1,test2 # 日志記錄(同步復制)那些數據庫 # # binlog_ignore_db = mysql,performance_schema,information_schema # 日志記錄忽略那些數據庫的
slave文件夾與文件准備
mkdir -p /root/mysql/slave/data /root/mysql/slave/logs /root/mysql/slave/conf touch /root/mysql/slave/conf/my.cnf
在slave的my.cnf文件寫入下面配置
[mysqld] server_id = 2 # 數據庫唯一id,內網唯一 log_bin = mysql-bin # 開啟日志,如果從庫還會用做主庫,建議配置 binlog_format=STATEMENT # 日志記錄的格式類型 # max_binlog_size = 512M # 單個日志文件最大 # # expire_logs_day = 3 # 日志有效期(天) # # replicate_do_db = test1,test2 # 是在slave上配置,指定slave要復制哪個庫 # # replicate-ignore-db=mysql,performance_schema,information_schema # 是在slave上配置,指定slave要忽略哪個庫 # relay_log_recovery = 1 # 從庫建議開啟,有利於數據一致性 # log_slave_updates = 1 # 如果從庫還會用做主庫,建議開啟
4、創建master主機容器,啟動服務。
首先創建容器並啟動:
docker run -p 3306:3306 --name mysqlMaster \ -v /root/mysql/master/conf:/etc/mysql/conf.d \ -v /root/mysql/master/logs:/var/log/mysql \ -v /root/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.30
然后查看是否啟動 docker ps:
接着登錄master節點容器:
docker exec -it mysqlMaster /bin/bash
同時在master容器中執行以下SQL,創建用戶授權,四步完成:登錄mysql、創建用戶、賬號授權、刷新動態生效。mysql-管理命令【創建用戶、授權、修改密碼、刪除用戶和授權、忘記root密碼】
mysql -uroot -proot
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT ALL ON *.* TO 'slave'@'%';
GRANT ALL ON *.* TO 'slave'@'%';
flush privileges;
最后查看master的數據庫狀態,File 是記錄的二進制文件名,Position偏移位置,從庫會用到。還有需要復制的數據庫和不需要忽略的數據庫
show master status;
另開一個遠程連接窗口,查看master容器ip地址,從庫會用到:
docker inspect mysqlMaster|grep IPAddress
5、創建slave主機容器、並啟動(注意本地防火牆哦!)
匯總master節點信息
然后啟動創建slave庫的容器並啟動:
docker run -p 3305:3306 --name mysqlSlave \ -v /root/mysql/slave/conf:/etc/mysql/conf.d \ -v /root/mysql/slave/logs:/var/log/mysql \ -v /root/mysql/slave/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.30
登錄從庫容器
docker exec -it mysqlSlave /bin/bash
登錄從庫mysql服務器
mysql -uroot -proot
在slave從庫中進行配置從庫主從信息,如下命令為解釋,操作如下圖
change master to 開啟配置主從信息 -> master_host='172.18.0.2', 指定主節點ip -> master_port=3306, 指定主節點端口 -> master_user='slave', 登錄主節點拉去二進制文件的用戶名 -> master_password='123456', 用戶密碼 -> master_log_file='mysql-bin.000001', 二進制文件名,對應File字段 -> master_log_pos=154; 二進制偏移位置對應Position偏移位置
啟動slave線程,如果配置錯誤輸入stop slave; 然后重新錄入一遍上一步命令
start slave;
查看salve數據庫狀態,如果
show slave status \G;
6主從驗證
在主庫創建數據庫
CREATE SCHEMA `test1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
在從庫中查看:
二、 Mysql數據庫主從復制雙主雙從
雙主雙從主要是my.cof配置和雙主復制的命令不同,mysql默認的自增開始和自增的步長不同
master節點1的配置
[mysqld] server-id=1 log-bin=mysql-bin
#binlog-do-db指定同步的庫名,建議使用binlog-ignore-db忽略某些庫 binlog-do-db=mycat_m_s binlog_format=STATEMEN log-slave-updates auto-increment-increment=2 auto-increment-offset=1
master節點2配置
[mysqld] server-id=3 log-bin=mysql-bin
#binlog-do-db指定同步的庫名,建議使用binlog-ignore-db忽略某些庫
binlog-do-db=mycat_m_s
binlog_format=STATEMEN
log-slave-updates
auto-increment-increment=2
auto-increment-offset=2
雙主復制的命令
#主機2復制主機1命令 change master to master_host='192.168.220.102', master_port=3307, master_user='slave', master_password='123456', master_log_file='mysql-bin.000005', master_log_pos=333, master_connect_retry=60; #主機1復制主機2命令 change master to master_host='192.168.220.102', master_port=3309, master_user='slave', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=443, master_connect_retry=60;
然后啟動主庫的從庫
start slave
具體操作參看這位大佬的記錄吧:Docker安裝Mysql,並搭建一主一從復制集群,一主雙從,雙主雙從集群
Docker(部署常見應用):Docker安裝MySql完整教程、實操
Docker實現Mysql主從復制實戰(一主一從、雙主雙從)
mysql 5.8以上版本有問題可以參考: