成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL讀寫分離那些事,用Docker輕輕松松搞定

數據庫 MySQL
根據MySQL的官方文檔介紹,MySQL支持讀寫分離的集群配置,并且MySQL提供兩種類型的讀寫分離數據復制類型;一種是二進制日志文件方式的數據復制,另一種是Global Transaction Identifiers (GTIDs)。

 一個應用系統是否高可用,整個系統的效率是否滿足預期,往往受到多方面的制約因素,例如:運行環境,網絡環境以及數據的吞吐量等;作為一般的大型應用系統來說,我們想要提升整個系統的效率,我們大多數情況下會從我們的后端數據庫做優化,從而提高我們整個系統的數據吞吐量,如果我們后端采用的是關系型數據,我們可能會想到兩種解決方案,一種是更換非關系型數據庫,這種方案代價比較昂貴,它會涉及到數據的遷移,以及程序代碼的修改;另一種是通過數據庫集群的方式,來橫向和縱向擴展我們的數據庫,這種方案容易實現并且程序代碼修改量比較小;

[[283981]]

根據MySQL的官方文檔介紹,MySQL支持讀寫分離的集群配置,并且MySQL提供兩種類型的讀寫分離數據復制類型;一種是二進制日志文件方式的數據復制,另一種是Global Transaction Identifiers (GTIDs)。

下面我們通過一個小實驗來看看MySQL數據基于二進制日志數據復制方式的主從集群是如何實現的。

OS環境:CentOS7

軟件環境:Docker(最新版),MySQL:latest鏡像

我們通過Docker容器快速的構建兩個MySQL數據庫服務器

  1. docker pull mysql 
  2. [root@dev01 ~]# docker images 
  3. REPOSITORY TAG IMAGE ID CREATED SIZE 
  4. mysql latest 62a9f311b99c 4 weeks ago 445MB 

可以看到我們已經拉取到最新的MySQL Docker容器,為了在本地環境中啟動兩個不同的MySQL Docker容器,我們需要通過修改容器的配置文件的方式來改變MySQL的配置;

首先,我們修改MySQL Master(主數據庫)的容器配置文件:

一,創建Master數據庫的配置文件

  1. vi master.cnf 
  2. [mysqld] 
  3. # master server id 
  4. server-id = 1 
  5.  
  6. # bin log 
  7. log_bin = mysql-master-bin 
  • server-id,在MySQL集群數據庫中,這個參數必須唯一
  • log_bin,MySQL采用二進制日志文件復制的文件名

二,將該配置文件拷貝到MySQL Docker容器中

  1. docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql 
  2. docker cp master.cnf fdb98bbd52b6:/etc/mysql/conf.d 

三,提交修改后的Docker容器

  1. docker commit -m "add master configure file" fdb98bbd52b6 mysql:master 
  2. [root@dev01 ~]# docker images 
  3. REPOSITORY TAG IMAGE ID CREATED SIZE 
  4. mysql master 345465966cb5 3 hours ago 445MB 
  • commit -m是修改容器后提交的信息,類似Git提交;
  • fdb98bbd52b6是剛才修改的容器;
  • mysql:master是我們為修改后的容器打上tag標簽master

接下來我們修改MySQL Slave(從數據庫)的容器配置文件

一,創建Slave數據庫的配置文件

  1. vi slave.cnf 
  2. [mysqld] 
  3. # slave server id 
  4. server-id = 2 
  5.  
  6. # bin log 
  7. log_bin = mysql-slave-bin 
  8. relay_log = mysql-relay-bin 
  9. log_slave_updates = 1 
  10. read_only = 1 
  • server-id為從數據庫的ID,該參數在MySQL集群中必須保持唯一性;
  • log_bin如果slave為其它slave的master,必須設置bin_log,在這里我們暫時開啟;
  • relay_log配置中繼日志
  • log_slave_updates表示slave將復制事件寫進自己的二進制日志(后面會看到它的用處);
  • read_only盡量使用read_only,它防止改變數據(除了特殊的線程);

二,將配置文件拷貝到容器中

  1. docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql 
  2. docker cp slave.cnf 8ee82abb2e91:/etc/mysql/conf.d 

