1. 程式人生 > >鎖機制與實現主從複製

鎖機制與實現主從複製

鎖機制

因資源共享,而造成的併發問題。
例子:
買最後一件衣服, 商品加鎖 -》 流程 -》商品解鎖

鎖分類:
1、操作型別:
① 讀鎖(共享鎖)
多個讀同時進行,互不干擾
②寫鎖(互斥鎖)
如果當前寫操作沒有完畢,則無法進行讀操作和寫操作
2、操作範圍
表鎖
myISAN一次性對一個表整體加鎖(開銷小,加鎖快,無死鎖,範圍大,容易發生鎖操作,併發度低)
行鎖
innoDB一次對一條資料加鎖,開銷大,加鎖慢,容易出現死鎖;鎖範圍小,不易發生鎖衝突,併發度高:髒讀,幻讀
頁鎖

例子:

   locak table 表名  reade/writer ,.....
   show open tables;檢視加鎖的表

讀:select 寫:insert。update
–如果某一個會話,對A表進行讀操作、不能進行寫操作
對其它表讀寫都不可以。

–總結,如果會話0對a表加了鎖,其它會話操作,可以對其它表進行讀寫操作。對a表可以讀,寫需要等待釋放鎖

釋放鎖:unlock table;

寫鎖:
會話0:
當前回話可以對加了寫鎖的表進行(讀寫操作),但是不能操作其它表
其它會話:
對會話0加寫鎖的表,可以對進行(增刪改查),但是要等待釋放鎖。
mysql表級鎖,
myisan select 前加讀鎖
inser、updata、delete 加寫鎖

分析表鎖定:

   檢視哪些表加了鎖:  show open tables;
 分析表鎖定的嚴重程度
      show statis like 'table%'
    Table_locks_immediate 可能獲取到的鎖數
    Table_locks_waited : 需要等待的表鎖數,越大鎖競爭越大

    >5000 選擇Innodb
     否則用 myisan

分析行鎖(InnoDB)

 自動增加commit,oracle不會自動提交
 關閉自動提交
set autocommit = 0;
插入一行,兩個回話進行爭奪
  提交的作用?
沒提交時在快取裡面,沒有入庫

行鎖小結:
1.如果會話x對某條資料a進行DML操作,其它會話需要等待
2.行鎖通過事務解鎖rollback,commit
3.不同行操作不影響

注意:如果沒有索引,行鎖自動變成表鎖

--資料被阻塞,索引類出現型別轉換,行鎖升級為表鎖。

行鎖的高特殊情況,間隙鎖,值在範圍內,但卻不存在。
1-9,沒有7的時候,給7加一個間隙鎖(行鎖),無法訪問。

行鎖:InnoDB
效能損耗大,高併發用,效率高
行鎖分析: 一些引數對比

查詢行鎖: 查詢的時候,別人不能修改
begin;事務自動提交關閉

主從複製(叢集)

資料庫複製為多個請求分流;
負載均衡、失敗遷移。

設定主從資料庫;兩個資料庫資料同步,讀寫分離

難點(資料同步)

window : 主
linux : 從
刪除:mysql隱藏檔案,mysql快取檔案;登錄檔刪除

–重啟計算機

再進行安裝MySQL;允許遠端訪問和執行;

連線遠端 linux ipconfig地址
需要授權遠端訪問,linux裡面授權遠端訪問:防火牆關閉

主從同步原理:
二進位制日誌檔案 binary log (資料庫操作的備份)
主資料庫改變記錄到二進位制檔案
從資料庫開啟時讀寫主資料庫二進位制檔案。
io執行緒,獲取到二進位制檔案新增資料放到從資料庫 relay log(中繼日誌檔案)
中繼日誌事件,將中繼日誌檔案拷貝到資料庫中。

主從複製是非同步的,序列化,有延遲的
一個主,從有多個。

主機配置:
windows: my.ini
配置之前,將許可權、防火牆關閉。允許遠端連結(一個sql語句)
主機裡面開啟配置檔案:[mysqld] server-id =1
log-bin=“mysql/data/mysql-bin”
–錯誤記錄檔案
log-error=“mysql/data/mysql-error”
–主從同步時,忽略資料庫
binlog-ignore-db=mysql
–指定主從同步時,同步哪些資料庫
binlog-do-db = test
sql–授權哪臺計算機是自己的從計算機(配置ip)
GRANT REPLICATION slave,reload,super ON . TO ‘root’@‘192.168.2.%’ IDENTIFIED BY ‘root’;
flush privilegs;
–檢視主計算機狀態(檔名和pocition【磁碟道】)
show master status

從機配置
linux : my.cnf
關閉防火牆:service ip tables stop
[mysqld] server-id =2
log-bin=“mysql/data/mysql-bin”
–錯誤記錄檔案
log-error=“mysql/data/mysql-error”
replicate-do-db = test --同步哪些資料庫
–設定主機,授權
CHANGE MASETER TO
MASTER_HOST = ‘192.168.2.2’,
MASTER_USER = ‘root’,
MASTER_PASSWORD = ‘root’,
MASTER_PORT =3306,
master_log_file = ‘mysql-bin.000001’,
master_log_pos = 107; --position 的值

    --STOP SLAVE;再次執行(報錯)

–開啟主從同步

從計算機
show slave status \G
–檢視slave_IO_running,slave_SQL_running 確保都是yes
–檢查日誌報錯, 查的時候是_,配置的時候是-;
從計算機設定id的時候是有bug的,版本相容
set變數進行修改
演示:
主資料庫建立表,檢視從資料庫是否同步。