日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

大型網站為了軟解大量的并發訪問,除了在網站實現分布式負載均衡,遠遠不夠。到了數據業務層、數據訪問層,如果還是傳統的數據結構,或者只是單單靠一臺服務器來處理如此多的數據庫連接操作,數據庫必然會崩潰,特別是數據丟失的話,后果更是不堪設想。這時候,我們會考慮如何減少數據庫的連接,下面就進入我們今天的主題。

利用主從數據庫來實現讀寫分離,從而分擔主數據庫的壓力。在多個服務器上部署MySQL,將其中一臺認為主數據庫,而其他為從數據庫,實現主從同步。其中主數據庫負責主動寫的操作,而從數據庫則只負責主動讀的操作(slave從數據庫仍然會被動地進行寫操作,為了保持數據一致性),這樣就可以很大程度上的避免數據丟失的問題,同時也可減少數據庫的連接,減輕主數據庫的負載。

下面讓我們來看下一個圖:

mysql數據庫的主從同步,實現讀寫分離

 

在上面的模型中,Mysql-A就是主服務器,即master,Mysql-B就是從服務器,即slave。

在Mysql-A的數據庫事件(例如修改數據庫的sql操作語句),都會存儲到日志系統A中,在相應的端口(默認3306)通過網絡發送給Mysql-B。Mysql-B收到后,寫入本地日志系統B,然后一條條地將數據庫事件在數據庫Mysql-B中完成。

日志系統A,是MYSQL的日志類型中的二進制日志,也就是專門用來保存修改數據庫表的所有動作,即bin log,注意MYSQL會在執行語句之后,釋放鎖之前,寫入二進制日志,確保事務安全。

日志系統B,不是二進制日志,由于它是從MYSQL-A的二進制日志復制過來的,并不是自己的數據庫變化產生的,有點接力的感覺,稱為中繼日志,即relay log。

通過上面的機制,可以保證Mysql-A和Mysql-B的數據庫數據一致,但是時間上肯定有延遲,即Mysql-B的數據是滯后的。因此,會出現這樣的問題,Mysql-A的數據庫操作是可以并發的執行的,但是Mysql-B只能從relay log中一條一條的讀取執行。若Mysql-A的寫操作很頻繁,Mysql-B很可能就跟不上了。

主從同步復制有以下幾種方式:

(1)同步復制,master的變化,必須等待slave-1,slave-2,...,slave-n完成后才能返回。

(2)異步復制,master只需要完成自己的數據庫操作即可,至于slaves是否收到二進制日志,是否完成操作,不用關心。MYSQL的默認設置。

(3)半同步復制,master只保證slaves中的一個操作成功,就返回,其他slave不管。這個功能,是由google為MYSQL引入的。

本文說的是在centos 7系統上,實現的mysql5.7數據庫的主從同步配置,從而實現讀寫分離操作。

 

1 分別在兩臺centos 7系統上安裝mysql 5.7

具體的安裝步驟可以見此鏈接,
https://blog.csdn.net/qq_15092079/article/details/81629238。

本文中的兩臺服務器的IP地址分別為主服務器(192.168.17.130)和從服務器(192.168.17.132)。

分別在這兩個服務器上創建test數據庫,以備后面測試。

 

2 master主服務器的配置

2.1 配置文件my.cnf的修改

#根據上一篇文章,編輯my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf
 
#在[mysqld]中添加:
server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test
#備注:
#server-id 服務器唯一標識。
#log_bin 啟動MySQL二進制日志,即數據同步語句,從數據庫會一條一條的執行這些語句。
#binlog_do_db 指定記錄二進制日志的數據庫,即需要復制的數據庫名,如果復制多個數據庫,重復設置這個選項即可。
#binlog_ignore_db 指定不記錄二進制日志的數據庫,即不需要復制的數據庫名,如果有多個數據庫,重復設置這個選項即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db為互斥選項,一般只需要一個即可。

 

2.2 創建從服務器的用戶和權限

#進入mysql數據庫
[root@localhost mysql]# mysql -uroot -p
Enter password:
 
#創建從數據庫的masterbackup用戶和權限
mysql> grant replication slave on *.* to masterbackup@'192.168.17.%' identified by '123456';
#備注
#192.168.17.%通配符,表示0-255的IP都可訪問主服務器,正式環境請配置指定從服務器IP
#若將 192.168.17.% 改為 %,則任何ip均可作為其從數據庫來訪問主服務器
 
#退出mysql
mysql> exit;

 

2.3 重啟mysql服務

[root@localhost mysql]# service mysql restart

Shutting down MySQL.... SUCCESS! 

Starting MySQL. SUCCESS! 

 

2.4 查看主服務器狀態

