1. 程式人生 > 其它 >EBS: 編譯科目:APP-FND-00668: 用於在此欄位中定義彈性域的資料可能不一致

EBS: 編譯科目:APP-FND-00668: 用於在此欄位中定義彈性域的資料可能不一致

目錄: 1、主從複製   Mysql的複製型別   Mysql主從複製的工作過程 2、讀寫分離   什麼是讀寫分離   為什麼要讀寫分離   什麼時候要讀寫分離   主從複製與讀寫分離   mysql支援的複製型別   主從複製的工作過程   mysql讀寫分離原理     常見的2種讀寫分離   實驗  

主從複製

MySQL的複製型別:

基於語句的複製(STATEMENT, MySQL預設型別) 基於行的複製(ROW) 混合型別的複製(MIXED)  

MySQL主從複製的工作過程:

兩日誌、三執行緒 (1)在每個事務更新資料完成之前,Master 在二進位制日誌(Binary log)記錄這些改變。寫入二進位制日誌完成後,Master 通知儲存引擎提交事務。 (2)Slave 將 Master 的複製到其中繼日誌(Relay log)。首先slave 開始一個工作執行緒(I/O),I/O執行緒在 Master 上開啟一個普通的連線,然後開始 Binlog dump process。Binlog dump process 從 Master 的二進位制日誌中讀取事件,如果已經跟上 Master,它會睡眠並等待 Master 產生新的事件,I/O執行緒將這些事件寫入中繼日誌。 (3)SQL slave thread(SQL從執行緒)處理該過程的最後一步,SQL執行緒從中繼日誌讀取事件,並重放其中的事件而更新 Slave 資料,使其與 Master 中的資料一致,只要該執行緒與 I/O 執行緒保持一致,中繼日誌通常會位於 OS 快取中,所以中繼日誌的開銷很小。 複製過程有一個很重要的限制,即複製在 Slave 上是序列化的,也就是說 Master 上的並行更新操作不能在 Slave 上並行操作。 注: 中繼日誌通常會位於 OS 快取中,所以中繼日誌的開銷很小。 複製過程有一個很重要的限制,即複製在 Slave上是序列化的,也就是說 Master上的並行更新操作不能在 Slave上並行操作。

實驗:

主:192.168.63.100 從:192.168.63.130 192.168.63.150   主:關閉防火牆和增強性安全功能 systemctl stop firewalld.service setenforce 0 安裝ntp、修改配置檔案 yum install ntp -y #安裝ntp軟體   vim /etc/ntp.conf #編輯配置檔案   disable monitor server 192.168.63.0 #設定本機為時間同步源 fudge 192.168.63.0 stratum 8 #設定本機的時間層級為8級,0級表示時間層級為0級,是向其他伺服器提供時間同步源的意思,不要設定為0級   service ntpd start #開啟ntp   從:安裝ntp、ntpdate服務 yum install ntp ntpdate -y service ntpd start /usr/sbin/ntpdate 192.168.63.100   crontab -e */30 * * * * /usr/bin/ntpdate 192.168.63.100   主: 配置主從同步 master伺服器修改配置檔案: vim /etc/my.cnf server-id = 1 ##主伺服器id為1(不可重複) log-bin=master-bin #開啟二進位制日誌檔案(之後生成的日誌名為master-bin) binlog_format = MIXED log-slave-updates=true #開啟從伺服器日誌同步   systemctl restart mysqld 配置規則:   mysql -uroot -p123123   GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.63.%' IDENTIFIED BY'123123'; flush privileges;   #檢視master資料庫狀態 show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 603 | | | | +-------------------+----------+--------------+------------------+-------------------+   從: vim /etc/my.cnf   server-id = 2 ###第三臺記得換成3 relay-log=relay-log-bin #開啟二進位制日誌檔案 relay-log-index=slave-relay-bin.index #定義relay-log的位置和名稱(index索引) relay_log_recovery = 1 #當 slave 從庫宕機後,假如 relay-log損壞了,導致一部分中繼日誌沒有處理,則自動放棄所有未執行的 relay-log,並且重新從master 上獲取日誌,這樣就保證了relay-log 的完整性。預設情況下該功能是關閉的,將relay_log_recovery 的值設定為 1時, 可在 slave 從庫上開啟該功能,建議開啟。   systemctl restart mysqld   mysql -uroot -p123123   CHANGE master to -> master_host='192.168.63.100',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=603; #配置同步,注意master_log_file和master_log_pos的值要與master查詢的一致 start slave; show slave status\G Slave_IO_Running:yes #負責與主機的io通訊 Slave_SQL_Running:yes #負責自己的slave mysql程序   一般Slave_IO_Running:no 的可能性 1、網路不通 2、my.cnf配置有問題 3、密碼、file檔名、pos偏移量不對 4、防火牆沒有關閉   驗證: 主: create database test9999; 從:show databases;   擴: mysql架構: 一主多備   M-S-S中繼 M-M雙主互備(互為主從) M-M-M M-G-R  