三,提交修改后的Docker容器

  1. docker commit -m "add slave configure file" 8ee82abb2e91 mysql:slave 
  2. [root@dev01 ~]# docker images 
  3. REPOSITORY TAG IMAGE ID CREATED SIZE 
  4. mysql slave 3a53cd39ee45 4 hours ago 445MB 

到此,所需要的兩個MySQL容器已經修改完畢,并且保存在我們本地的容器倉庫中,接下來我們開始啟動剛才修改的兩個容器進行后續的配置

一,啟動Master數據庫

  1. docker run --name master -e MYSQL_ROOT_PASSWORD=root -d mysql:master 
  • --name master是我們為啟動的容器名;
  • mysql:master是我們剛才修改后并且提交到本地的Docker鏡像
  • 默認數據庫root的密碼設置為root

二,啟動Slave數據庫

  1. docker run --link master:master --name slave -e MYSQL_ROOT_PASSWORD=root -d mysql:slave 
  • 為了master容器與slave容器的網絡互通,我們添加了--line選項來連接到我們剛才啟動的名為master容器;
  • --name slave是我們為啟動的容器名;
  • mysql:slave是我們剛才修改后并且提交到本地的Docker鏡像;
  • 默認數據庫root的密碼設置為root

三,進入master容器中通過mysql命令進入數據庫

  1. docker exec -it master /bin/bash 
  2. mysql -u root -proot 

四,在master數據庫中創建用于復制數據的賬號,并且給該賬號相應的權限

  1. create user 'repl'@'%' identified by 'repl-pwd'
  2. grant replication slave on *.* to 'repl'@'%'
  3. flush privileges

五,查看master數據庫的狀態

  1. mysql> show master status; 
  2. +-------------------------+----------+--------------+------------------+-------------------+ 
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
  4. +-------------------------+----------+--------------+------------------+-------------------+ 
  5. | mysql-master-bin.000003 | 2743 | | | | 
  6. +-------------------------+----------+--------------+------------------+-------------------+ 
  7. 1 row in set (0.00 sec) 

六,進入slave容器中通過mysql命令進入數據庫

  1. docker exec -it slave /bin/bash 
  2. mysql -u root -proot 

七,配置slave,將master數據庫指向剛才配置好的master數據庫節點,并且啟動slave

  1. change master to master_host='master', master_user='repl', master_password='repl-pwd', master_log_file='mysql-master-bin.000003', master_log_pos=0; 
  2. start slave; 

八,查看slave數據庫狀態

  1. mysql> show slave status\G 
  2. *************************** 1. row *************************** 
  3.  Slave_IO_State: 
  4.  Master_Host: master 
  5.  Master_User: repl 
  6.  Master_Port: 3306 
  7.  Connect_Retry: 60 
  8.  Master_Log_File: mysql-master-bin.000003 
  9.  Read_Master_Log_Pos: 4 
  10.  Relay_Log_File: mysql-relay-bin.000001 
  11.  Relay_Log_Pos: 4 
  12.  Relay_Master_Log_File: mysql-master-bin.000003 
  13.  Slave_IO_Running: No 
  14.  Slave_SQL_Running: No 
  15.  Replicate_Do_DB: 
  16.  Replicate_Ignore_DB: 
  17.  Replicate_Do_Table: 
  18.  Replicate_Ignore_Table: 
  19.  Replicate_Wild_Do_Table: 
  20.  Replicate_Wild_Ignore_Table: 
  21.  Last_Errno: 0 
  22.  Last_Error: 
  23.  Skip_Counter: 0 
  24.  Exec_Master_Log_Pos: 4 
  25.  Relay_Log_Space: 155 
  26.  Until_Condition: None 
  27.  Until_Log_File: 
  28.  Until_Log_Pos: 0 
  29.  Master_SSL_Allowed: No 
  30.  Master_SSL_CA_File: 
  31.  Master_SSL_CA_Path: 
  32.  Master_SSL_Cert: 
  33.  Master_SSL_Cipher: 
  34.  Master_SSL_Key: 
  35.  Seconds_Behind_Master: NULL 
  36. Master_SSL_Verify_Server_Cert: No 
  37.  Last_IO_Errno: 2061 
  38.  Last_IO_Error: error connecting to master 'repl@master:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection
  39.  Last_SQL_Errno: 0 
  40.  Last_SQL_Error: 
  41.  Replicate_Ignore_Server_Ids: 
  42.  Master_Server_Id: 0 
  43.  Master_UUID: 
  44.  Master_Info_File: mysql.slave_master_info 
  45.  SQL_Delay: 0 
  46.  SQL_Remaining_Delay: NULL 
  47.  Slave_SQL_Running_State: 
  48.  Master_Retry_Count: 86400 
  49.  Master_Bind: 
  50.  Last_IO_Error_Timestamp: 190912 06:06:14 
  51.  Last_SQL_Error_Timestamp: 
  52.  Master_SSL_Crl: 
  53.  Master_SSL_Crlpath: 
  54.  Retrieved_Gtid_Set: 
  55.  Executed_Gtid_Set: 
  56.  Auto_Position: 0 
  57.  Replicate_Rewrite_DB: 
  58.  Channel_Name: 
  59.  Master_TLS_Version: 
  60.  Master_public_key_path: 
  61.  Get_master_public_key: 0 
  62.  Network_Namespace: 
  63. 1 row in set (0.00 sec) 