#進入mysql數據庫
[root@localhost mysql]# mysql -uroot -p
Enter password:
 
#查看主服務器狀態
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      154 | test         |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

3 slave從服務器的配置

3.1 配置文件my.cnf的修改

#根據上一篇文章,編輯my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf
 
#在[mysqld]中添加:
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test
#備注:
#server-id 服務器唯一標識,如果有多個從服務器,每個服務器的server-id不能重復,跟IP一樣是唯一標識,如果你沒設置server-id或者設置為0,則從服務器不會連接到主服務器。
#relay-log 啟動MySQL二進制日志,可以用來做數據備份和崩潰恢復,或主服務器掛掉了,將此從服務器作為其他從服務器的主服務器。
#replicate-do-db 指定同步的數據庫,如果復制多個數據庫,重復設置這個選項即可。若在master端不指定binlog-do-db,則在slave端可用replication-do-db來過濾。
#replicate-ignore-db 不需要同步的數據庫,如果有多個數據庫,重復設置這個選項即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db為互斥選項,一般只需要一個即可。

3.2 重啟mysql服務

[root@localhost mysql]# service mysql restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS!  

 

3.3 連接master主服務器

#進入mysql數據庫
[root@localhost mysql]# mysql -uroot -p
Enter password:
 
#連接master主服務器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#備注:
#master_host對應主服務器的IP地址。
#master_port對應主服務器的端口。
#master_log_file對應show master status顯示的File列:master-bin.000001。
#master_log_pos對應show master status顯示的Position列:154。

 

3.4 啟動slave數據同步

#啟動slave數據同步
mysql> start slave;
#停止slave數據同步(若有需要)
mysql> stop slave;

 

3.5 查看slave信息

mysql> show slave statusG;

 

mysql數據庫的主從同步,實現讀寫分離

 

Slave_IO_Running和Slave_SQL_Running都為yes,則表示同步成功。

 

4 測試

(1)在主服務器上登陸mysql,且進入test數據庫,創建test表,且插入一條數據

提示:這里最好用數據庫管理工具(如nacicat)來操作。

#創建tb_test表
create table tb_test(ID varchar(36) primary key comment '主鍵ID',MEMO varchar(500) not null comment '信息');
 
#插入一條數據
insert into tb_test(ID,MEMO) values('1','one test');
 
#提交
commit;

 

(2)在從服務器上登陸mysql,且進入test數據庫

你會發現從數據庫中,也出現了tb_test表,且表中還有one test數據存在,證明同步數據成功。

mysql數據庫的主從同步,實現讀寫分離

 


mysql數據庫的主從同步,實現讀寫分離

 

5 解決錯誤

若在主從同步的過程中,出現其中一條語句同步失敗報錯了,則后面的語句也肯定不能同步成功了。例如,主庫有一條數據,而從庫并沒有這一條數據,然而,在主庫執行了刪除這一條數據的操作,那么從庫沒有這么一條數據就肯定刪除不了,從而報錯了。在此時的從數據庫的數據同步就失敗了,因此后面的同步語句就無法繼續執行。

這里提供的解決方法有兩種:

(1)在從數據庫中,使用SET全局sql_slave_skip_counter來跳過事件,跳過這一個錯誤,然后執行從下一個事件組開始。

#在從數據庫上操作

mysql > stop slave;

mysql > set global sql_slave_skip_counter=1;

mysql > start slave;

(2)在從數據庫中,重新連上主數據庫。這種操作會直接跳過中間的那些同步語句,可能會導致一些數據未同步過去的問題,但這種操作也是最后的絕招。最好就是令從數據庫與主數據庫的數據結構和數據都一致了之后,再來恢復主從同步的操作。

#在從數據庫上操作

mysql > stop slave;

mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2050;

mysql > start slave;

 

#備注

#master_log_file和master_log_pos可能會不同,需要在主數據庫中show master status來查看

 

6 總結

至此,mysql數據庫的主從同步就完成了,至于讀寫分離,我們可以通過程序來實現,這里簡單講解一下實現思想。

我們可以在主服務器創建一個數據庫用戶(出于安全,根據需求給予相應的權限)主要用于寫操作,在程序中通過這一用戶連接主數據庫的只用于寫操作而不用讀操作。

在從服務器上創建一個數據庫用戶(出于安全,只給予讀select的權限)主要用于讀操作,在程序中通過這一用戶連接從數據庫即可。

當然,也可以找一個組件來完成MYSQL的代理,實現SQL語句的路由,這樣就不需要我們在程序上關注哪個數據庫是寫,哪個數據庫是讀的了。

————————————————

原文鏈接:
https://blog.csdn.net/qq_15092079/article/details/81672920

分享到:
標簽:主從 同步
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定