讀寫分離

縱向是提高配置,橫向是叢集化 橫向:資料提供共享,壓力可以分攤   半同步複製 讀寫分離優化一種,處理高併發 什麼是讀寫分離 讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。  

為什麼要讀寫分離呢?

因為資料庫的“寫”(寫10000條資料可能要3分鐘)操作是比較耗時的。 但是資料庫的“讀”(讀10000條資料可能只要5秒鐘)。 所以讀寫分離,解決的是,資料庫的寫入,影響了查詢的效率。  

什麼時候要讀寫分離

資料庫不一定要讀寫分離,如果程式使用資料庫較多時,而更新少,查詢多的情況下會考慮使用。利用資料庫主從同步,再通過讀寫分離可以分擔資料庫壓力,提高效能。  

主從複製與讀寫分離

在實際的生產環境中,對資料庫的讀和寫都在同一個資料庫伺服器中,是不能滿足實際需求的。無論是在安全性、高可用性還是高併發等各個方面都是完全不能滿足實際需求的。因此,通過主從複製的方式來同步資料,再通過讀寫分離來提升資料庫的併發負載能力。有點類似於rsync,但是不同的是rsync是對磁碟檔案做備份,而mysql主從複製是對資料庫中的資料、語句做備份。  

mysq支援的複製型別

(1)STATEMENT:基於語句的複製。在伺服器上執行sql語句,在從伺服器上執行同樣的語句,mysql預設採用基於語句的複製,執行效率高。 (2)ROW:基於行的複製。把改變的內容複製過去,而不是把命令在從伺服器上執行一遍。 (3)MIXED:混合型別的複製。預設採用基於語句的複製,一旦發現基於語句無法精確複製時,就會採用基於行的複製。  

主從複製的工作過程

(1)Master節點將資料的改變記錄成二進位制日誌(bin log),當Master上的資料發生改變時,則將其改變寫入二進位制日誌中。 (2)Slave節點會在一定時間間隔內對Master的二進位制日誌進行探測其是否發生改變,如果發生改變,則開始一個I/O執行緒請求 Master的二進位制事件。 (3)同時Master節點為每個I/O執行緒啟動一個dump執行緒,用於向其傳送二進位制事件,並儲存至Slave節點本地的中繼日誌(Relay log)中,Slave節點將啟動SQL執行緒從中繼日誌中讀取二進位制日誌,在本地重放,即解析成 sql 語句逐一執行,使得其資料和 Master節點的保持一致,最後I/O執行緒和SQL執行緒將進入睡眠狀態,等待下一次被喚醒。 注: 中繼日誌通常會位於 OS 快取中,所以中繼日誌的開銷很小。 複製過程有一個很重要的限制,即複製在 Slave上是序列化的,也就是說 Master上的並行更新操作不能在 Slave上並行操作。   mysql主從複製延遲出現的問題: 1、master伺服器高併發,形成大量事務 2、網路延遲 3、主從硬體裝置導致 cpu主頻、記憶體io、硬碟io 4、本來就不是同步複製、而是非同步複製 從庫優化Mysql引數。比如增大innodb_buffer_pool_size,讓更多操作在Mysql記憶體中完成,減少磁碟操作。 從庫使用高效能主機。包括cpu強悍、記憶體加大。避免使用虛擬雲主機,使用物理主機,這樣提升了i/o方面性。 從庫使用SSD磁碟 網路優化,避免跨機房實現同步  

