1、下载安装mysql(在5.6上做的验证);
Linux上默认安装目录:/usr/share/mysql,安装后可以通过mysql -u root -p登录mysql:
2、配置master
a) 将安装后的mysql目录下的my.cnf拷贝到Linux的配置环境/etc/目录下。
b) 修改my.cnf配置:
server-id = 1 #主机标示,整数
log-bin = master-bin.log #slave复制日志文件
log-bin-index = master-bin.index
binlog-do-db =db_test #需要同步到slave的数据库
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.%';查询用户具有的权限
3、配置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;语句测试能否连接到主服务 器上的数据库
4、测试
a) 在master上创建分区表user,安装userid做hash分区:
b) 查看slave库可见已同步了master中刚创建的user表
5、扩展HA-MYSQL
通过Keepalived构建高可用的mysql服务;配置mysql互为主从,然后利用Keepalived监控功能,对挂掉的数据库服 务动态切换。
6、基于Spring的AbstractRoutingDataSource抽象类实现动态路由数据源(也可以基于其他第三方包实现ds的路由)
public class MultipleRoutingDataSource extends AbstractRoutingDataSource {
/**
* 写数据库服务
*/
private Object writeDataSource;
/**
* 读数据库服务
*/
private List readDataSources;
private int counter = 0;
public void setReadDataSources(List 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;
}
}