mysql主從架構升級_實戰項目——mysql主從架構的實現

一主一從

1.1 環境準備:

centos系統服務器2臺、 一臺用戶做Mysql主服務器, 一臺用于做Mysql從服務器, 配置好yum源、 防火墻關閉、 各節點時鐘服務同步、 各節點之間可以通過主機名互相通信

1.2 準備步驟:

1)iptables -F && setenforce 清空防火墻策略,關閉selinux

2)拿兩臺服務器都使用yum方式安裝Mysql服務, 要求版本一致

3)分別啟動兩臺服務器mysql服務, 確保服務正常

架構圖:

6f2df8fd1a08d1c04e1785dd67d5c4ae.png

1.3 實現步驟:

1.3.1 配置master主服務器

對master進行配置,包括打開二進制日志,指定唯一的servr ID。例如,在配置文件加入如下值

server-id=1      //配置server-id,讓主服務器有唯一ID號

log-bin=mysql-bin  //打開Mysql日志,日志格式為二進制

skip-name-resolve  //關閉名稱解析,(非必須)

a9a770a7dbaca71f8618fed3c299a01a.png

1.3.2 創建復制帳號

在 Master 的數據庫中建立一個備份帳戶:每個 slave 使用標準的 MySQL 用戶名和密碼連接 master 。進行復制操作的用戶會授予 REPLICATION SLAVE 權限。

MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';

1.3.3 查看主服務器狀態

在 Master 的數據庫執行 show master status,查看主服務器二進制日志狀態及位置號。

3337dfc42b2603d4eda96afa0c9fac28.png

1.3.4 配置slave從服務器

對 slave 進行配置,打開中繼日志,指定唯一的 servr ID,設置只讀權限。在配置文件加入如下值:

server-id=2//配置server-id,讓從服務器有唯一ID號

relay_log = mysql-relay-bin //打開Mysql日志,日志格式為二進制

read_only = 1//設置只讀權限

log_bin = mysql-bin//開啟從服務器二進制日志

log_slave_updates = 1//使得更新的數據寫進二進制日志中

4ecc88ecc6e653178be3cf2113eda7e4.png

1.3.5 啟動從服務器復制線程

讓 slave 連接 master ,并開始重做 master 二進制日志中的事件。

MariaDB [(none)]> change master to master_host='192.168.37.111',

>master_user='slave',

>master_password='keer',

>master_log_file='mysql-bin.000001',

>master_log_pos=413;

執行start slave;,來啟動復制線程。

1.3.6 查看從服務器狀態

可使用SHOW SLAVE STATUS\G;查看從服務器狀態,如下所示,也可用show processlist \G;查看當前復制狀態:

Slave_IO_Running: Yes//IO線程正常運行

Slave_SQL_Running: Yes//SQL線程正常運行

6f65dbefc760c29236c744bd319ae248.png

1.3.7 測試

1)測試主從同步

我們在 master 服務器上創建一個數據庫,再使用該數據庫創建一個表,添加一條記錄,來看一看 slave 服務器有沒有同步成功。

首先,我們先來查看一下兩個服務器上有什么數據庫:

master:

fd3aafa4e29d58eb4c465eaeb9a42e15.png

slave:

dcad8d067b48cff7ed2fee5b501ab1cf.png

現在,我們在主服務器上創建一個數據庫“keer”:

b939b3ea83dc4af2fca2b029e4ceea74.png

然后,我們來看看從服務器是否已經更新:

c435b37c7e0b743e419290f8b31c9cc5.png

我們可以看出,數據庫已經同步,接下來,我們就來創建表,并在表中插入一條記錄:

609ea3288d2b3db8fca29595aef0acfd.png

然后,我們來看看從服務器是否更新:

c919644835447d1ef8d48dbd8010a716.png

2)測試只讀屬性

我們在從服務器上設置了只讀,所以我們來試試看能不能插入數據:

97e3aee97631bab22a0bc8447f569d6a.png

這就很尷尬了,為什么我們設置只讀還是可以插入數據呢?這要如何解決呢?

因為我們登錄的時候使用的是root超級用戶,這個大變態是不受只讀設置影響的,所以,我們還是可以往里面去插入數據,當然,如果我們換成其他的普通用戶就不會出現這樣的問題了。

