mysql叢集技術:主從複製,讀寫分離
伺服器端讀寫分離的具體技術
1: 資料庫叢集技術
叢集由 3 個概念
- sql 節點 sql node
- 資料節點 data node
- 管理節點 ndb managerment
Sql 語句傳送 “1sql 節點 “, “1sql” 節點發往 “2 資料節點 “, 再由 3 管理節點完成資料節點的之間的同步 .
叢集技術相對複雜 , 至少有 3 種節點 ,4 臺伺服器才能完成 .
2: 資料庫複製 replication
資料庫複製 replication 的實現原理
主伺服器凡執行語句 , 都產生一個二進位制日誌 binlog
從伺服器不斷讀取主伺服器的 binlog
從主服務讀取到的 binlog, 轉換為自身可執行的 relaylog,
執行 relaylog
實現步驟 :
首先確保主伺服器開啟二進位制日誌功能 .這樣 , 主伺服器一旦有資料變化 , 立即產生二進位制日誌 .
從伺服器也需要開啟二進位制日誌和 relay 日誌功能 .這樣可以從主伺服器讀取 binlog, 併產生 relaylog
在主伺服器建立一個從伺服器的賬號 , 並授予數得上許可權 .
指定從服務對應的主伺服器 , 開啟從伺服器 .
具體實施
本人虛擬機器下有兩臺 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 種的混合 。
以
insert into xxtable values (x,y,z)
為例 ,
影響 : 1 行 , 且為新增 1 行 , 對於其他行沒有影響 .
這個情況 , 用 row 格式 , 直接複製磁碟上 1 行的新增變化 。以
update xxtable set age=21 where name='sss';
這個情況 , 一般也只是影響 1 行 . 用 row 也比較合適 。以過年發紅包 , 全公司的人 , 都漲薪 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_db
和binlog_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