Mysql讀寫分離原理

讀寫分離就是隻在主伺服器上寫,只在從伺服器上讀。基本的原理是讓主資料庫處理事務性操作,而從資料庫處理 select 查詢。資料庫複製被用來把主資料庫上事務性操作導致的變更同步到叢集中的從資料庫。
常見的讀寫分離(2種):
1)基於程式程式碼內部實現 在程式碼中根據 select、insert 進行路由分類,這類方法也是目前生產環境應用最廣泛的。 優點是效能較好,因為在程式程式碼中實現,不需要增加額外的裝置為硬體開支;缺點是需要開發人員來實現,運維人員無從下手。 但是並不是所有的應用都適合在程式程式碼中實現讀寫分離,像一些大型複雜的Java應用,如果在程式程式碼中實現讀寫分離對程式碼改動就較大。 2)基於中間代理層實現 代理一般位於客戶端和伺服器之間,代理伺服器接到客戶端請求後通過判斷後轉發到後端資料庫,有以下代表性程式。 (1)MySQL-Proxy。MySQL-Proxy 為 MySQL 開源專案,通過其自帶的 lua 指令碼進行SQL 判斷。 (2)Atlas。是由奇虎360的Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的資料中間層專案。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas執行的mysql業務,每天承載的讀寫請求數達幾十億條。支援事物以及儲存過程。 (3)Amoeba。由陳思儒開發,作者曾就職於阿里巴巴。該程式由Java語言進行開發,阿里巴巴將其用於生產環境。但是它不支援事務和儲存過程。   由於使用MySQL Proxy 需要寫大量的Lua指令碼,這些Lua並不是現成的,而是需要自己去寫。這對於並不熟悉MySQL Proxy 內建變數和MySQL Protocol 的人來說是非常困難的。 Amoeba是一個非常容易使用、可移植性非常強的軟體。因此它在生產環境中被廣泛應用於資料庫的代理層。      

實驗:

