centos7.2下mysql的主從復制與讀寫分離:
1.為什么要配置數據庫集群和主從復制
一些大型的項目,由於訪問並發量的增多會導致數據庫的壓力倍增,利用redis緩存減少數據庫的壓力,從而提升數據庫的效率單個數據庫同時負責讀寫任務,底層可能會出現鎖的現象:同步鎖,事務鎖,樂觀鎖,悲觀鎖,單個數據庫同時負責讀寫,效率還是不高;配置主從可以分擔數據庫的壓力,進行讀寫分離,所有的數據庫插入,修改等寫入操作從主庫進行,所有的數據查詢等讀取操作走從庫,這樣就分擔了單一數據庫的運行壓力。
2.實現原理:
配置主從結構先在主上打開一個二進制日志的文件(Binary.log),在master寫操作時,就會把寫的命令存入到這個二進制文件中(insert,update,delete),slave開啟一個IO線程,線程定時讀取主節點的二進制文件,將新的命令抓取過來
存放到本地一個中繼日志中(relay.log);slave上還有一個定時啟動的線程叫sql,監控本地的中繼日志,一旦有新的命令發現,將會把中繼日志中的命令執行一遍。這樣一來,主從結構就完成了數據的備份;
3.安裝linux的mysql(percona
1.安裝cmake(如果使用虛擬機鏡像無需本步操作)
#yum -y install cmake
2.更新yum
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rp
3.安裝
yum install Percona-Server-client-56 Percona-Server-server-56
安裝如果有沖突,之前已經安裝過mysql,則需要卸載
rpm -qa | grep mysql
如果有mysql軟件的話,將其刪除,執行
yum remove .....將軟件包全部都刪除掉。
4.安裝完成后檢查兩點,一個是/etc/my.cnf存在不存在,一個是/var/lib/mysql目錄中有沒有mysql數據文件,如果有,那么基本上安裝成功了。
5.啟動mysql服務
運行命令:systemctl start mysql.service
成功后,查看mysql運行狀態,systemctl status mysql.service后如下圖:
6.修改mysql的密碼
此時mysql並沒有設置初始密碼,所以先設置密碼,進入mysql中(終端直接輸入mysql即可):
mysql> use mysql;
mysql> update user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges;
然后重啟mysql服務,重新登錄
mysql -uroot -p123 即可。
7.開啟遠程連接mysql服務器
a.開啟之前一定要確定自己開放了3306端口,或者完全關閉掉防火牆,否則遠程無法連接。(關閉防火牆或者開放端口,請百度)
b.創建數據庫文件,例如,這里直接導入一個sql文件(之后主從復制會用到,導入sql文件,在mysql下直接輸入命令,source 路徑/xx.sql)
c.默認安裝的msql沒有開啟遠程訪問,所以要設置一個權限。
mysql>grant all on *.* to 'root'@'%' identified by 'root';
執行成功后,就可以在遠程客戶端連接試試看了,這里我使用的是mysqlworkbeach,如下:
以上操作,分別在兩台虛擬機中進行,操作一模一樣。
8.配置數據庫的主從關系
配置主服務器
編輯主master服務器配置文件/etc/my.cnf
在[mysqld]節點下加入兩句話
server-id=1
log-bin=mysql-bin #啟用二進制日志;
然后重啟服務:systemctl restart mysql.service
登錄mysql:mysql –uroot -proot
mysql>flush tables with read lock; #數據庫鎖表,不讓寫數據;這步驟可不做
對於當前環境的mysql無需使用lock命令,因為沒有人操作,但是生產環境中必須這樣做
mysql>show master status; #查看MASTER狀態(這兩個值File和Position)其中的file就是二進制文件,position記錄當前操作sql的步驟數(注意一條sql包含多步,所以不是sql語句的條數)
因為我對數據庫主從已經操作過了,所以會記錄一些步驟數,一般情況下,第一次顯示position的數量是120
配置從服務器
修改/etc/my.cnf增加一行
server-id=2
然后重啟服務器
systemctl restart mysql.service
通過mysql命令配置同步日志的指向:
mysql>change master to master_host=‘192.168.41.41’, 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中使用
systemctl restart mysql.service #重啟服務
9.此時主從復制就配好了,現在來測試一下吧!!
第一步:在主表中創建一個數據表(表名什么都可以,測試用嘛),然后插入數據,如下:
此時觀察從表,刷新,哎,卧槽,有數據了,說明從庫已經從主庫讀取並寫入了。
第二步:在主表和從表中插入一樣的數據,例如在主,從表分別中插入:id =3 name=clearlove,然后查看,嗯,全部都插入成功了,此時再看從表slave狀態,卧槽??掛了?
此時,slave_io_running成no了,掛了。為什么?
因為從表要從主表讀取數據,主從都有了,我還讀你xxx啊?
此時,再改主表數據也沒用了,主從都掛了,能有用嗎?怎么辦?重新掛接唄!!
錯誤數據必須清除否則繼續主從失效,查看主節點中的二進制文件名稱 pos,但是先停止從節點的從狀態stop slave
1.查看主節點中二進制文件pos,怎么查看呢?這樣show master status;
2.在從節點中把查詢出來的最新數據放到命令里掛接主節點
啟動從節點的slave
start slave
此時再看下:ok!!!
但是這個時候發現id為3的對應b1字段的值沒有改。所以mysql雖然支持主從關系但是並沒有維護讀寫分離的狀態。
10.安裝配置amoeba
步驟1: 安裝jdk
amoeba基於jdk環境所以需要安裝jdk(網上百度吧!!)
步驟2: 安裝amoeba
wget https://jaist.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.0.1-BETA.tar.gz
然后解壓: tar -xf amoe......
步驟3: 配置讀寫分離
1.配置conf/dbService.xml
修改用戶名和密碼
配置主從的名稱和ip地址
配置負載均衡的策略
這個xml文件配置基本結束了,接下來配置amoeba.xml,核心的配置文件,將要加載dbServer.xml才能使用其中的配置,才能使負載均衡有效果
2.配置amoeba.xml
配置ip地址;(192.168.41.41為你主機的ip地址,amoeba主從主需要配置一台即可)
寫上root密碼
繼續配置寫池使用master,讀池使用multiPool
注意:此時基本上配置完了,但是amoeba基於java做的,對java有個小要求,最少的stack size太少 棧的size太小java默認128K,所以還要修改下棧的size,修改啟動文件/bin/amoeba,修改為256.如下:
這樣就配置完成了。啟動下吧!!
輸入 ./amoeba start
最后,本地連接下吧!!
ok,全部配置成功了!!注意,要開啟8066端口或者要關閉防火牆,否則外面訪問不到啊!!