mysql优化 个人笔记 (mysql 主从复制 ) 非礼勿扰 -m11
1、為什么需要主從復(fù)制
- 在業(yè)務(wù)中 有一條sql需要鎖表 就會導(dǎo)致其他讀業(yè)務(wù)不能執(zhí)行 ,那么就很影響業(yè)務(wù),使用主從復(fù)制,讓主庫寫,從庫讀。這樣即使主庫出現(xiàn)鎖表情況,從庫也可以正常使用,保證業(yè)務(wù)正常進行
- 做數(shù)據(jù)熱備
- 架構(gòu)的擴展 ,業(yè)務(wù)量越來越大,I/O訪問頻率過高,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能
2、什么是主從復(fù)制
Mysql主從復(fù)制是指數(shù)據(jù)可以從一個Mysql數(shù)據(jù)庫服務(wù)器主節(jié)點中復(fù)制到另一個或多個從節(jié)點中,Mysql默認采用異步復(fù)制的方式,這樣從節(jié)點不用一直訪問主服務(wù)器來更新自己的數(shù)據(jù),數(shù)據(jù)更新可以在遠程連接上操作,從節(jié)點可以復(fù)制主數(shù)據(jù)庫的所有數(shù)據(jù)庫或者特定的數(shù)據(jù)庫,或者特定的表
3、Mysql復(fù)制原理
(1) 主節(jié)點將數(shù)據(jù)改變放入binlog日志
(2) 從節(jié)點會定時去檢測binlog是否改變,如果發(fā)生改變,則開始一個I/O Thread 請求主節(jié)點二進制事件
(3) 同時主節(jié)點每個I/O線程啟動一個dump線程,用于向其發(fā)送二進制事件,并保存至從節(jié)點本地的中繼日志中,從節(jié)點將啟動SQL線程從中繼日志中讀取二進制事件,在本地重放,使得其數(shù)據(jù)與主節(jié)點保持一致,最后I/O Thread 和SQLThread 將進入休眠狀態(tài) 等待下一次喚醒
也就是說:
- 從庫會生成兩個線程 一個 I/O Thread 、一個SQL Thread
- I/O Thead 會去請求主節(jié)點的binlog 并將得到的binlog寫到本地的replay-log(中繼日志)中
- 主節(jié)點會生成一個log dump 線程,用來給從節(jié)點的I/O 線程傳遞binlog
- SQL線程會讀取replay-log 文件中的日志,并解析成sql 語句 主句執(zhí)行
注意:
其中I/O線程負責讀取主節(jié)點的binlog內(nèi)容到replay-log中
Sql線程負責從replay-log中讀取內(nèi)容 并更新到從節(jié)點中
具體步驟:
4、Mysql主從復(fù)制形式
一主一從
主主復(fù)制
一主多從
多主一從
聯(lián)級復(fù)制
5、主從復(fù)制安裝配置
如果 Slave_IO_Running Slave_SQL_Running 不是yes可以考慮是不是防火墻沒有關(guān)閉
我操作關(guān)閉了主節(jié)點和從節(jié)點的防火墻 service iptables stop
7、此時可以在主服務(wù)器進行相關(guān)的數(shù)據(jù)添加刪除工作,在從服務(wù)器看相關(guān)的狀態(tài)
5、Mysql主從同步延時分析
- mysql的主從復(fù)制都是單線程操作,主庫對所有的DDL和DML產(chǎn)生的日志寫進binlog,
- 由于binlog是順序?qū)懙?#xff0c;所以效率很高
- slave的sql thread 將主庫的DDL DML 操作事件在slave中重放,DML和DDL 的IO 操作是隨機的,不是順序的,所以成本高
- 由于sql thread 也是單線程的,當主數(shù)據(jù)庫并發(fā)較高時,產(chǎn)生的DML 數(shù)據(jù)量超過slave的SQL thread 所處理的的速度,或者當slave中有大型的query語句產(chǎn)生了等待,那么延時就產(chǎn)生了
解決方案:
mysql5.7之前
mysql5.7之后 不存在了 MTS enhanced multi-threaded slave 號稱解決了延時問題
具體技術(shù)沒有看
6、讀寫分離
讀寫分離介紹:
Mysql讀寫分離基本原理是讓master數(shù)據(jù)庫處理寫操作,slave數(shù)據(jù)庫處理讀操作
master將寫操作變更到各個slave節(jié)點
Mysql讀寫分離提高性能的原因在于 :
(1) 物理服務(wù)器增加 機器處理能力提升,拿硬件換性能
(2) 主從只負責各自的讀和寫 極大程度緩解了共享鎖和排它鎖爭用
(3)slave可以配置myisam引擎 提升查詢性能以及節(jié)約系統(tǒng)開銷
(4)master直接寫是并發(fā)的,slave通過主庫發(fā)送過來的binlog恢復(fù)數(shù)據(jù)是異步的
(5)slave可以單獨設(shè)置一些屬性來提升性能
(6)增加冗余 提高可用性
- Mysql Proxy
使用比較少
5.創(chuàng)建文件 并添加內(nèi)容 mysql-proxy.conf
cd /opt/mysql-proxy/conf vim mysql-proxy.conf --添加 [mysql-proxy] user=root proxy-address=192.168.2.127:4040 proxy-backend-addresses=192.168.2.125:3306 proxy-read-only-backend-addresses=192.168.2.126:3306 proxy-lua-script=/opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua log-file=/opt/mysql-proxy/logs/mysql-proxy.log log-level=debug daemon=true給mysql-proxy.conf 660權(quán)限
chmod 660 mysql-proxy.conf6.開啟mysql-proxy
mysql-proxy --defaults-file=/opt/mysql-proxy/conf/mysql-proxy.conf報錯:
/opt/mysql-proxy/bin/mysql-proxy: /opt/mysql-proxy/libexec/mysql-proxy: /lib/ld-linux.so.2: bad ELF interpreter: 沒有那個文件或目錄解決:
yum install glibc.i686 -y mysql-proxy --defaults-file=/opt/mysql-proxy/conf/mysql-proxy.confcd /opt/mysql-proxy/logstail -f -n100 mysql-proxy.log
這個時候可以連接
host:192.168.2.127
port:4040
user:root
password:123456
- amoeba
什么是amoeba
? Amoeba(變形蟲)項目,專注 分布式數(shù)據(jù)庫 proxy 開發(fā)。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、sql過濾、讀寫分離、可路由相關(guān)的query到目標數(shù)據(jù)庫、可并發(fā)請求多臺數(shù)據(jù)庫合并結(jié)果。
主要解決:
? 降低 數(shù)據(jù)切分帶來的復(fù)雜多數(shù)據(jù)庫結(jié)構(gòu)
? 提供切分規(guī)則并降低 數(shù)據(jù)切分規(guī)則 給應(yīng)用帶來的影響
? 降低db 與客戶端的連接數(shù)
? 讀寫分離
為什么要用Amoeba
目前要實現(xiàn)mysql的主從讀寫分離,主要有以下幾種方案:
1、 通過程序?qū)崿F(xiàn),網(wǎng)上很多現(xiàn)成的代碼,比較復(fù)雜,如果添加從服務(wù)器要更改多臺服務(wù)器的代碼。
2、 通過mysql-proxy來實現(xiàn),由于mysql-proxy的主從讀寫分離是通過lua腳本來實現(xiàn),目前l(fā)ua的腳本的開發(fā)跟不上節(jié)奏,而寫沒有完美的現(xiàn)成的腳本,因此導(dǎo)致用于生產(chǎn)環(huán)境的話風險比較大,據(jù)網(wǎng)上很多人說mysql-proxy的性能不高。
3、 自己開發(fā)接口實現(xiàn),這種方案門檻高,開發(fā)成本高,不是一般的小公司能承擔得起。
4、 利用阿里巴巴的開源項目Amoeba來實現(xiàn),具有負載均衡、高可用性、sql過濾、讀寫分離、可路由相關(guān)的query到目標數(shù)據(jù)庫,并且安裝配置非常簡單。
3.amoeba安裝
3、配置amoeba的配置文件
cd /opt/amoeba-mysql-3.0.5-RC/conf vim dbServers.xml 刪除所有內(nèi)容(d+G(大寫G)) 復(fù)制下邊內(nèi)容到文件中dbServers.xml
<?xml version="1.0" encoding="gbk"?><!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd"> <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/"><!--abstractServer 名字隨便起 下邊會用 --><dbServer name="abstractServer" abstractive="true"><factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"><property name="connectionManager">${defaultManager}</property><property name="sendBufferSize">64</property><property name="receiveBufferSize">128</property><!-- mysql port --><property name="port">3306</property><!-- mysql schema --><property name="schema">hhei</property><!-- mysql user --><property name="user">root</property><property name="password">123456</property></factoryConfig><poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool"><property name="maxActive">500</property><property name="maxIdle">500</property><property name="minIdle">1</property><property name="minEvictableIdleTimeMillis">600000</property><property name="timeBetweenEvictionRunsMillis">600000</property><property name="testOnBorrow">true</property><property name="testOnReturn">true</property><property name="testWhileIdle">true</property></poolConfig></dbServer><!--parent 會繼承abstractServer的所有屬性 writedb也是隨便寫的名字 后邊配置文件會用 --><dbServer name="writedb" parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.2.125</property></factoryConfig></dbServer><!--parent 會繼承abstractServer的所有屬性 slave也是隨便寫的名字 后邊配置文件會用 --><dbServer name="slave" parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.2.126</property></factoryConfig></dbServer><!-- 配置節(jié)點屬性 這個 myslave會在下邊配置成讀節(jié)點 --><dbServer name="myslave" virtual="true"><poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"><!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--><property name="loadbalance">1</property><!----><property name="poolNames">slave</property></poolConfig></dbServer> </amoeba:dbServers>amoeba.xml
cd /opt/amoeba-mysql-3.0.5-RC/conf vim amoeba.xml 刪除所有內(nèi)容(d+G(大寫G)) 復(fù)制下邊內(nèi)容到文件中 <?xml version="1.0" encoding="gbk"?><!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd"> <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/"><proxy><service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService"><!-- port --><property name="port">8066</property><property name="connectionFactory"><bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory"><property name="sendBufferSize">128</property><property name="receiveBufferSize">64</property></bean></property><property name="authenticateProvider"><bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"><property name="user">root</property><property name="password">123456</property><property name="filter"><bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController"><property name="ipFile">${amoeba.home}/conf/access_list.conf</property></bean></property></bean></property></service><runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext"><!-- proxy server client process thread size --><property name="executeThreadSize">128</property><!-- per connection cache prepared statement size --><property name="statementCacheSize">500</property><!-- default charset --><property name="serverCharset">utf8</property><!-- query timeout( default: 60 second , TimeUnit:second) --><property name="queryTimeout">60</property></runtime></proxy><!-- Each ConnectionManager will start as threadmanager responsible for the Connection IO read , Death Detection--><connectionManagerList><connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper"><property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property></connectionManager></connectionManagerList><!-- default using file loader --><dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader"><property name="configFile">${amoeba.home}/conf/dbServers.xml</property></dbServerLoader><queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"><property name="ruleLoader"><bean class="com.meidusa.amoeba.route.TableRuleFileLoader"><property name="ruleFile">${amoeba.home}/conf/rule.xml</property><property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property></bean></property><property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property><property name="LRUMapSize">1500</property><property name="defaultPool">writedb</property><!--寫節(jié)點--><property name="writePool">writedb</property><!--讀節(jié)點--><property name="readPool">myslave</property><property name="needParse">true</property></queryRouter> </amoeba:configuration>啟動
cd /opt/amoeba-mysql-3.0.5-RC/bin ./launcher 報錯: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=16m; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=96m; support was removed in 8.0The stack size specified is too small, Specify at least 228k (至少228)解決: cd /opt/amoeba-mysql-3.0.5-RC vim jvm.properties 修改-Xss265k JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss265k -XX:PermSize=16m -XX:MaxPermSize=96m"安裝成功 測試
連接: mysql -h192.168.2.127 -uroot -p123456 -P8066 開始為所欲為: 在這里 寫會走master 讀會走slave 測試方式: 查詢 數(shù)據(jù)來自slave(可以提前在slave庫上新增幾條與master不一樣數(shù)據(jù)) 新增數(shù)據(jù)是走的master(關(guān)閉master就不能新增了)這個是真正的 master寫 slave讀Mycat
Mycat數(shù)據(jù)庫分庫分表中間件
活躍的、性能好的開源數(shù)據(jù)庫中間件!
http://www.mycat.org.cn/
后續(xù)再寫Mycat使用方式
總結(jié)
以上是生活随笔為你收集整理的mysql优化 个人笔记 (mysql 主从复制 ) 非礼勿扰 -m11的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vivado笔记
- 下一篇: 【日常开发必备】1.5W+字的 MySQ