由于最新版的MySQL為了提升安全性更改了密碼校驗插件,在這里我們還是采用之前的密碼校驗插件,我們在master數據庫上用如下的命令來修改剛才在master數據庫創建的用戶

  1. alter user 'repl'@'%' identified by 'repl-pwd' password expire never; 
  2. alter user 'repl'@'%' identified with mysql_native_password by 'repl-pwd'
  3. flush privileges

九,再次查看slave狀態

  1. mysql> show slave status\G 
  2. *************************** 1. row *************************** 
  3.  Slave_IO_State: Waiting for master to send event 
  4.  Master_Host: master 
  5.  Master_User: repl 
  6.  Master_Port: 3306 
  7.  Connect_Retry: 60 
  8.  Master_Log_File: mysql-master-bin.000003 
  9.  Read_Master_Log_Pos: 2743 
  10.  Relay_Log_File: mysql-relay-bin.000002 
  11.  Relay_Log_Pos: 2971 
  12.  Relay_Master_Log_File: mysql-master-bin.000003 
  13.  Slave_IO_Running: Yes 
  14.  Slave_SQL_Running: Yes 
  15.  Replicate_Do_DB: 
  16.  Replicate_Ignore_DB: 
  17.  Replicate_Do_Table: 
  18.  Replicate_Ignore_Table: 
  19.  Replicate_Wild_Do_Table: 
  20.  Replicate_Wild_Ignore_Table: 
  21.  Last_Errno: 0 
  22.  Last_Error: 
  23.  Skip_Counter: 0 
  24.  Exec_Master_Log_Pos: 2743 
  25.  Relay_Log_Space: 3179 
  26.  Until_Condition: None 
  27.  Until_Log_File: 
  28.  Until_Log_Pos: 0 
  29.  Master_SSL_Allowed: No 
  30.  Master_SSL_CA_File: 
  31.  Master_SSL_CA_Path: 
  32.  Master_SSL_Cert: 
  33.  Master_SSL_Cipher: 
  34.  Master_SSL_Key: 
  35.  Seconds_Behind_Master: 0 
  36. Master_SSL_Verify_Server_Cert: No 
  37.  Last_IO_Errno: 0 
  38.  Last_IO_Error: 
  39.  Last_SQL_Errno: 0 
  40.  Last_SQL_Error: 
  41.  Replicate_Ignore_Server_Ids: 
  42.  Master_Server_Id: 1 
  43.  Master_UUID: f6e8062e-d521-11e9-9009-0242ac110008 
  44.  Master_Info_File: mysql.slave_master_info 
  45.  SQL_Delay: 0 
  46.  SQL_Remaining_Delay: NULL 
  47.  Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates 
  48.  Master_Retry_Count: 86400 
  49.  Master_Bind: 
  50.  Last_IO_Error_Timestamp: 
  51.  Last_SQL_Error_Timestamp: 
  52.  Master_SSL_Crl: 
  53.  Master_SSL_Crlpath: 
  54.  Retrieved_Gtid_Set: 
  55.  Executed_Gtid_Set: 
  56.  Auto_Position: 0 
  57.  Replicate_Rewrite_DB: 
  58.  Channel_Name: 
  59.  Master_TLS_Version: 
  60.  Master_public_key_path: 
  61.  Get_master_public_key: 0 
  62.  Network_Namespace: 
  63. 1 row in set (0.00 sec) 

