1. 程式人生 > >mysql叢集技術:主從複製,讀寫分離

mysql叢集技術:主從複製,讀寫分離

伺服器端讀寫分離的具體技術

1: 資料庫叢集技術

叢集由 3 個概念

  1. sql 節點 sql node
  2. 資料節點 data node
  3. 管理節點 ndb managerment

Sql 語句傳送 “1sql 節點 “, “1sql” 節點發往 “2 資料節點 “, 再由 3 管理節點完成資料節點的之間的同步 .

叢集技術相對複雜 , 至少有 3 種節點 ,4 臺伺服器才能完成 .

2: 資料庫複製 replication

Created with Raphaël 2.1.0主庫168主庫168從庫166從庫166嘿,哥們,我這邊有更新,你那邊也更新一下吧
資料庫複製 replication 的實現原理
  1. 主伺服器凡執行語句 , 都產生一個二進位制日誌 binlog

  2. 從伺服器不斷讀取主伺服器的 binlog

  3. 從主服務讀取到的 binlog, 轉換為自身可執行的 relaylog,

  4. 執行 relaylog

實現步驟 :
  1. 首先確保主伺服器開啟二進位制日誌功能 .這樣 , 主伺服器一旦有資料變化 , 立即產生二進位制日誌 .

  2. 從伺服器也需要開啟二進位制日誌和 relay 日誌功能 .這樣可以從主伺服器讀取 binlog, 併產生 relaylog

  3. 在主伺服器建立一個從伺服器的賬號 , 並授予數得上許可權 .

  4. 指定從服務對應的主伺服器 , 開啟從伺服器 .

具體實施

本人虛擬機器下有兩臺 linux,IP 為 168

1. 166 做從伺服器

2. 168 做為主伺服器 .

3. 保證主從 3306 埠互通 .

配置主伺服器

4. 配置主伺服器 168, 開啟 binlog

檢視mysql主伺服器狀態 是否配置

MariaDB [mysql]> show master status;
Empty set (.00 sec)
vim /etc/my.cnf
...
...
...
# 給伺服器起一個唯一的 id
server-id=168
 # 開啟二進位制日誌
log-bin=mysql-bin
# 指定日誌格式 有mixed|row|statement 推薦mixed
binlog-format=mixed

重啟 mysql

[root@localhost ~]# service mysqld restart

檢視mysql主伺服器狀態 是否配置 結果已經能夠充當 master 伺服器

MariaDB [mysql]> show master status ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |        0 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

5. 在主伺服器上建立相應的複製賬號

MariaDB [mysql]> grant replication slave,replication client on *.* to [email protected]'192.168.%.%' identified by '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

配置從伺服器

6. 配置從伺服器開啟 binlog 和 relaylog

檢視mysql從伺服器狀態 是否配置

MariaDB [mysql]> show slave status;
Empty set (.00 sec)
vim /etc/my.cnf
...
...
...
# 給伺服器起一個唯一的 id
server-id=166
# 開啟二進位制日誌
log-bin=mysql-bin
# 指定中繼日誌的位置和命名
relay_log=mysql-relay
# 允許從庫將其重要的事件也記錄到自身的二進位制日誌中
log_slave_updates=1
# 指定只讀
read-only=1

重啟 mysql

[root@localhost ~]# service mysqld restart

7. 在從伺服器通過語句指定要複製的主伺服器 ( 注意 , 可以一主多從 , 不可一從多主 ).

master_log_file對應主伺服器 show master status中的File
master_log_pos對應主伺服器 … status中的position

MariaDB [mysql]> change master to
master_host='192.168.1.168',
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=0;
Query OK, 0 rows affected (0.00 sec)

8. 啟動從伺服器功能

MariaDB [mysql]> start slave;

9. 檢視從庫狀態

MariaDB [mysql]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.166
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 0
               Relay_Log_File: mysql-relay.000001
                Relay_Log_Pos: 0
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ...           
            ... 
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)

9. 測試 .

常用語句 :
#檢視 master 的狀態 ,  尤其是當前的日誌及位置
show master status ;

