生活随笔
收集整理的這篇文章主要介紹了
互联网架构阶段 数据库读写分离 Amoeba
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫的讀寫分離
一 、電商項目中數據庫瓶頸
使用redis緩存減小數據庫的壓力 , 從而提升數據庫的效率單個數據庫同時負責讀寫操作 , 底層可能會出現鎖的現象: 同步鎖 , 事務鎖 , 樂觀鎖 , 悲觀鎖單個數據庫同時負責讀寫操作 , 效率還是不高 , 所以引入了數據庫的集群 , 盡可能的減少鎖的存在 , 利用集群的不同數據完成讀和寫的分離引入讀寫分離的主從結構
主: 寫數據從: 備份數據 , 被讀數據Master和slave的主從復制過程
master負責寫數據 , slave負責更新數據 , 需要同步實現原理:
配置主從結構先在主上打開一個二進制日志的文件(Binary.log),在master寫操作時,就會把寫的命令存入到這個二進制文件中(insert,update,delete)slave開啟一個IO線程,線程定時讀取主節點的二進制文件,將新的命令抓取過來存放到本地一個中繼日志中(relay.log);slave上還有一個定時啟動的線程叫sql,監控本地的中繼日志,一旦有新的命令發現,將會把中繼日志中的命令執行一遍這樣一來,主從結構就完成了數據的備份;
二、 安裝linux版的mysql(percona)
可以實現最終一致性回憶CAP理論:
數據一致性是強一致性的 , 完美一致性 —- 分布式系統中 , 任何一個時間點 , 所有的系統數據均相同 。 但是并不是所有的情景都需要滿足數據強一致性 。
比如: 搶購 , 并不是要求前臺的搶單數據立刻和數據庫的最終搶到的結果一致 , 而是先給你一個反饋, 數據并沒有實現一致 , 在一段時間后再去完成一致性 。 這就是數據庫的弱一致性(最終一致性是弱一致性中的一種, 允許系統間的數據在某一個時間點不同 , 但是一段時間后會想通 。)支付寶花掉銀行卡的錢時必須使用強一致性 。 安裝procona , 實現mysql主從結構(一個主節點 , 一個從節點)
安裝cmake也可以使用 yum -y install cmake (-y表示在安裝過程中所有的問答都是yes , 比較省事)將Percona版的mysql上傳到linux中 , 移動到自己的管理目錄(我自己習慣新建一個software管理)中后解壓 (tar -xvf 需要解壓的壓縮包) 。在管理目錄中新建一個mysql目錄, 將剛剛解壓出來的rpm文件存放 進去在mysql目錄下安裝rpm文件
依次執行 , 順序不能亂
rpm -ivh Percona-Server-56-debuginfo-5.6.24-rel72.2.el6.x86_64.rpm
rpm -ivh Percona-Server-shared-56-5.6.24-rel72.2.el6.x86_64.rpm
rpm -ivh Percona-Server-client-56-5.6.24-rel72.2.el6.x86_64.rpm
rpm –ivh Percona-Server-server-56-5.6.24-rel72.2.el6.x86_64.rpm
安裝第四個的時候如果出現問題則需要安裝libaio(使用yum install libaio下載并安裝 ) 然后重新執行第四部即可 。
執行完成之后 , 檢查兩點
/etc/profile下有沒有my.cnf文件/var/lib/mysql目錄中有沒有mysql數據文件啟動mysql服務檢查 mysql是否啟動成功還可以通過命令執行停止(stop)或重啟服務(restart)修改mysql密碼(在安裝完 成之后 , 默認是沒有密碼的 直接輸入mysql 即可 進入客戶端, 需要手動設置密碼)使用mysqladmin -u 用戶名 password 密碼測試密碼設置成功開啟3306端口(/sbin/iptables -I INPUT -p tcp –dport 3306 -j ACCEPT) 或者直接關閉防火墻(生產環境下千萬別這樣 , 安全系數太低)查看防火墻狀態 上傳數據庫文件 登錄mysql客戶端, 設置數據庫編碼后倒入sql文件使用查詢語句檢查數據是否正確默認安裝的mysql沒有外部訪問權限 , 需要開啟訪問權限(grant [權限] on [數據庫名].[表明] to [用戶名]@‘[web服務器的IP地址]’ identified by ‘[密碼]’;)按照以上配置在配置一臺linux主機 , 接下來配置主從數據庫配置主從關系
選擇一臺服務器為主服務器(master) ,編輯master服務器的配置文件/etc/my.cnf在[mysqlId]結點下加入兩句話 重啟服務 : service mysql restart不讓寫數據 , 數據庫鎖表 mysql>flush tables with read lock;查看master結點的狀態(其中file就是指的二進制日志文件 , position指的是記錄當前操作sql的步驟數(不是sql條數, 一條sql可能包含多步))記下position配置從節點需要使用配置從節點編輯/etc/my.cnf 加一行 server-id=2重啟從結點 service mysql restart通過mysql命令配置同步日志的指向:
mysql>change master to master_host='106.75.74.254', master_port=3306,
master_user='root',master_password='root',
master_log_file='mysql-bin.000001',
master_log_pos=120;
其中:
master_host 主服務器的IP地址(內網地址)
master_port 主服務器的PORT端口
master_log_file 和主服務器show master status中的File字段值相同
master_log_pos 和主服務器show master status中的Position字段值相同
在從節點中開啟主從復制命令
mysql>start slave; #stop slave;停止服務,出錯時先停止,再重新配置mysql>show slave status\G; #查看SLAVE狀態,\G結果縱向顯示。必須大寫,這個命令無法再sqlyog中使用service mysql restart #重啟服務
從節點啟動之后 ,主節點記得解除鎖定(mysql>unlock tables;)
測試主節點 , 從節點 同步狀態:
向主節點寫入數據 , 后觀察從節點主節點的數據被同步復制向從節點中寫入數據 , 觀察主節點數據沒有被復制 , 查看slave狀態(show slave status)發現主從結構被破壞 , sql線程已經停止此時需要從新掛載從節點先清除錯誤數據 觀察主節點pos(show master status )從新執行掛載命令
mysql>change master to master_host='106.75.74.254', master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001', master_log_pos=120;
在從節點中從新啟動主從結構(start slave)結論: 雖然mysql支持主從關系 , 但是并沒有維護讀寫分離的狀態主從配置完成 , 但是沒有實現讀寫分離 , 從節點不能防止寫入數據 。
三 、 amoba
實現的功能
讀寫分離(主從復制 + 分離)負載均衡自定義函數分庫分表 (能夠平均分配對數據訪問的壓力)
分庫分表雖然能夠完成, 但是會導致查詢時的sql十分繁瑣 。 但是對sql語句中的各種分庫分表的常用語句進行封裝成函數 , 將查詢條件按照參數給對應的函數 , 獲取查詢的數據
四、 amoeba安裝
amoeba是基于java環境的 , 所以需要事先安裝jdk環境
上傳linux環境下的JDK文件 , 并解壓配置環境變量 , 并使環境變量 生效獲取amoeba資源 , 并上傳至master所在 的服務器解壓安裝
配置讀寫分離
修改配置文件 cd到conf中 vim dbServer.xml
dbServers.xml
<dbServer name="abstractServer" abstractive="true">
類似一個總代理 抽象服務器<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">amoeba管理的是數據庫集群,需要一個當前總代理負責的數據庫池的配置信息<dbServer name="server1" parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">127.0.0.1</property></factoryConfig>
</dbServer>
在dbServer中根據數據庫節點配置相關信息,有多少個節點,就配置多少個dbServer的標簽
主要修改一下配置: 第26 、28行設置amoeba的用戶名和登錄密碼(為了方便 , 都改為root)43 、 46行配置主數據庫的名字(一般設置為master代表主節點)和地址50 、 53 行配置從節點的名字(一般為slave序號)和地址配置主從數據庫工作策略
<dbServer name="multiPool" virtual="true"><poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"><!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->//這里給了3個負載均衡策略 1 輪詢2 權重3 高可用<property name="loadbalance">1</property>//這里我們使用輪詢<!-- Separated by commas,such as: server1,server2,server1 --><property name="poolNames">slave,slave,master,slave,slave</property>//配置輪詢的節點順序</poolConfig>
</dbServer>
此時amoeba主從數據庫IP和訪問策略已經配置完畢接下來配置amoeba讀寫分離配置amoeba.xml是amoeba的核心配置文件 , 啟動時會加載dbServer.xml使用其中的配置 ,才能實現負載均衡的效果 。 第10行配置訪問amoeba的端口 , 默認為8066配置訪問amoeba時的用戶名和密碼配置讀寫分離 , 主節點為做寫數據的結點 , 從節點用于承載查詢時的壓力 配置文件完成 , 啟動amoeba之前需要開發8066端口或者關閉防火墻 后再bin目錄下執行 ./launcher start & g 發現報錯 , 原因是amoeba對java環境的要求最小棧為228k , 而java默認的最小棧為128k , 所以需要修改amoeba的配置文件(添加一行DEFAULT_OPTS=”$DEFAULT-OPTS -server -Xms256m -Xmx256m -Xss256k”) 重新執行啟動命令(在amoeba的bin目錄下執行./launcher start &)將JDBC連接數據庫的地址改為amoeba所在的主機地址 , 端口改為8066 , 此時由amoeba代理的mysql集群已經實現了負載均衡和讀寫分離
總結
學習完成tomcat集群 、 niginx 、redis集群 、 amoeba 、 mysql主從復制+讀寫分離之后 ,一個高可用的架構已經呈現
問題 :
測試 server-id相同的情況下 , 會發生什么問題
總結
以上是生活随笔為你收集整理的互联网架构阶段 数据库读写分离 Amoeba的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。