解決方式也很簡單,我們只需要把表鎖起來就可以了:

MariaDB [keer]> flush tables with read lock;

進行鎖表操作以后,我們再來插入一條數據:

63fdc6d58680a297bb372e03b6781e07.png

這樣的話,即使我們是超級用戶登錄進來的,也不能再插入數據了。這樣會安全很多。但是,有利就有弊,這樣的話,我們的主從就不能實時同步了,因為我們的主從同步是通過把主上的 sql 語句放在從上再執行一遍來實現的,可是我們鎖表的話,sql 語句就不能執行了。想要同步方法也很簡單,直接把表解鎖就可以了。

我們在主上插入一條數據:

29b4ec0c75c68fd1fb466d693d6f6011.png

此時,我們的從上就要解表以后才能實現同步:

c31e8e48a83b6772822a47f403548f39.png

1.4 擴展——實現一主多從

1.4.1 需求分析

當我們的服務器運行一段時間后,流量變得越來越多,這時,一主一從能夠實現的高可用性和負載均衡不能滿足我們的需求,我們就要選擇再添加一臺從服務器。

可是現在我們的 master 已經運行很久了,我們也需要對新安裝的 slave 進行數據同步,甚至它沒有 master 的數據。

此時,有幾種方法可以使 slave 從另一個服務開始,例如,從 master 拷貝數據,從另一個 slave 克隆,從最近的備份開始一個 slave 。為了加快 slave 與 master 同步,可用以下方式先進行數據同步:

(1)master的某個時刻的數據快照;

(2)數據庫的備份數據;

(3)master的二進制日志文件。

架構圖:

386011da05696b7f4dd04626e6bfac55.png

接下來,我們就來實現一下這個過程:

1.4.2 具體實現過程

1)對 master 進行完全備份

[root@master ~]# mkdir /backup

[root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql

照例查看一下主的二進制日志狀態及位置號。

b102aed50267dc92fd8d6f8c5f390fb2.png

2)把完全備份的數據發到新增的從上

[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~

root@192.168.37.133's password:

mysql-backup-2017-11-21-10:28:29-all.sql 100% 504KB 503.9KB/s 00:00

3)把這個完全備份導入從的數據庫:

013a706c50129dffe8a0774d48a2212c.png

4)查看從是否恢復成功:

93bb15d57d5ac81c14dba0bbc3b31a70.png

75983caf325801c98241236b4d825ad1.png

我們來查看一下從的二進制日志狀態及位置號:

8f4d7a945e1caf716d34731ee276c5e3.png

我們的數據已經恢復成功

5)設置主從

接下來就是按照上述步驟,對該從服務器進行設置就好:

[root@slave2 ~]# vim /etc/my.cnf

[mysqld]

server-id = 3

relay-log = mysql-relay-bin

read-only = 1

log-bin = mysql-bin

log-slave-updates = 1

然后,我們就來設置從服務器:

[root@slave2 ~]# mysql -uroot -p

Enter password:

MariaDB [(none)]> change master to master_host='192.168.37.111',

>master_user='slave',

>master_password='keer',

>master_log_file='mysql-bin.000001',

>master_log_pos=330;

MariaDB [(none)]> start slave;

然后我們來查看一下從服務器的狀態:

ba723b5d4d301bad19cecfff97225caf.png

6)測試

設置完畢,我們來測試一下,當主上有操作時,從上是否更新:

a8a71320ffbb829902d79b9eb709e8c5.png

8934571dff58669fea901bfcfde2b72b.png

至此,我們就完成了一主兩從。如果有需要,我們還可以繼續添加從服務器。

1.5 擴展——實現半同步復制

1.5.1 三種復制方式

1)同步復制

指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。需要有超時時間。

2)異步復制

MySQL默認的復制即是異步的,主庫在執行完客戶端提交的事務后會立即將結果返給給客戶端,并不關心從庫是否已經接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能并沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。

3)半同步復制

介于異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到并寫到relay log中才返回給客戶端。相對于異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。

1.5.2 實現半同步復制

半同步復制是基于特定的模塊來實現。不過非常 nice 的一點就是,在我們的 mariadb5.5 以上的版本默認是帶有這個模塊的。

如果我們的 centos7 上安裝了 mariadb ,我們就可以進入目錄去查看一下:

[root@master ~]# cd /usr/lib64/mysql/plugin/

