這章來說說主從復制,對于主從復制,有很多知識,在以后分篇記錄,所以在這里只說說簡單的用法,用來入個門可以,先說啥是主從復制,主從復制就是將一臺主機的數據復制到另一臺或者多臺主機上,復制過程中一臺服務器充當主庫(Master),就是源數據存放的主機,還有一臺或者多臺服務器充當從庫(Slave),Mysql支持單向、雙向、鏈式級聯、異步復制,還有在5.5版本后的半同步復制等。
利用主從復制功能,我們可以做到在主庫發生意外時,讓從庫接管主庫,也能讓從庫分擔主庫的讀壓力,這一點,也可以看看以前關于Redis主從復制的介紹。
mysql主從切換步驟、
由于本次演示需要用到多個MySQL實例,可以使用Docker來做,但是貌似MySQL自身就可以配置多個實例,這一點不太清楚,沒有試過,所以還是使用Docker吧,關于Docker的安裝就不說了,下面說Docker中部署MySQL服務器。
(多說一句話,Docker真是個好東西,在上次團隊需要馬上運行一個服務端,需要數據庫,要把sql文件導入進去,由于版本的差異,這個只能在5.6版本下導入,我們電腦上的所有版本完美的避開了5.6,這時想起了Docker,敲了幾行命令,一個嶄新的MySQL5.6就出來了,最終成功把數據導入進去,救了急)
MySQL 主從。關于安裝Docker,看官方的一篇就夠了:
https://docs.docker.com/engine/install/ubuntu/
docker?pull?mysql/mysql-server:8.0
docker?run?-p?3307:3306?--name?mysql1?-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql/mysql-server:8.0
docker?run?-p?3308:3306?--name?mysql2?-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql/mysql-server:8.0
更多可以參考下面官網:
https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html
查看進程。
root@hxl-PC:/home/hxl#?docker?ps
CONTAINER?ID????????IMAGE????????????????????COMMAND??????????????????CREATED?????????????STATUS????????????????????PORTS???????????????????????????????NAMES
4f16b40cb2d4????????mysql/mysql-server:8.0???"/entrypoint.sh?mysq…"???5?hours?ago?????????Up?30?minutes?(healthy)???33060/tcp,?0.0.0.0:3308->3306/tcp???mysql2
80faae4d305b????????mysql/mysql-server:8.0???"/entrypoint.sh?mysq…"???6?hours?ago?????????Up?31?minutes?(healthy)???33060/tcp,?0.0.0.0:3307->3306/tcp???mysql1
root@hxl-PC:/home/hxl#?
修改master數據庫的配置文件,位置在/etc/my.cnf,可以在本地編輯好,然后使用docker cp
命令復制到里面。
mysql復制原理、server-id是唯一的,主從的不能一樣,如果沒有設置server_id或設置成0的話,從主機會無法連接。
log-bin是二進制日志名稱,服務器會將所有更改數據的語句記錄到二進制日志中,這個日志就可以實現備份和復制,但這個只是基本名稱,MySQL還會在這個名稱后面拼接一串數字來依次創建二進制日志文件。
[mysqld]
server-id=101
log-bin=mysql-bin
接下來要創建主從復制賬號,在從主機上會用到,還要把他賦予REPLICATION SLAVE特權,這個操作可以不使用命令行,如果您用的dbeaver的話,可以通過界面去創建。
mysql>?create?user?'bak'@'%'?identified?by?'123456';
Query?OK,?0?rows?affected?(0.03?sec)
mysql>?grant?replication?slave?on?*.*?to?'bak'@'%';
Query?OK,?0?rows?affected?(0.01?sec)
mysql>?flush?privileges;
Query?OK,?0?rows?affected?(0.01?sec)
mysql>?
關于主從復制賬號,可以查看官網:
https://dev.mysql.com/doc/refman/8.0/en/replication-howto-repuser.html
關于二進制日志配置選項,可以查看官網:
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html
mysql原理。最后查看master狀態,show master status
這個命令用于查看服務器的二進制日志文件的狀態信息,需要用的字段是Position,在配置從節點的時候,需要傳遞給他。
mysql>?show?master?status;
+------------------+----------+--------------+------------------+-------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|?Executed_Gtid_Set?|
+------------------+----------+--------------+------------------+-------------------+
|?mysql-bin.000003?|??????156?|??????????????|??????????????????|???????????????????|
+------------------+----------+--------------+------------------+-------------------+
1?row?in?set?(0.00?sec)
mysql>?
[mysqld]
server-id=101
最后在從庫中執行下面命令,注意修改主機地址、端口、日志文件,最后的start slave用于開始執行主從復制。
mysql>?change?master?to?master_host='10.204.27.177',master_user='bak',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=156,master_port=156,get_master_public_key=1;
Query?OK,?0?rows?affected,?2?warnings?(0.04?sec)
mysql>?start?slave;
Query?OK,?0?rows?affected?(0.01?sec)
mysql>?
查看狀態,當Slave_IO_Running和Slave_SQL_Running都是yes的話就代表配置成功了。\G
是格式化格式,否則會一團糟。
ysql>?show?slave?status\G;
***************************?1.?row?***************************
???????????????Slave_IO_State:?Waiting?for?master?to?send?event
??????????????????Master_Host:?10.204.27.177
??????????????????Master_User:?bak
??????????????????Master_Port:?3307
????????????????Connect_Retry:?60
??????????????Master_Log_File:?mysql-bin.000003
??????????Read_Master_Log_Pos:?746
???????????????Relay_Log_File:?4f16b40cb2d4-relay-bin.000002
????????????????Relay_Log_Pos:?324
????????Relay_Master_Log_File:?mysql-bin.000003
?????????????Slave_IO_Running:?Yes
????????????Slave_SQL_Running:?Yes
.......
mysql索引原理,這是兩個庫此時的初始化狀態。
現在在主庫中創建一個數據庫test。
在主庫中新增一張表。
CREATE?TABLE?`tb_user`?(
??`id`?int?NOT?NULL?AUTO_INCREMENT,
??`userName`?varchar(100)?NOT?NULL,
??PRIMARY?KEY?(`id`)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_0900_ai_ci;
數據庫主從復制的原理及作用?可以看到從庫也同步了,數據也都為空。
主庫插入一條數據。
首先主庫會在二進制日志里記錄了對數據庫的更改,從庫會從主庫中獲取這個二進制日志,然后在從庫中重放這部分日志,就實現了數據的同步。
MySQL會使用3個線程來執行復制功能,其中一個在主服務器上,另兩個在從服務器上。當從服務器執行start slave
命令時,從服務器會創建一個I/O線程,用于連接主服務器,并讓它發送二進制日志中的語句。
主服務器就會創建一個線程將二進制日志中的內容發送到從服務器中,從服務器中的I/O線程讀取主服務器線程發送的內容并將數據復制到本地文件中,也就是中繼日志,第3個線程就是SQL線程,是從服務器創建的,用于讀取中繼日志文件內容,并執行日志中所包含的更新。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态