#檢視 slave 的狀態 .
show slave status;

#重置 slave 狀態 .
reset slave ;

#啟動 slave  狀態 ( 開始監聽 msater 的變化 )
start slave ;

#暫停 slave 狀態 ;
stop slave;
主伺服器的日誌格式用哪種好 ?

有 statement,row, mixed 3種 , 其中 mixed 是指前 2 種的混合 。

  1. insert into xxtable values (x,y,z) 為例 ,
    影響 : 1 行 , 且為新增 1 行 , 對於其他行沒有影響 .
    這個情況 , 用 row 格式 , 直接複製磁碟上 1 行的新增變化 。

  2. update xxtable set age=21 where name='sss';
    這個情況 , 一般也只是影響 1 行 . 用 row 也比較合適 。

  3. 以過年發紅包 , 全公司的人 , 都漲薪 100 元 .
    update xxtable set salary=salary+100;
    這個語句帶來的影響 , 是針對每一行的 , 因此磁碟上很多 row 都發生了變化 。
    此處 , 適合就 statment 格式的日誌 。

總結
2 種日誌 , 各有各的高效的地方 ,mysql 提供了 mixed 型別 。
可以根據語句的不同 , 而自動選擇適合的日誌格式 .

除錯

配置mysql的master/slave時,經常會遇到Slave_IO_Running: No

這時可通過以下方法來處理:

方法一: (重置slave)

slave stop;

reset slave;

slave start;

方法二

MariaDB [mysql]> slave stop;
MariaDB [mysql]> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
MariaDB [mysql]> slave start;

方法三: (重設同步日誌件及位置)

1、檢視slave狀態

show slave status\G

            Master_Log_File: mysql-bin.000040
        Read_Master_Log_Pos: 4
             Relay_Log_File: mysqld-relay-bin.000001
              Relay_Log_Pos: 98
      Relay_Master_Log_File: mysql-bin.000040
           Slave_IO_Running: No
          Slave_SQL_Running: Yes

目前已同步到mysql-bin.000040這個日誌檔案,98的位置;

2、暫停slave

slave stop;

3、到主伺服器上檢視主機狀態:

MariaDB [mysql]> show master status ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1872 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

4、修改從服務同步日誌檔案及位置

日誌檔案及位置都改小;(之前是同步正常,最近才出現問題的,一般改小一個值就好)
如:

change master to master_log_file='mysql-bin.000004', master_log_pos=1872;

4、啟動slave

slave start;

5、再次確認slave狀態

show slave status\G

這時會發現:
Slave_IO_Running: Yes
且下述兩個值一直在不斷變化中:
Relay_Log_Pos: 998875
Relay_Master_Log_File: mysql-bin.000048

方法一、二不一定會有效果.方法三是強制性從某一個點開始同步,會有部分沒有同步的資料丟失,後續主伺服器上刪除記錄同步也會有一些錯誤資訊,不會影響使用.

複製過濾

主庫過濾

在主庫上使用選項 binlog_do_dbbinlog_ignore_db來控制過濾二進位制日誌。

# 只記錄test庫的二進位制日誌,可以配置多個
binlog_do_db = 'test'
# 不記錄mysql庫的二進位制日誌
binlog_ignore_db = 'mysql'

inlog_do_db和Binlog_ignore_db不僅可能會破壞複製,還可能會導致從某個時間點的備份進行資料恢復時失敗。在大多資料情況下都不應該使用這些引數。

從庫過濾

#要只想複製某個庫
replicate_do_db = 'db_name'

#要只想複製某張表
replicate_do_table = 'table_name'

#忽略複製某個庫
replicate_ignore_db
#忽略複製某張表
replicate_ignore_table

#複製 萬用字元 匹配指定庫的所有表
replicate_wild_do_table = db_name[%_]

#複製 除萬用字元 匹配指定庫外的所有表
replicate_wild_ignore_table = db_name[%_]