89b94c641384b6294511511ecf403ca3.png

找到我們的模塊后,我們就可以通過命令來安裝,然后進行簡單配置即可使用了。下面就是具體方法:

master 服務器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

4d483aaf4efd3406963f09b912754906.png

slave 服務器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;

MariaDB [(none)]> stop slave;

MariaDB [(none)]> start slave;

3b1b75fb8bfe01836ceb119de2efcd1c.png

d90adf9f3d88738c102fc533f6102bf1.png

現在,我們的半同步復制就開啟了,我們可以來查看一下日志:

[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log

從日志里也可以看出我們的半同步復制已經開啟。

dccf1fd0986b65fc115a37d1398b616d.png

以上,實驗一完成。

互為主從(雙主)

還有一種數據庫的架構為雙主模式,也就是互為主從,這種設定在企業中雖不常用,但是我們還是需要掌握的。

Master-Master復制的兩臺服務器,既是master,又是另一臺服務器的slave。這樣,任何一方所做的變更,都會通過復制應用到另外一方的數據庫中。

架構圖如下:

10ec980fa97bdcb50d837b646542e5ba.png

2.1 環境準備:

centos系統服務器2臺、 兩臺用戶實現Mysql互為主從, 配置好yum源、 防火墻關閉、 各節點時鐘服務同步、 各節點之間可以通過主機名互相通信

2.2 準備步驟:

1)iptables -F && setenforce 清空防火墻策略,關閉selinux

2)拿兩臺服務器都使用yum方式安裝Mysql服務, 要求版本一致

3)分別啟動兩臺服務器mysql服務, 確保服務正常

2.3 實現步驟:

2.3.1 配置第一臺 master 主服務器

server-id = 1      //配置server-id,讓主服務器有唯一ID號

log-bin = mysql-bin  //打開Mysql日志,日志格式為二進制

skip-name-resolve   //關閉名稱解析,(非必須)

relay_log = mysql-relay-bin //打開Mysql日志,日志格式為二進制

read_only = 1//設置只讀權限

log_slave_updates = 1//使得更新的數據寫進二進制日志中

auto_increment_offset = 1    //表示自增長字段從那個數開始

auto_increment_increment = 2  //表示自增長字段每次遞增的量

573441334f1cfed049f1a2c0a26d6811.png

2.3.2 配置第二臺 master 主服務器

server-id = 2      //配置server-id,讓主服務器有唯一ID號

log-bin = mysql-bin  //打開Mysql日志,日志格式為二進制

skip-name-resolve   //關閉名稱解析,(非必須)

relay_log = mysql-relay-bin //打開Mysql日志,日志格式為二進制

read_only = 1//設置只讀權限

log_slave_updates = 1//使得更新的數據寫進二進制日志中

auto_increment_offset = 2    //表示自增長字段從那個數開始

auto_increment_increment = 2  //表示自增長字段每次遞增的量

2af6b7d76054da19f80a3536c0a6fcd6.png

2.3.3 創建復制賬號

因為我們實現的是雙主模式,所以我們每一臺機器上都要創建復制賬號:

d12e6597fd3210460075c592a475b17c.png

1efd25f3b029ac4e06ae7927b2c4bb14.png

2.3.4 查看服務器狀態

我們分別查看兩臺服務器的狀態,從而為我們下一步的設置奠下基礎:

730845035857c960e1a9a9fa8a349b48.png

62e5a055de146f4d9377a29ec207fac7.png

2.3.5 啟動復制線程

我們來分別對兩臺機器進行的設置:

首先,先對第一臺 master 機器進行設置:

MariaDB [(none)]> change master to master_host='192.168.37.222',master_user='slave',master_password='keer',master_log_file='mysql-bin.000003',master_log_pos=245;

MariaDB [(none)]> start slave;

接著,我們來查看一下他的狀態:

f2154d542b98bfe35c1a549efd1cb5e8.png

現在,我們來對第二臺 master 進行設置:

MariaDB [(none)]> change master to master_host='192.168.37.111',master_user='slave',master_password='keer',master_log_file='mysql-bin.000002',master_log_pos=245;

MariaDB [(none)]> start slave;

我們來查看一下他的狀態:

eb32e26dafc5b672f0ba56147916545e.png   