##在有mysq主從的基礎上搭建amoeba服務配置(即完成上面的主從) master 192.168.63.100 slave1 192.168.63.130 slave2 192.168.63.150 amoeba 192.168.63.160   amoeba: 安裝JAVA環境 cd /opt/ cp jdk-6u14-linux-x64.bin /usr/local/ cd /usr/local/ chmod +x jdk-6u14-linux-x64.bin ./jdk-6u14-linux-x64.bin 輸入yes,按enter 彈窗選擇否   mv jdk1.6.0_14/ /usr/local/jdk1.6   vim /etc/profile #環境 export JAVA_HOME=/usr/local/jdk1.6 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin export AMOEBA_HOME=/usr/local/amoeba export PATH=$PATH:AMOEBA_HOME/bin source /etc/profile java -version   ##安裝amoeba軟體 tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ chmod -R 755 /usr/local/amoeba/ /usr/local/amoeba/bin/amoeba ##顯示amoeba start|stop說明安裝成功   master、slave1和2: #配置 Amoeba讀寫分離,兩個 Slave 讀負載均衡 mysql -uroot -p123123 grant all on . to test@'192.168.63.%' identified by '123123';   amoeba: ##回到amoeba伺服器配置amoeba服務 cd /usr/local/amoeba/conf/ cp amoeba.xml amoeba.xml.bak   vim amoeba.xml #修改amoeba配置檔案 30 amoeba 32 123123 115 master 116 117 #去掉註釋 118 master 119 slaves cp dbServers.xml dbServers.xml.bak   vim dbServers.xml #修改資料庫配置檔案 23 註釋掉 ##作用:預設進入test庫 以防mysql中沒有test庫時,會報錯 26 ##修改 test 刪除28-30的註釋 29 123123 45 ##修改,設定主伺服器的名Master 48 192.168.63.100 #修改,設定主伺服器的地址 52 #修改,設定從伺服器的名slave1 53 54 55 192.168.63.130 #修改,設定從伺服器1的地址 56 57 複製6行 59 #複製上面6行貼上,設定從伺服器2的名slave2和地址 60 61 62 192.168.63.150 63 64 66 72 slave1,slave2 /usr/local/amoeba/bin/amoeba start& #啟動Amoeba軟體,按ctrl+c 返回 netstat -anpt|grep java #檢視8066埠是否開啟,預設埠為TCP 8066     測試 amoeab yum install -y mariadb-server mariadb systemctl start mariadb.service 在客戶端伺服器上測試(amoeba) use test9999; #隨便進1個庫,可以自己建 create table test (id int(10)),name varchar(10),address varchar(20)); 在從伺服器上 stop slave; use test9999; 從1: insert into test values('1','zs','this_is_slave1'); 從2: insert into test values('2','ls','this_is_slave2'); 主服務上 insert into test values('3','ak','this_is_master'); 在客戶端伺服器上(amoeba) use test9999 select * from test; select * from test; ##2次結果不一樣,但是不顯示master的結果 insert into test values('4','ab','this_is_amoeba'); 主服務上 select * from test ##只會顯示主伺服器上和客戶端伺服器上的操作 在2個從伺服器上 start slave; #同步 在客戶端伺服器上(amoeba) use test9999 select * from test; select * from test; ##2次結果不一樣,並且顯示master的結果  

總結:

1、主從同步複製原理 2、讀寫分離你們使用什麼方式? amoeba代理 mycat 程式碼 sql_proxy 通過aomoba代理伺服器,實現只在主伺服器上寫,只從伺服器上讀; 主資料庫處理事務性查詢,從資料庫處理select查詢 資料庫複製被用來把事務查詢導致的變梗同步的叢集中的從資料庫   3、如何檢視主從同步 狀態是否成功 在從伺服器上內輸入show slave status\G 檢視主從資訊檢視裡面有IO執行緒的狀態資訊,還有master伺服器的IP地址、埠事務開始號。 當slave_log_Running和Slave_SQL_Running 都是yes時,表示主從同步狀態成功 4、如果I/O不是yes呢,你如何排查? 首先排查網路問題,使用ping命令檢視從伺服器是否能與主伺服器通訊,再檢視防火牆與核心防護是否關閉(增強功能) 接著檢視從伺服器slave是否開啟 2個從伺服器的server-id是否相同導致只能連線一臺 master_log_file master_log_pos的值是否跟master值一致 5、show slave status能看到哪些資訊(比較重要) IP執行緒的狀態資訊 master伺服器的IP地址、埠、事務開始的位置 最近一次的錯誤資訊與錯誤位置 最近一次的I/O報錯資訊和ID 最近一次的SQL報錯資訊和id 6、主從複製慢(延遲)會有哪些可能?怎麼解決? 主服務的負載過大,被多個睡眠或殭屍執行緒佔用,導致系統負載過大 從庫硬體比主庫差,導致複製延遲 主從複製單執行緒,如果主庫寫作併發太大,來不及傳送到從庫中,就會導致延遲,甚至丟失資料 慢SQL語句過多 網路延遲   mysql主從複製 若主和從的版本不一致,從的版本一定要高於主,保證可以向下相容 因為若主的版本更新,低版本的從是無法相容的