#告訴從伺服器如果預設資料庫(由USE所選擇)為主伺服器上的 from_name ,則翻譯為 to_name 。隻影響含有表
的語句(不是類似CREATE DATABASE、DROP DATABASE和ALTER DATABASE的語句),並且只有 from_name 為
主伺服器上的預設資料庫時。該選項不可以跨資料庫進行更新。
replicate_rewrite_db = from_name->to_name

從伺服器設定完成,重啟mysql伺服器,然後進入互動式模式,執行mysql> SHOW SLAVE STATUS\G
檢視Replicate_Do_DB這一欄位,即可驗證配置是否生效

問題

但實際上它不會根據目標資料庫名過濾,過濾的是當前的預設資料庫(如果使用的是基於語句的複製,就會有這樣的問題,但基於行的複製方式則不會)

Mysql>USE test;
Mysql>DELETE FROM sakila.file

*_do_db和*_ignore_db都會在資料庫test上過濾DELETE語句,而不是在sakila上。這通常不是想要的結果,可能會導致執行或忽略錯誤的語句。

總結:Statement-based跟當前use的庫有關,Row-based更直接,只關心指定的庫‘做或不做’。

除replicate-wild-do-table=/replicate-wild-ignore-table=外,其他過濾規則會受到“binlog_format”以及“當前所在庫”的影響(即所謂的跨庫問題)

相關推薦

mysql叢集技術主從複製分離

伺服器端讀寫分離的具體技術 1: 資料庫叢集技術 叢集由 3 個概念 sql 節點 sql node 資料節點 data node 管理節點 ndb managerment Sql 語句傳送 “1sql 節點 “, “1sq

mysql叢集主從複製通過mysql-proxy做負載均衡

mysql叢集架構方式很多,根據不同的需求做不一樣的架構,簡單一點的就是mysql的replication,也就是Mysql的複製功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多個分層,那麼現在我所要說的是mas

SpringBoot微服務 +tomcat叢集+Ngnix負載均衡+Mysql主從複製分離(4)

四:mysql主從複製,讀寫分離 1.首先把mysql原始碼包檔案拷到兩臺linux伺服器上,然後在兩臺伺服器上安裝Mysql資料庫 安裝 MySQL 1 安裝 ncurses Ncurses 提供字元終端處理庫,包括面板和選單。它提供了

Redis叢集主從複製分離(上)(五)

前言:隨著web2.0的進一步發展,網民的生產力進一步提升,儲存總量開始增加。 此時雖然仍然是讀多寫少的模式,但寫入量已經大大提升。 原有的快取技術不能緩解寫入壓力,而且原有的空間也受硬碟限制,因此開始出現分庫分表,實現讀寫分離。 集中模式的資料庫就這樣開始逐漸

Redis叢集主從複製分離(下)(六)

上一次呢我們講到了redis的叢集,還有redis的主從複製,讀寫分離的一些配置,那麼接下來就接著上次還未完結的內容 上一次呢講的是在正常的情況下redis服務在各個主機上的執行情況,那麼接下來就是要介紹不正常的情況了。 假如說我們的redis的主庫掛了或者

CentOS6.5搭建MySQL主從複製分離(冷月宮主親自整理最簡單明瞭)

CentOS6.5搭建MySQL主從複製,讀寫分離MySQL主從複製的優點:1、 如果主伺服器出現問題, 可以快速切換到從伺服器提供的服務,保證高可用性2、 可以在從伺服器上執行查詢操作, 降低主伺服器的訪問壓力3、 可以在從伺服器上執行備份, 以避免備份期間影響主伺服器的服

Redis主從複製分離主從切換

當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能。 redis提供了一個master,多個slave的服務。 準備三個redis服務,依次命名資料夾子maste

redis的主從複製分離主從切換

當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能。 redis提供了一個master,多個slave的服務。 準備三個redis服務,依次命名資料夾子master,slave1,slave2.這裡為在

redis的主從複製分離主從切換 哨兵

當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能。 redis提供了一個master,多個slave的服務。 準備三個redis服務,依次命

redis 主從複製分離