可以看出,我們的兩個機器都設置完畢,接下來,我們就可以來測試一下了。

2.3.5 測試

在我們的配置文件中,我們設置了自增長字段的起始值和增長值,現在我們去創建一個自增長的表:

MariaDB [keer]> create table test(id int PRIMARY KEY AUTO_INCREMENT,name char(20) not null);

因為我們設置了主從,所以在任一機器使用該命令即可。

創建好了表以后,我們就可以插入數據進行測試了,我們一個插入多條數據來看看效果:

第一個服務器:

MariaDB [keer]> insert into test(name) value('zhao'),('qian'),('sun'),('li');

Query OK, 4 rows affected (0.00 sec)

Records: 4 Duplicates: 0 Warnings: 0

第二個服務器:

MariaDB [keer]> insert into test(name) value('zhou'),('wu'),('zheng'),('wang');

Query OK, 4 rows affected (0.00 sec)

Records: 4 Duplicates: 0 Warnings: 0

數據我們都插入了,我們來看看效果如何:

37551741295ccdca2087467c36885145.png

可以看出,兩個表插入的數據是不會重復的。

但是現在也不是我們想象的連續的 id ,這是因為,我們兩臺機器都是同時插入4條數據,而且不是同步插入的,這樣就會有一個先后順序,第一臺機器上的 sql 語句執行結束以后才執行第二臺機器上的。所以會出現這樣的情況。

但是,這樣已經不會插入重復的數據了。我們的目的也是達到了。

以上,實驗二完成。

高可用架構MHA的實現

