mysql aa复制_MySQL的复制架构与优化
MySQL的復(fù)制架構(gòu)與優(yōu)化
###########原理###########
1.主服務(wù)器將更新的數(shù)據(jù)的sql語句(例如,insert,update,delete等)寫入到
二進(jìn)制文件中(由log-bin選項(xiàng)開啟)。此二進(jìn)制文件由一個(gè)索引文件跟蹤維護(hù)。
2.從服務(wù)器連接(使用I/O線程連接)主服務(wù)器,將自己最后一次更新的位置通知
主服務(wù)器。然后,主服務(wù)器將把從‘從服務(wù)器’得知的位置開始之后的所有更新發(fā)
送給‘從服務(wù)器’(使用Binlog Dump線程來發(fā)送),而后‘從服務(wù)器’再次使用I/O
線程讀取由Binlog Dump線程發(fā)送過來的數(shù)據(jù),并將數(shù)據(jù)拷貝到本地的‘中繼二進(jìn)
制文件'中。最后,再由SQL線程讀取’中繼二進(jìn)制文件‘并執(zhí)行其中的更新。
注:mysql的復(fù)制由三個(gè)線程來完成,一是,主服務(wù)器上的Binlog Dump線程;二
是,從服務(wù)器上的I/O線程(用來連接和讀取主服務(wù)更新,并拷貝到中繼二進(jìn)制文
件)和SQL線程(用來讀取中繼二進(jìn)制日志和執(zhí)行更新)。
#######################################
#? ????? 主從架構(gòu)????? #
#######################################
#############配置#############
注:此處使用的是 mysql-5.5.28的二進(jìn)制包。安裝過程略。直接進(jìn)行主從復(fù)制配置
##主服務(wù)器
1. 更改/etc/my.cnf:
server-id = 1???? #設(shè)置服務(wù)器唯一標(biāo)識(shí)
log-bin=mysql-bin #開啟二進(jìn)制日志功能
2. 添加復(fù)制用戶:
GRANT REPLICATION CLIENT,REPLICATION SLAVE TO 'repl'@'192.168.1.103'
IDENTIFIED BY '123';
##從服務(wù)器
1. 更改/etc/my.cnf:
server-id = 2?????#同主服務(wù)器
relay-log=relay-bin??? ?#開啟中繼日志
relay-log-index=relay-bin.index #開啟跟蹤中繼日志的索引,若未設(shè)置此選
項(xiàng)系統(tǒng)也會(huì)自動(dòng)生成索引文件。
2. 啟動(dòng)mysql并設(shè)置為從服務(wù)器
1. mysql -uroot -p
2. CHANGE MASTER TO MASTER_HOST='192.168.1.102',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT='3306';
3. START SLAVE;
4. SHOW SLAVE STATUS \G; 若Slave_IO_Running:和Slave_SQL_Running: 均顯示
Yes則說明從服務(wù)器配置成功。
注: SHOW SLAVE STATUS \G;顯示信息中的Seconds_Behind_Master: 表示從服務(wù)
器和主服務(wù)器數(shù)據(jù)相差的時(shí)間間隔。
5. 測試:在主服務(wù)上創(chuàng)建表或數(shù)據(jù)庫,查看是否在從服務(wù)器上有相同的表和數(shù)據(jù)庫。
若有,則主從復(fù)制搭建成功。
#############安全############
##阻止寫從服務(wù)器
1.修改/etc/my.cnf
[mysqld]
read-only = 1 # 此選項(xiàng)只對(duì)普通用戶起作用,對(duì)有SUPER權(quán)限的用戶無效。
2. FLUSH TABLES WITH READ LOCK;#為全局讀鎖命令,此時(shí)除了讀操作,其他操作無法執(zhí)行
##實(shí)現(xiàn)半同步
說明:主——>從,為異步模式。mysql從5.5開始支持半同步模式復(fù)制,半同步插件為semisync,存儲(chǔ)
在/usr/local/mysql/plugin下。
1. 在主服務(wù)器,安裝semisync插件
CHANGE INSTALL rpl_semi_sync_master SONAME 'semisync_master.so';
查看是否安裝成功:
SHOW PLUGINS; #若有rpl_semi_sync_master 則安裝成功。
啟用半同步功能和設(shè)置超時(shí)時(shí)間:
SET GLOBAL rpl_semi_sync_master_enabled=1;
SET GLOBAL rpl_semi_sync_master_timeout=1000; #單位是ms,如果半同步在此設(shè)置的
時(shí)間內(nèi)無法同步,則自動(dòng)降回異步模式。
注:若使設(shè)置永久有效,把以上兩項(xiàng)寫入my.cnf的[mysqld]下即可。
2. 在從服務(wù)器,安裝semisync插件
CHANGE INSTALL rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看是否安裝成功:
SHOW PLUGINS; #若有rpl_semi_sync_slave 則安裝成功。
啟用半同步功能和設(shè)置超時(shí)時(shí)間:
SET GLOBAL rpl_semi_sync_slave_enabled=1;
重啟slave:
stop slave;
start slave;
3. 檢測半同步功能是否已經(jīng)生效
SHOW STATUS LIKE ‘rpl_%';
若Rpl_semi_sync_master_clients 的值不為0,則說明半同步功能已經(jīng)生效。
##如何讓從服務(wù)器的mysql服務(wù)在啟動(dòng)的時(shí)候,不自動(dòng)啟動(dòng)從服務(wù)線程?
說明:從服務(wù)器之所以在啟動(dòng)的時(shí)候會(huì)自動(dòng)啟動(dòng)線程,是因?yàn)閙aster.info和relay-log.info文件的存在。
master.info記錄的是CHANGE MASTER TO命令傳遞的參數(shù);relay-log.info記錄的是當(dāng)前從服務(wù)器所使用的
中繼日志的位置和從主服務(wù)器復(fù)制的二進(jìn)制文件和所處的位置。
1. 在從服務(wù)器上,禁止自動(dòng)啟動(dòng)線程
更改my.cnf,加入以下選項(xiàng):
[mysqld]
skip-slave-start=1
##數(shù)據(jù)庫復(fù)制過濾
主服務(wù)器:
1.[mysqld]
binlog-do-db=test ? #只復(fù)制test數(shù)據(jù)庫,相當(dāng)于白名單。
binlog-ignore-db=mysql #除了mysql數(shù)據(jù)庫外不復(fù)制外,其他的都要復(fù)制,相當(dāng)于黑名單。
注:一般這兩項(xiàng)不同時(shí)使用,若同時(shí)存在,則白名單生效。不過,在主服務(wù)器上做過濾有個(gè)缺陷,就是任何
涉及不到的數(shù)據(jù)庫,都不會(huì)記錄在二進(jìn)制日志中。因此,大多情況下不在主服務(wù)器上做過濾。
從服務(wù)器:
1.[mysqld]
replicate-do-db=test1
replicate-ignore-db=test1
replicate-do-table=test2.t1
replicate-ignore-table=test2.t2
replicate-wild-do-table=test3.ta%
replicate-wild-ignore-table=test3.tb%
##防止事務(wù)提交和寫入日志,期間的服務(wù)器崩潰問題
主服務(wù)器:
1. [mysqld]
sync_binlog=1 #每次事件后立即同步到磁盤上的二進(jìn)制日志文件中
innodb_flush_logs_at_trx_commit=1 #
#######################################
#? ????? 主主架構(gòu)????? #
#######################################
說明:主主架構(gòu),即服務(wù)器互為主從。配置基本上和主從差不多。此處關(guān)鍵的是如果
數(shù)據(jù)庫的表中使用了auto_incremnet 關(guān)鍵字,則需要設(shè)置auto-increment-increment
和auto-increment-offset兩項(xiàng)以防止鍵值沖突。
##主服務(wù)器
1. GRANT REPLICATION CLIENT,REPLICATION SLAVE TO 't1'@'192.168.1.103'
IDENTIFIED BY '123';
2.?[mysqld]
server-id=10
log-bin=mysql-bin
auto-increment-increment=2
auto-increment-offset=1
3. mysql -uroot -p
4. CHANGE MASTER TO MASTER_HOST='192.168.1.102',
MASTER_USER='t2',
MASTER_PASSWORD='123',
MASTER_PORT='3306';
##從服務(wù)器
1. GRANT REPLICATION CLIENT,REPLICATION SLAVE TO 't2'@'192.168.1.102'
IDENTIFIED BY '123';
2.?[mysqld]
server-id=10
log-bin=mysql-bin
auto-increment-increment=2
auto-increment-offset=1
3. mysql -uroot -p
4. CHANGE MASTER TO MASTER_HOST='192.168.1.103',
MASTER_USER='t1',
MASTER_PASSWORD='123',
MASTER_PORT='3306';
#################MySQL復(fù)制架構(gòu)解決方案###############
1.主——>從(解決應(yīng)用程序與耦合度較高的問題)
1.分三層:
1.讀寫分離器,產(chǎn)品有:MySQL Proxy和Amoeba
2.主服務(wù)器
3.從服務(wù)器
2.分四層:
1.讀寫分離器
2.主服務(wù)器
3.偽從服務(wù)器(所用引擎BLACKHOLE)
4.從服務(wù)器
2.主——>主(解決更新數(shù)據(jù)時(shí),數(shù)據(jù)不一致的情況)
1.主動(dòng)/被動(dòng)模式
即,將兩個(gè)主機(jī)server-id設(shè)置為相同值。
產(chǎn)品:mmm,Multi Master Manager
#####################故障解決################
##解決:出現(xiàn)錯(cuò)誤時(shí),不能啟動(dòng)從服務(wù)器
1. SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; #此語句可以跳過來自主服務(wù)的下一個(gè)語句
START SLAVE;
或?2. 使用pt-slave-restart工具,來自percona-toolkit包。
##解決:數(shù)據(jù)出現(xiàn)不一致
1. 檢查一致性使用:
pt-table-checksum #此工具四種功能:1.校驗(yàn)主從數(shù)據(jù)
2.監(jiān)控復(fù)制延遲時(shí)間
3.系統(tǒng)開銷很小
4.檢查數(shù)據(jù)一致性
2. 修復(fù)不一致性使用:
pt-table-sync
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
######################MySQL的優(yōu)化#######################
##技巧
1.使用正則表達(dá)式REGEXP,取出匹配數(shù)據(jù)
例:SELECT name,email FROM t WHERE email REGEXP '@126[.,]com$';
如果使用like方式查詢
例:SELECT name,email FROM t WHERE email LIKE '%126.com' or email LIKE '%126,com';
注:使用正則比使用like的一個(gè)缺點(diǎn)是系統(tǒng)資源的開銷會(huì)更大一下。
2.使用RAND()隨機(jī)取出數(shù)據(jù)
例:SELECT * FROM t ORDER BY RAND();
SELECT * FROM t ORDER BY RAND() LIMIT 3;
3.使用GROUP BY的WITH ROLLUP,進(jìn)一步分組聚合數(shù)據(jù)。
例:SELECT cname,pname,COUNT(cname) FROM demo GROUP BY cname,pname WITH ROLLUP;
注:WITH ROLLUP 不能與ORDER BY 同時(shí)使用
##優(yōu)化
一.優(yōu)化SQL語句常用命令
1.通過SHOW STATUS命令查詢各種SQL的執(zhí)行頻率。
SHOW [SESSION|GLOBAL] STATUS;
其中:SESSION(默認(rèn))表示當(dāng)前連接。
GLOBAL表示自數(shù)據(jù)庫啟動(dòng)至今。
@@主要查詢以com開頭的參數(shù):
SHOW STATUS LIEK 'com_%'; #Com_XXX表示每個(gè)XXX語句執(zhí)行的次數(shù)
@@需要查看的主要的以com開頭的參數(shù)
com_select:執(zhí)行select操作的次數(shù),一次查詢只累計(jì)加1
com_update:執(zhí)行update操作的次數(shù)
com_insert:執(zhí)行insert操作的次數(shù),對(duì)批量插入只算一次
com_delete:執(zhí)行delete操作的次數(shù)
注:以上參數(shù)是對(duì)所有引擎的。
@@以下是只針對(duì)InnoDB存儲(chǔ)引擎的。
InnoDB_rows_read:執(zhí)行select操作的次數(shù)
InnoDB_rows_updated:執(zhí)行update操作的次數(shù)
InnoDB_rows_inserted:執(zhí)行insert操作的次數(shù)
InnoDB_rows_deleted:執(zhí)行delete操作的次數(shù)
注:以上針對(duì)InnoDB的操作次數(shù)是影響的數(shù)據(jù)的“行”數(shù),而不是相應(yīng)語句的次數(shù)。
@@其他重要參數(shù)
connections:連接mysql的次數(shù),包括成功和不成功的。
uptime:服務(wù)器已經(jīng)工作的秒數(shù)。
slow_queries:慢查詢的次數(shù)。#可通過SHOW VARIABLES LIKE '%slow_queries%';查看是否開啟
2.定位執(zhí)行效率較低的SQL語句
1.explain(或describe) select * from table where id=1000;
2.優(yōu)化SQL語句
1.查詢慢查詢?nèi)罩?/p>
2.解析查詢語句
3.判斷是否要加索引和索引是否可使用上
3.索引優(yōu)化
1.添加索引,主要是在WHERE,HAVING,GROUP BY,OREDER BY后所使用的字段上。
2.使用LIKE時(shí),不要把%通配符放在前面,否則索引就無法使用的到。
3.在使用OR和AND時(shí),前后的兩個(gè)條件都要使用索引,否則索引就用不到
4.如果給定的條件表達(dá)式的值的數(shù)據(jù)類型和定義的不一樣,則無法用到索引
5.查看索引使用情況:SHOW STATUS LIKE 'Handler_read%';
其中所顯示的參數(shù):Handler_read_key的值,表示讀取索引的次數(shù)。
Handler_read_rnd_next的值越高則,需要添加索引的列越多。
4.表優(yōu)化
1.分析和檢查表
CHECK TABLE t1; #檢查表t1是否有錯(cuò)誤
2.優(yōu)化表空間
OPTIMIZE TABLE t1; #最好在非工作時(shí)間使用
5.常用SQL優(yōu)化
1.導(dǎo)入導(dǎo)出優(yōu)化
@@導(dǎo)出使用:SELECT * FROM table INTO OUTFILE '/tmp/table.txt';
@@導(dǎo)入使用:LOAD DATA INFILE ‘/tmp/table.txt' INTO TABLE table;
2.關(guān)閉索引使導(dǎo)入速度更快
1.@@關(guān)閉索引:ALTER TABLE tbl_name DISABLE KEYS;
@@導(dǎo)入數(shù)據(jù)
@@開啟索引:ALTER TABLE tbl_name ENABLE KEYS;
注:以上只對(duì)MyISAM表的數(shù)據(jù)導(dǎo)入能提高速度,對(duì)InnoDB無效
2.@@關(guān)閉唯一索引:SET unique_checks=0
@@導(dǎo)入數(shù)據(jù)
@@恢復(fù)唯一索引:SET unique_checks=1
注:如果能確定數(shù)據(jù)的唯一性,則可以使用關(guān)閉唯一索引來提高速度。否則不建議關(guān)閉。
3.針對(duì)InnoDB表類型的數(shù)據(jù)導(dǎo)入的優(yōu)化
1.將導(dǎo)入的數(shù)據(jù)按主鍵的順序來排列,可提高導(dǎo)入速度
2.@@關(guān)閉自動(dòng)提交:SET autocommit=0
@@導(dǎo)入數(shù)據(jù)
@@恢復(fù)自動(dòng)提交:SET autocommit=1
6.INSERT語句的優(yōu)化
1.插入數(shù)據(jù)時(shí),使用INSERT INTO tbl_name VALUES('aa'),('bb')......('zz');
7.GROUP BY語句的優(yōu)化
1.禁用分組排序,使用SELECT * FROM tbl_name GROUP BY cloumn ORDER BY NULL;
8.嵌套優(yōu)化查詢
1.使用嵌套查詢,內(nèi)部嵌套的查詢會(huì)用到索引,而外層的用不到。
將嵌套查詢改為,內(nèi)連接或是外連接,則可優(yōu)化查詢。
二.數(shù)據(jù)庫優(yōu)化
1.使用中間表
@@創(chuàng)建新表。#不夠靈活
@@創(chuàng)建視圖。#推薦做法
2.分區(qū)(海量數(shù)據(jù)的優(yōu)化,在Mysql5.1及以后提供)
##MyISAM引擎:
@@RANGE類型:
CREATE TABLE t1(id int,name varchar(30))
-->PARTITION BY RANGE(id)(
-->PARTITION p0 VALUES LESS THAN (11),
-->PARTITION p1 VALUES LESS THAN (21)
-->);
@@LIST類型:
CREATE TABLE t1(id int,name varchar(30))
-->PARTITION BY LIST(id)(
-->PARTITION p0 VALUES IN(1,3,6,7,10),
-->PARTITION p1 VALUES IN(2,4,5,8,11)
-->);
@@HASH類型:
CREATE TABLE t1(id int,name varchar(30))
-->PARTITION BY HASH(id)
-->PARTITIONS 2;
##InnoDB引擎
@@修改my.cnf
[mysqld]
innodb_file_per_table=1 #開啟InnoDB的獨(dú)立存儲(chǔ)空間
@@其他的和MyISAM相同
三. Mysql服務(wù)器優(yōu)化
##鎖機(jī)制
1.MyISAM讀鎖定
@@命令:LOCK TABLE tbl_name READ #所有用戶只能讀,不能更新,刪除等。
2.MyISAM寫鎖定
@@命令:LOCK TABLE tbl_name WRITE #只有當(dāng)前用戶可增刪改查,其他用戶無法進(jìn)行任何操作。
3.解鎖:UNLOCK TABLES;
##字符集
1.@@使用:STATUS或\s,可查看基本信息和字符集。
其中,有服務(wù)器字符集、數(shù)據(jù)庫字符集、客戶端字符集、連接字符集,可設(shè)置。
@@客戶端和連接字符集設(shè)定
[client]
default-character-set=utf8
@@服務(wù)器和數(shù)據(jù)庫字符集設(shè)定
[mysqld]
character-set-server=utf8
@@校驗(yàn)字符集
[mysqld]
collation-server=utf8_general_ci
注:可使用SHOW CHARACTER SET;查看字符集對(duì)應(yīng)的校驗(yàn)字符集。
##開啟慢查詢?nèi)罩?/p>
1.@@使用:SHOW VARIABLES LIKE '%slow%';查看慢查詢?nèi)罩臼欠耖_啟
@@開啟:[mysqld]
slow_query_log=slow.log
@@慢查詢時(shí)間:[mysqld]
long_query_time=5
##socket問題
1.如果mysql.sock丟失,則可使用mysql -uroot -p --protocol tcp -h localhost
注:只是臨時(shí)的啟動(dòng)解決方法。
2. Mysql 密碼丟失
@@跳過授權(quán)表:mysqld_safe --skip-grant-tables --user=mysql &
總結(jié)
以上是生活随笔為你收集整理的mysql aa复制_MySQL的复制架构与优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。