我們主要查看Slave_IO_Running和Slave_SQL_Running,表示我們的slave數據庫節點已經成功的連接到了我們的master數據庫節點。

十,驗證,我們在master數據庫節點上創建一個空的數據庫

  1. mysql> create database data; 
  2. Query OK, 1 row affected (0.10 sec) 
  3.  
  4. mysql> show databases; 
  5. +--------------------+ 
  6. Database | 
  7. +--------------------+ 
  8. | data | 
  9. | information_schema | 
  10. | mysql | 
  11. | performance_schema | 
  12. | sys | 
  13. +--------------------+ 
  14. rows in set (0.01 sec) 

十一,驗證slave,查看剛才在master數據庫節點上創建的數據庫是否同步到slave數據節點

  1. mysql> show databases; 
  2. +--------------------+ 
  3. Database | 
  4. +--------------------+ 
  5. | data | 
  6. | information_schema | 
  7. | mysql | 
  8. | performance_schema | 
  9. | sys | 
  10. +--------------------+ 
  11. rows in set (0.01 sec) 

可以看到,我們剛才在master數據庫節點上創建的數據庫已經同步到我們的slave數據庫節點,master和slave的數據庫數據已經保持一致。

以上實驗我們選取了兩個數據庫(一主一從)的方式,在實際的應用中我們會根據我們的應用場景,slave數據庫節點也有可能被選擇作為主數據庫,這個時候slave數據庫節點就有可能是1到N個。

參考:

https://dev.mysql.com/doc/refman/5.7/en/replication.html

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2009-09-15 16:26:46

Linq排序

2010-01-14 16:10:21

C++開發

2010-01-15 10:14:21

C++ Builder

2010-08-30 09:27:20

2011-04-28 15:41:02

打印機卡紙

2010-03-01 17:32:21

Python 測試模塊

2010-03-03 18:13:23

Android組成框架

2017-10-27 12:00:28

MySQL數據庫優化

2010-01-26 14:53:43

C++

2009-11-09 15:41:14

WCF安全性

2009-11-10 15:44:17

VB.NET常量

2010-01-18 11:20:58

C++語言

2010-01-20 10:31:18

C++編程技術

2010-01-20 18:17:55

C++異常問題

2009-06-10 17:58:41

2015-09-22 10:31:11

2009-02-20 13:39:01

2009-11-11 09:31:44

ADO.NET事務處理

2012-01-05 10:23:33

IE9預訂火車票

2021-11-07 06:52:44

Windows 11操作系統微軟
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色伊人久久| 毛片免费看的 | 一区二区三区视频播放 | 亚洲高清在线观看 | 国产japanhdxxxx麻豆 | 久久天天躁狠狠躁夜夜躁2014 | 国产韩国精品一区二区三区 | 亚洲精品久久久久久国产精华液 | 亚洲3级 | 狠狠艹| 国产一区二区在线播放 | 亚洲成人在线免费 | 欧美精品一二三 | av黄色在线观看 | 99精品电影| 日韩久久久久久 | 一区二区中文字幕 | 中国美女一级黄色片 | 色综合久久久 | 日韩国产在线观看 | 亚洲v日韩v综合v精品v | 国产精品欧美一区二区 | 91爱爱·com | 欧美无乱码久久久免费午夜一区 | va在线 | 成人av影院| 欧美一级大片免费观看 | 国内精品久久久久久影视8 最新黄色在线观看 | 久久另类 | 男女免费视频网站 | 日韩在线不卡 | 成人毛片一区二区三区 | 日本一区二区在线视频 | 91精品国产91久久久久久 | 久草在线在线精品观看 | 久久伊人精品 | 国产欧美一区二区三区日本久久久 | 成人在线小视频 | 亚洲激情一区二区三区 | 综合久久综合久久 | 在线观看亚洲精品视频 |