一、下载安装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; } }