第一、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客戶就可以,因爲proxy是mysql的前端代理
注意proxy的端口是4040
mysql -h “proxy的IP” -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串行化:所有的事務必須編號按順序一個一個來執行也就取消了衝突的可能。這樣隔離級別最高,但事務相互等待的等待長,在使用也不是很多。