MySQL的主從、主主、被動主主搭建

第一、MySQL主從複製簡單配置:

MySQL主從原理圖:


選擇倆臺服務器:

master-199主服務器:
1.vim打開my.cnf,配置以下:
#server-id設置唯一id
server-id=199

#binary log(二進制日誌)
log-bin=mysql-bin

#statement row mixed(二進制日誌的格式)
binlog-format=mixed
2.啓動MySQL
3.進入MySQL設置賬號
->grant replication client,replication slave on *.* 
->to 'repl'@'192.168.%.%'
->identified by 'password'

slave-200從服務器:
1.vim打開my.cnf,配置以下:
#server-id設置唯一id
server-id=200
relay-log=mysql-relay
2.啓動MySQL
3.進入MySQL
mysql -h 192.168.1.200 -uroot
4.切換master
change master to 
master_host="主服務器ip",
master_user='主服務器上設置的用戶repl',
master_password='主服務器上設置的密碼password',
master_log_file='在主服務器show master status查看出來的File',
master_log_pos='在主服務器show master status查看出來的Position';

如果4有寫錯的使用reset  slave重置

5.啓動slave
start slave
6.查看狀態
show slave status \G

創建連接成功


@主服務器的日誌格式用哪種好?

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

row:影響1行,且爲新增1行,對於其他行沒有影響
這個情況一般用row格式,直接複製磁盤上1行的新增變化

statement:影響多磁盤上多個row的變化時,使用statement格式的日誌 

mixed:這是MySQL提供的,可以根據語句的不同而自動選擇適合的日誌格式


第二、豬豬複製

199服務器:
1.vim打開my.cnf,配置以下:
#server-id設置唯一id
server-id=199

#binary log(二進制日誌)
log-bin=mysql-bin

#statement row mixed(二進制日誌的格式)
binlog-format=mixed

#relay log
relay-log=mysql-relay

2.啓動MySQL
3.進入MySQL設置賬號
->grant replication client,replication slave on *.* 
->to 'repl'@'192.168.%.%'
->identified by 'password'

4.切換master
change master to 
master_host="200服務器ip",
master_user='200服務器上設置的用戶repl',
master_password='200服務器上設置的密碼password',
master_log_file='在200服務器show master status查看出來的File',
master_log_pos='在200服務器show master status查看出來的Position';

如果4有寫錯的使用reset slave重置

5.啓動slave
start slave
6.查看狀態
show slave status \G



200服務器:
1.vim打開my.cnf,配置以下:
#server-id設置唯一id
server-id=200

#binary log(二進制日誌)
log-bin=mysql-bin

#statement row mixed(二進制日誌的格式)
binlog-format=mixed

#relay log
relay-log=mysql-relay

2.啓動MySQL
3.進入MySQL設置賬號
->grant replication client,replication slave on *.* 
->to 'repl'@'192.168.%.%'
->identified by 'password'

4.切換master
change master to 
master_host="199服務器ip",
master_user='199服務器上設置的用戶repl',
master_password='199服務器上設置的密碼password',
master_log_file='在199服務器show master status查看出來的File',
master_log_pos='在199服務器show master status查看出來的Position';

如果4有寫錯的使用reset slave重置

5.啓動slave
start slave
6.查看狀態
show slave status \G


解決主主複製時的主鍵衝突:

199服務器:

set session auto_increment_increment=2; #每步增長2
set session auto_increment_offset=1;  #從1開始增長
set global auto_increment_increment=2;
set global auto_increment_offset=1;
200服務器:

set session auto_increment_increment=2; #每步增長2
set session auto_increment_offset=0;  #從0開始增長
set global auto_increment_increment=2;
set global auto_increment_offset=2;
注:auto_increment_increment 和 auto_increment_offset 寫入配置文件中,防止下次重啓後失效;

如果後期加服務器這個就有限制了:
比如在racle有sequnce序列,序列每次訪問生成遞增 遞減的數據

以redis爲例,我們可以專門創建一個global:userid;
每次PHP插入MySQL前,先incr->global:userid得到一個不重複的userid;

第三、被動主主複製

#被動主主(設置爲可讀)
在my.cnf中加:read-only=1

show  variables  like  '%read%';
當主服務器宕機時直接修改read-only


切換主寫,從讀的方法:
1.直接在PHP的MySQL類做判斷
class mysql {
$dbm = "主服務器";
$dbs1 = "從服務器1";
$dbs2 = "從服務器2";

public function query() {
在query裏面進行語句判斷
分別連接不同的mysql服務器
}
}

2.可以使用集羣中間件

比如:官方的mysql_proxy               還有國產的中間件:amoeba


實例:mysql讀寫分離、mysql_proxy實現

(1)下載安裝mysql_proxy:

wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz

解壓後, 該目錄包含已經編譯好的二進制文件.

 

1: 利用mysql_proxy實現負載均衡

執行mysql_proxy

./mysql-proxy-path/bin/mysql-proxy \

--proxy-backend-addresses=192.168.1.199:3306 \

--proxy-backend-addresses=192.168.1.200:3306

 

2: 連接mysql_proxy,mysql客戶就可以,因爲proxymysql的前端代理

注意proxy的端口是4040

mysql -h “proxyIP” -P 4040 -u username -p password


mysql_proxy會把連接mysql服務器的tcp/IP連接緩存進連接池,以提高性能.

在緩存池裏, 緩存的連接大致是平均分配在每臺mysql服務器上.

但具體的每一個連接,始終連某臺服務器.


啓動:

./bin/mysql-proxy  \

--proxy-backend-addresses=192.168.1.199:3306 \

--proxy-read-only-backend-addresses=192.168.1.200:3306 \

--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua


簡寫啓動:mysql_proxy

./bin/mysql-proxy -b 192.168.0.199:3306 -r 192.168.0.200:3306 -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon


使用:partition分區
示例: 按列的範圍來分區以用戶表爲例, uid

uid [1,10)  ---> user partition u0
uid[10, 20) ---> user partition u1
uid [20, MAX] --> user partion u2

分區 按range分區
create table goods (
 id int,
 uname char(10)
)engine myisam
 partition by range(id) (  #表示要以id來分塊
 partition p1 values less than (10),  #表示id(0-10)
 partition p2 values less than (20),  #表示id(11-20)	
 partition p3 values less than MAXVALUE   #表示id(大於20)
);

第四、MySQL的事務:

 原子性:是指某幾句sql的影響,要麼都不發生,要麼都發生;
 一致性:事務前後的數據。保持業務上的合理一致;
 隔離性:在事務進行過程中,其他事務看不到此事務的任何效果;
 持久性:事務一旦放生,不能取消  只能通過補償性事務,來抵消效果;


事務的使用流程:
開啓事務      start  transaction
執行事務      xxxxx
提交事務     commit
回滾事務      rollback



設置事務的級別(從低到高):

set session transaction isolation level [read uncommitted | read committed | repeatable read | serializable]


read uncommitted:讀未提交的食物內容顯然不符合原子性,稱爲“髒讀”;


read commited:在一個事物進行過程中,讀不到另外一個進行事務的操作,但是可以讀到另外一個結束事務的操作影響;


repeatable read:可重複讀,即在一盒事務過程中,所有信息都來自食物開始那一瞬間的信息,不受其他已提交的事務的影響(大多數的系統用此隔離級別);


serializeable串行化:所有的事務必須編號按順序一個一個來執行也就取消了衝突的可能。這樣隔離級別最高,但事務相互等待的等待長,在使用也不是很多。







發佈了68 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章