redis的主從複製,讀寫分離,可以避免單點故障,而且可以提高伺服器的負載能力. 可以簡單實現下面如圖所示的主從結構: A(master) / \ B(slave1) C(slave2) 1 開啟終端,開啟一個redis 服務程序,預

[mysql終極優化]之主從複製分離詳細設定教程

記下File及Position下的值。以備在配置從伺服器時使用。 注:File:當前binlog的檔名,每重啟一次mysql,就會生成一個新binlog檔案       Position:當前binlog的指標位置 三、從伺服器配置 1、配置mysql.cnf # vi /etc/my.cnf (1)修改

mysql+mycat搭建穩定高可用叢集負載均衡主備複製分離

資料庫效能優化普遍採用叢集方式,oracle叢集軟硬體投入昂貴,今天花了一天時間搭建基於mysql的叢集環境。 主要思路 簡單說,實現mysql主備複製-->利用mycat實現負載均衡。 比較了常用的讀寫分離方式,推薦mycat,社群活躍,效能穩定。 測試環境 MYSQL版

一步一圖搭建-分散式伺服器部署之mysql叢集-主從複製分離

傳統專案模型: 1.傳統的裝置搭建時,如果採用單臺伺服器.則會出現很多的問題.如果伺服器出現宕機/斷電/硬體裝置的損壞,都會直接影響使用者體驗. 2.如果傳統專案中遇到了高併發的情況.單臺伺服器不足以支援 分散式的處理: 傳統資料庫中存在

mysql主從配置分離

忽略 數據緩存 get 抓狂 mysql主從配置 sudo ignore win8.1 這不 Mysql主從配置,實現讀寫分離 大型網站為了軟解大量的並發訪問,除了在網站實現分布式負載均衡,遠遠不夠。到了數據業務層、數據訪問層,如果還是傳統的數據結構,或者只是單單靠一

MySQL高可用--主從複製分離

一、Mysql高可用概念  二、MySQL主從複製原理  叢集目的,減輕單臺伺服器壓力 三、MySQL主從複製配置 實際操作mysql伺服器叢集,主從複製的過程 master   192.168.230.128 slav

使用Mycat實現Mysql資料庫的主從複製分離、分表分庫、負載均衡和高可用

Mysql叢集搭建 使用Mycat實現Mysql資料庫的主從複製、讀寫分離、分表分庫、負載均衡和高可用(Haproxy+keepalived),總體架構:   說明:資料庫的訪問通過keepalived的虛擬IP訪問HAProxy負載均衡器,實現HAProxy的高可用,HAProxy用於實

mysql開啟bin-log日誌實習主從配置分離

一、什麼是主從複製 至少兩臺資料庫伺服器,可以分別設定主伺服器和從伺服器,對主伺服器的任何操作(更新)都會同步到從伺服器上 二、實現原理 mysql中有一種日誌,叫做bin日誌(二進位制日誌),會記錄下所有修改過資料庫的sql語句

MySQL主從複製分離

一、主從複製 1.伺服器資訊:主伺服器:192.168.48.4   從伺服器:192.168.48.5  均已安裝mysql 2.配置主伺服器中的 /etc/my.cnf 檔案,設定伺服器id和開啟日誌功能。設定完後儲存。進入mysql客戶端,通過show VARIAB

【Mycat】資料庫效能提升利器(三)——Mycat實現Mysql主從複製分離

一、前言       在前一篇文章中,小編向大家 介紹了使用Mycat水平切分資料庫。可以說,使用了水平分庫後,資料庫提升還是很高的。如果想更高的提高資料庫效能,就可以考慮對Mysql進行主從複製和讀寫分離了。       在這篇部落格中,小編就向大家介紹基於Mycat的M

部署MySQL主從複製分離

一、實驗壞境 1.一臺CentOS 7作為客戶端測試,對應的地址為:192.168.80.1202.一臺CentOS 7作為Amoeba前端代理伺服器,對應的地址為:192.168.80.1103.一臺CentOS 7作為mysql主伺服器,對應的地址為:192.168.80.1004.兩臺CentOS 7