如有不足之處還請大家多多指教喏?(?>?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371815.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371815.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371815.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FastReport.Net使用:[30]對話框使用

使用對話框需要知道的地方 1.按鈕的DialogResult屬性。 假如DialogResult屬性值為OK的按鈕被點擊,報表將會展現后面的對話框或者報表頁;如果屬性值為None,則停留在當前窗體;如果為其他值,則直接退出報表打印&#xff0…

模擬聊天室顯示語句保持最新顯示

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>模擬聊天室顯示語句保持最新顯示</title> <style> *{ border-collapse: collapse; } .dialog_box{ width:400px; height: 600px; margin…

改善Java EE生產支持技能的8種方法

參與Java EE生產支持的每個人都知道這項工作可能很困難。 7/24傳呼機支持&#xff0c;定期處理的多個事件和錯誤修復&#xff0c;來自客戶和管理團隊的壓力&#xff0c;要求它們盡快解決生產問題并防止再次發生。 在日常工作中&#xff0c;您還必須照顧由多個IT交付團隊驅動的多…

plsql連接mysql_安裝了mysql和pl/sql,怎么配置讓pl/sql能聯接mysql數據庫

64位環境下&#xff0c;使用PL/SQL Developer連接Oracle&#xff1a;?1. 下載32位Oracle InstantClient&#xff0c;并展開到某目錄&#xff0c;例如C:\instantclient-basic-nt-11.2.0.2.0&#xff1b;?2. 將系統的tnsnames.ora拷貝到該目錄下&#xff1b;?3. 在PLSQL Devel…

varnish基礎

varnish概念 初步認識 首先來跟我學習&#xff0c;v~a~r~n~i~s~h~~ &#xff0c;學會了沒有~ 當然還有很重要的一個概念&#xff0c;它是高性能緩存服務器&#xff0c;舉個例子。 好比我們要去買東西&#xff0c;所有的我們需要的東西是在超市廠家生產出來的&#xff0c;我們需…

引入Spring集成

在本文中&#xff0c;我們介紹Spring Integration 。 如果您以前沒有使用過Spring Integration&#xff0c;那么可能會幫助您復習Gregor Hohpe的Enterprise Integration Patterns 。 我還將推薦Josh Long 撰寫的這篇出色的介紹性文章 。 上下文設置 簡而言之&#xff0c; 企業…

PAT 1024. 科學計數法 (20)

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法&#xff0c;其滿足正則表達式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即數字的整數部分只有1位&#xff0c;小數部分至少有1位&#xff0c;該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科…

Mac上Hive環境搭建

本文介紹在Mac上搭建Hive環境。 建議首先配置好Hadoop&#xff0c;搭建與配置可以參考我之前的博文Mac Hadoop的安裝與配置。 當然你也可以選擇使用Docker搭建環境&#xff0c;本文不作介紹。 安裝 對于MacOs&#xff0c;推薦使用HomeBrew安裝hive&#xff0c;一步到位。 $ bre…

mysql+創建備份賬戶_mysql 添加用戶,授予權限,數據庫備份等 (轉載)

一&#xff0c;連接MySQL格式&#xff1a;mysql -h 遠程主機地址 -u 用戶名 -p 回車輸入密碼進入&#xff1a;mysql -u root -p 回車Enter password: ,輸入密碼就可以進入mysql> 進入了退出命令:>exit 或者ctrlD二&#xff0c;MySQL管理與授權1.修改密碼&#xff1a;格式…

分代緩存和轉換

康拉德&#xff08;Konrad&#xff09;最近在我們公司的技術室中分享了有關如何完成緩存的有趣文章&#xff0c;這是一個大型的波蘭社交網絡nk.pl。 算法中的核心概念之一是分代緩存 &#xff08;請參閱此處或此處 &#xff09;。 基本思想是&#xff0c;對于緩存鍵&#xff0c…

css精靈

○ css 精靈&#xff08;Sprites&#xff09;技術利用photoshop將圖片整合&#xff0c;然后用background-images&#xff0c;background-position&#xff0c;background-repeat技術&#xff0c;對圖片進行精確定位。 ○ 優點&#xff1a;減少http請求數量&#xff0c;減少服務…

基于Jenkins+Gitlab的自動化部署實戰

故事背景 一個中小型企業&#xff0c;是典型的互聯網公司&#xff0c;當初期的時候可能運維只能標配到2~3人&#xff0c;此時隨著公司的發展&#xff0c;項目會逐漸增多。前期部署項目可能都是手動的&#xff0c; 俗稱“人肉部署”&#xff0c;這簡直是無比的痛苦&#xff0c;不…

cmd如何刷新MySQL數據庫_怎樣在cmd中用命令操作MySQL數據庫 需要技巧

用命令來操作MySQL是工作必備的&#xff0c;今天我就來分享一下cmd命令操作MySQL數據庫的方法&#xff0c;希望有幫助。工具/材料電腦xampp操作方法01首先&#xff0c;啟動MySQL服務才行哦。這里我是用xampp集成的數據庫&#xff0c;方便&#xff0c;點擊‘start’。02如圖&…

Java順序IO性能

許多應用程序將一系列事件記錄到基于文件的存儲中&#xff0c;以供以后使用。 從日志記錄和審核&#xff0c;直到在事件源設計或其緊密相關的CQRS中保留事務重做日志&#xff0c;這都可以是任何東西。 Java具有多種方法&#xff0c;可以通過這些方法將文件順序寫入或重新讀取。…

text段,data段,bss段,堆和棧

.bss段和.data段的區別 text段,data段,bss段,堆和棧轉載于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]數表

[BZOJ3529][Sdoi2014]數表 試題描述 有一張Nm的數表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的數值為能同時整除i和j的所有自然數之和。給定a&#xff0c;計算數表中不大于a的數之和。輸入 輸入包含多組數據。輸入的第一行…

ZK的實際應用:MVVM –表單綁定

這是我們從頭開始構建ZK應用程序的第二集。 上一篇文章涉及使用MVVM將數據加載和呈現到表中。 在本文中&#xff0c;我們將向您介紹ZK MVVM的表單綁定。 目的 我們將構建一個“添加”功能&#xff0c;使我們能夠將新條目保存到清單中。 單擊“添加”時出現表格 單擊“保存”…

群暉按裝mysql_如何連接群暉里的MYSQL數據庫

匿名用戶1級2018-08-27 回答一、連接遠程數據庫&#xff1a;1、顯示密碼如&#xff1a;MySQL 連接遠程數據庫(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用戶名為“root”&#xff0c;密碼“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隱藏密…

ZK的實際應用:MVVM –以編程方式更新視圖

在前兩篇文章中&#xff0c;我們使用ZK的MVVM功能來&#xff1a; 將數據加載到表中 使用表單綁定保存數據 我們已經看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;裝飾方法時&#xff0c;在執行完成后&#xff0c;將向Binder通知VM屬性的更改&#xff0c;以便B…

給你一個笑臉

今日冬至&#xff0c;愿你笑靨如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…