一、下載安裝mysql(在5.6上作的驗證);
java
Linux上默認安裝目錄:/usr/share/mysql,安裝後能夠經過mysql -u root -p登陸mysql:mysql
二、配置master
sql
a) 將安裝後的mysql目錄下的my.cnf拷貝到Linux的配置環境/etc/目錄下。
數據庫
b) 修改my.cnf配置:網絡
server-id = 1 #主機標示,整數ide
log-bin = master-bin.log #slave複製日誌文件測試
log-bin-index = master-bin.indexthis
binlog-do-db =db_test #須要同步到slave的數據庫spa
binlog-ignore-db =mysql #不須要同步的數據庫日誌
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
配置完後重啓mysql後會在數據庫目錄/var/lib/mysql生成相應的日誌文件:
c) 經過show master status語句查看master信息
紅框中就是slave中須要複製的文件以及開始同步數據的起始位置。
d)在master上建立用戶備份的用戶並賦值REPLICATION SLAVE權限,用於slave鏈接master
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.63.%' IDENTIFIED BY 'slave';
--可用show grants for 'backup'@'192.168.63.%';查詢用戶具備的權限
三、配置slave環境
a) 同理經過修改從庫中的my.cnf配置:
port=3307
server-id = 3
log-error=slave_log.err
log-bin =slave_log.log
report-host = 192.168.63.176 #master地址
report-port = 3306 #master端口
report-user = slave #鏈接master用戶
report-password = slave #鏈接master用戶密碼
binlog-do-db =db_test
replicate-do-db =db_test
binlog-ignore-db=mysql
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
replicate-ignore-db=test
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
b) 查看slave的相關狀態
經過配置slave鏈接master主機的report-host、user好像沒用,後面經過sql語句從新賦值鏈接到master的相關配 置(執行sql以前須要stop slave):
change master to master_host='192.168.63.176',master_user='slave',
-> master_password='slave',
-> master_log_file='master_log.000006',
-> master_log_pos=120;
執行以上語句後會在mysql安裝目錄下生成master.info文件,文件中包含了鏈接到master的地址、用戶名、密碼、複製 文件以及複製的起始位置等。
c) 查看slave的狀態
經過show slave status查看slave鏈接狀態:
備註:這次是經過Linux做爲master,本機上的msyql做爲slave測試的;剛開始配置是網絡有問題一直slave鏈接master 失敗,最後把防火牆關閉後就能連上了。能夠經過mysql -uslave -pslave -h192.168.63.176;語句測試可否鏈接到主服務 器上的數據庫
四、測試
a) 在master上建立分區表user,安裝userid作hash分區:
b) 查看slave庫可見已同步了master中剛建立的user表
五、擴展HA-MYSQL
經過Keepalived構建高可用的mysql服務;配置mysql互爲主從,而後利用Keepalived監控功能,對掛掉的數據庫服 務動態切換。
六、基於Spring的AbstractRoutingDataSource抽象類實現動態路由數據源(也能夠基於其餘第三方包實現ds的路由)
public class MultipleRoutingDataSource extends AbstractRoutingDataSource { /** * 寫數據庫服務 */ private Object writeDataSource; /** * 讀數據庫服務 */ private List<Object> readDataSources; private int counter = 0; public void setReadDataSources(List<Object> readDataSources) { this.readDataSources = readDataSources; } public void setWriteDataSource(Object writeDataSource) { super.setDefaultTargetDataSource(writeDataSource); this.writeDataSource = writeDataSource; } @Override protected Object determineCurrentLookupKey() { String routing = RoutingDataSourceUtil.getRouting(); if(DSEnum.READ_ONLY.getCode().equals(routing)) { synchronized (this) { int index = counter % readDataSources.size(); counter++; return readDataSources.get(index); } } return writeDataSource; } }