結構: sql + data + mgm節點node
原理:mysql
集羣由3個概念redis
1,sql節點 sql nodesql
2,數據節點 data node數據庫
3,管理節點 ndb managerment服務器
sql語句發送sql節點,sql節點發往數據節點,再由管理節點完成數據節點的之間的同步。網絡
集羣技術相對複雜,至少有3種節點,4臺服務器才能完成。session
結構: master + slavetcp
master負責寫,slave負責讀,解決了數據庫瓶頸問題測試
原理:
1,主服務器運行語句,都產生一個二進制日誌 binlog
2,從服務器不斷讀取主服務器的binlog
3,從主服務讀取到的binlog,轉換爲自身可執行的relaylog
4,執行relaylog
實現步驟:
1,首先確保主服務器打開二進制日誌功能
主服務器一旦有數據變化,當即產生二進制日誌
2,從服務器也須要開啓二進制日誌和relay日誌功能
這樣能夠從主服務器讀取binlog,併產生relaylog
3,在主服務器創建一個從服務器的帳號,並授予數得上權限
4,指定從服務對應的主服務器,開啓從服務器
具體實施:
虛擬機下有兩臺CentOS-6.7,IP爲192.168.1.67(master)和192.168.1.83(slave)
1,67作主服務器
2,83作從服務器
3,保證主從3306端口互通
4,配置主服務器,打開binlog
#給服務器起一個惟一的id,一般以局域網ip最後段命名
server-id=67
#開啓二進制日誌
log-bin=mysql-bin
#指定日誌格式
binlog-format=mixd
注:binlog日誌格式選擇
主服務器的日誌格式用哪一種好?
有 statement,row,mixed 3種,其中mixed是指前2種的混合。
一、insert into xxtable values (x,y,z)
影響:1行,且爲新增1行,對於其餘行沒有影響。
這個狀況,用row格式,直接複製磁盤上1行的新增變化。
二、update xxtable set age=21 where name='sss'
這個狀況,通常也只是影響1行,用row也比較合適。
以過年發紅包,全公司的人,都漲薪100元。
三、update xxtable set salary=salary+100
這個語句帶來的影響,是針對每一行的,所以磁盤上不少row都發生了變化。
此處,適合就statment格式的日誌。
2種日誌,各有各的高效的地方,mysql提供了mixed類型。
能夠根據語句的不一樣,而自動選擇適合的日誌格式。
重啓mysql
已經可以充當master服務器
5,配置從服務器打開binlog和relaylog
#給服務器起一個惟一的id,一般以局域網ip最後段命名
server-id=83
#開啓二進制日誌
log-bin=mysql-bin
#指定日誌格式
binlog-format=mixd
#從服務器中繼日誌
relay-log=mysql-relay
#指定只讀
read-only=1
重啓從服務器
6,在主服務器上建立相應的複製帳號
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';
刷新權限
flush privileges;
7,在從服務器經過語句指定要複製的主服務器(注意,能夠一主多從,不可一從多主)
CHANGE MASTER TO \
MASTER_HOST='192.168.1.67',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000015',
MASTER_LOG_POS=3069;
8,啓動從服務器功能
start slave;
注:經常使用語句
show master status ; 查看master的狀態, 尤爲是當前的日誌及位置
show slave stattus; 查看slave的狀態.
reset slave ; 重置slave狀態.
start slave ; 啓動slave 狀態(開始監聽msater的變化)
stop slave; 暫停slave狀態;
配置錯誤展現
錯誤分析
一、網絡不通
二、密碼不對
三、pos不對
解決方法:
主服務器防火牆3306端口沒設置對外訪問
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
/etc/init.d/iptables status
配置完成
9,測試
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT '' COMMENT 'name',
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO test (name) VALUES ('安大廈');
mysql二進制日誌
/usr/local/mysql/var/
查看最新的bin-log日誌
more mysql-bin.index
查看master使用的bin-log日誌
show master status
互爲主從,解決讀數據庫寫壓力,不至於一臺master宕機,網站不能訪問,缺點 同步衝突
大體思路:
1,2臺服務器都設置上2進制日誌和relay日誌
2,都設置上replcation帳號
3,都設置對方爲本身的master
具體實施:
虛擬機下有兩臺CentOS-6.7,IP爲192.168.1.67和192.168.1.83
1,配置67服務器,配置binlog和relaylog
#給服務器起一個惟一的id,一般以局域網ip最後段命名
server-id=67
#開啓二進制日誌
log-bin=mysql-bin
#指定日誌格式
binlog-format=mixd
重啓mysql
在67服務器上建立相應的複製帳號
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';
在67服務器經過語句指定要複製的83服務器
CHANGE MASTER TO \
MASTER_HOST='192.168.1.83',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000016',
MASTER_LOG_POS=1720;
刷新權限
flush privileges;
start slave;
2,配置83服務器,配置binlog和relaylog
#給服務器起一個惟一的id,一般以局域網ip最後段命名
server-id=83
#開啓二進制日誌
log-bin=mysql-bin
#指定日誌格式
binlog-format=mixd
在83服務器上建立相應的複製帳號
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';
在83服務器經過語句指定要複製的67服務器
CHANGE MASTER TO \
MASTER_HOST='192.168.1.67',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000017',
MASTER_LOG_POS=411;
刷新權限
flush privileges;
start slave;
主主複製下必定要注意避免的問題---------同步衝突
2臺mysql地位相等, 假如2個請求同時到達2臺服務器,
請求的A節點, stu 的id爲1
請求的B 節點, stu的id爲1 ,
同步--->衝突
如何解決?
讓master1 1,3,5,7來增加
另master2 2,4,6,8來增加
master1:
set global auto_increment_increment = 2;#每步增加2
set global auto_increment_offset = 1;#從1開始增加
set session auto_increment_increment = 2;
set session auto_increment_offset = 1;
注:global全局,session當次鏈接
master2:
set global auto_increment_increment = 2;
set global auto_increment_offset = 2;
set session auto_increment_increment=2;
set session auto_increment_offset = 2;
注:auto-increment-increment 和 auto-increment-offset 要寫到配置文件 my.cnf 中,防止下次重啓後失效。
master1的my.cnf加入
auto_increment_increment=2
auto_increment_offset=1
master2的my.cnf加入
auto_increment_increment=2
auto_increment_offset=2
查詢默認auto_increment_increment 和 auto_increment_offset
SHOW VARIABLES LIKE '%auto_inc%';
操做後獲得以下相似效果
若是後期須要加服務器,這個辦法就有限制了。
咱們能夠在業務邏輯上來解決,
好比在racle 有sequnce,序列。
序列每次訪問,生成遞增/遞減的數據。
以redis爲例,咱們能夠專門構建一個 global:userid
每次PHP插入Mysql前,先 incr->global:userid,獲得一個不重複的userid。
避免了主主複製的缺點,只是一臺服務器寫入,另外一臺讀取備份
是指 2臺服務器地位同樣,但其中一臺爲只讀,而且業務中也只寫某1臺服務器。
好處: 若是供寫入的服務器出了故障,能迅速的切換到從服務器,
或者出於檢修等目的,把寫入功能切換到另外一臺服務器也比較方便。