一、安装mysql

检测当前centos是否安装了mysql:yum list installed | grep mysql

yum list installed | grep mariadb         yum remove mariadb-libs.x86_64   并且移除/etc/my.cnf文件   rm -r /etc/my.cnf

由于mariadb是mysql的一个分支在centos7中会默认安装该数据库,需要将其写卸载

mysql依赖项 mysql依赖包_mysql依赖项

2.mysql5.7.19版本需要安装libnuma相关的依赖包

yum list installed |grep numactl   查询是否安装

yum install numactl 安装

mysql依赖项 mysql依赖包_数据源_02

3.解压mysql5.7.17到/usr/local/mysql下(路径可自行指定)

groupadd mysql    useradd -g mysql mysql      passwd mysql

检查指定mysql组是否存在:more /etc/group | grep mysql

检查指定用户所属组:groups mysql

检查当前活跃(在线)的用户列表:w

4.检查是否安装了 libaio

rpm -qa | grep libaio    yum -y install libaio

5.配置my.cnf文件

cp my-default.cnf /etc/my.cnf

mysql依赖项 mysql依赖包_mysql依赖项_03

安装:./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

mysql依赖项 mysql依赖包_mysql依赖项_04

注意需要记住:A temporary password is generated for root@localhost: =:,tUa2Yvr(7

启动脚本添加到资源目录中:cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld

授权  chmod +x /etc/rc.d/init.d/mysqld

添加到系统服务    chkconfig --add mysqld

校验服务是否生效    chkconfig --list mysqld    其中2 3 4 5表明开机启动

mysql依赖项 mysql依赖包_mysql依赖服务_05

启动命令: service mysqld start

mysql依赖项 mysql依赖包_重启_06

添加环境变量:vim /etc/profile    注意添加完后需要刷新配置信息  source /etc/profile

mysql依赖项 mysql依赖包_重启_07

登录   mysql -uroot -p

登录成功后设置密码  SET PASSWORD = PASSWORD('123456');(初次登录)

授权远程访问  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

mysql依赖项 mysql依赖包_数据源_08

mysql依赖项 mysql依赖包_mysql依赖服务_09

创建只读账号: GRANT Select ON *.* TO 'readonly'@'%'  IDENTIFIED BY "123456";

创建可写账号: GRANT ALL PRIVILEGES ON *.* TO 'write'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

关闭临时防火墙:systemctl stop firewalld

在搭建一台备份mysql服务器(参照上面即可)

二、通过 wget安装

检测当前centos是否安装了mysql:yum list installed | grep mysql

yum list installed | grep mariadb         yum remove mariadb-libs.x86_64   并且移除/etc/my.cnf文件   rm -r /etc/my.cnf  (与上面第一点相同)

2. 下载mysql的repo

安装插件  yum -y install wget(没有wget命令时安装)

3.安装  sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

4.安装mysql   sudo yum install mysql-server

注意:若报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' 表示没有权限:chown root /var/lib/mysql/     然后重启mysql:service mysqld restart

5.登录:mysql -u root -p     修改密码  update user set password=password('123456') where user='root';

6.重启  service mysqld restart

7.设置远程登录:GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root";

8.重启并关闭防火墙 service mysqld restart    systemctl stop firewalld.service

三、主节点配置

vim /etc/my.cnf   添加信息:server_id=213 #唯一id 一般使用ip最后一段     log-bin=mysql-bin   #开启日志文件

mysql依赖项 mysql依赖包_数据源_10

2.重启mysql:service mysqld restart

3.验证配置信息是否成功 show variables like '%service_id%' ;   show master status;

四、从节点配置

1.克隆主节点

2.修改配置文件:vim /etc/my.cnf

server_id=122     log-bin=mysql-bin   binlog_do_db=test   #需要同步的数据库,多个使用逗号分隔

mysql依赖项 mysql依赖包_重启_11

3.重启

4.从节点中配置同步信息

change master to master_host='主mysql_ip',master_user='root',master_password='123456',

master_log_file='mysql-bin.000002',master_log_pos=216;

其中master_log_file 和master_log_pos  表示主mysql文件名,和同步位置,使用show master status;在主节点出现

mysql依赖项 mysql依赖包_数据源_12

5.开始同步 : start slave

6.检查同步状态:show slave status;

注意如果是使用虚拟机克隆功能在复制从节点,同步时下面可能是no

mysql依赖项 mysql依赖包_mysql依赖项_13

是由于克隆时/etc/my.cnf中UUID重复了。rm -rf /var/lib/mysql/auto.cnf  然后重启即可。

五、主从同步原理

借助binlog日志文件中的SQL执行命令实现主从复制,即master节点执行完一条SQL命令通过日志形式在salve节点在执行一次,在从库中有两个线程一个I/O和一个SQL线程,I/O线程主要去请求主库的binlog日志并将日志写到relay log中。主库会生成一个log dump线程,用来给I/O线程传递binlog,SQL线程读取relay log文件中的日志,并解析成相应的操作。

六、springboot读写分离

gitlab源码:http://47.93.254.162:8090/open/dynamicDataSource

1.原理:配置读写两个动态数据源,通过AOP拦截service方法,判断方法名如果是查询开头(get、select、find等)注入只读数据源,否则注入可写数据源。数据源装配类需要继承AbstractRoutingDataSource,讲当前数据源交给spring管理。

2.核心实现方法

application.xml

1 spring:2 datasource:3 #可写数据源4 readpnly:5 jdbc-url: jdbc:mysql://192.168.0.112:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false

6 driver-class-name: com.mysql.jdbc.Driver7 username: root8 password: 123456

9 #可读数据源10 write:11 jdbc-url: jdbc:mysql://192.168.0.113:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false

12 driver-class-name: com.mysql.jdbc.Driver13 username: readonly14 password: 123456

15 type: com.alibaba.druid.pool.DruidDataSource16 server:17 port: 8100

数据源配置类

1 @Configuration2 public classDatasourceConfig {3

4 @Bean(name = "readDataSource")5 @ConfigurationProperties(prefix = "spring.datasource.readpnly")6 publicDataSource readDataSource() {7 returnDataSourceBuilder.create().build();8 }9

10 @Bean(name = "writeDataSource")11 @ConfigurationProperties(prefix = "spring.datasource.write")12 publicDataSource writeDataSource() {13 returnDataSourceBuilder.create().build();14 }15 }

数据源注入类

1 @Component2 @Lazy(false)3 public classDatasourceContextConfig {4

5 private static final ThreadLocal datasouceContext = new ThreadLocal<>();6

7 //设置数据源

8 public static voidsetDatasource(String datasourceName) {9 datasouceContext.set(datasourceName);10 }11

12 //获取数据源

13 public staticString getDatasource() {14 returndatasouceContext.get();15 }16

17 //清除数据源

18 public static voidclearDatasource() {19 datasouceContext.remove();20 }21 }

数据源与spring交互类

1 @Component2 @Primary3 public class DynamicDatasourceConfig extendsAbstractRoutingDataSource {4

5 @Autowired6 @Qualifier("readDataSource")7 privateDataSource readDataSource;8

9 @Autowired10 @Qualifier("writeDataSource")11 privateDataSource writeDataSource;12

13 @Override14 protectedObject determineCurrentLookupKey() {15

16 System.out.println("当前开始注入数据源 :" +DatasourceContextConfig.getDatasource());17

18 returnDatasourceContextConfig.getDatasource();19 }20

21 @Override22 public voidafterPropertiesSet() {23 Map map = new HashMap<>();24 map.put("readDataSource", readDataSource);25 map.put("writeDataSource", writeDataSource);26 setTargetDataSources(map);27 setDefaultTargetDataSource(writeDataSource);28 super.afterPropertiesSet();29 }30 }

AOP拦截类

1 @Aspect2 @Component3 public classDynamicDatasourceAopConfig {4

5 //拦截service方法,根据方法名判断注入读写数据源

6 @Before("execution(* com.dynamic.service.*.*(..))")7 public voidprocess(JoinPoint joinPoint) {8 String methodName =joinPoint.getSignature().getName();9 if(methodName.startsWith("git") || methodName.startsWith("count") ||

10 methodName.startsWith("select") || methodName.startsWith("find")) {11 DatasourceContextConfig.setDatasource("readDatasource");12 } else{13 DatasourceContextConfig.setDatasource("writeDatasource");14 }15 }16

17 }

测试

mysql依赖项 mysql依赖包_mysql依赖服务_14

七、MyCat搭建

gitlab地址:http://47.93.254.162:8090/open/mycat.git

1.下载mycat:http://dl.mycat.io/1.6.5/

2.在cnf文件下有:server.xml  :Mycat配置文件,包含账号、参数等信息

schema.xml:  Mycat对应实际数据库和表的配置

rule.xml      :   Mycat水平分库分表规则

3../mycat start   启动   ./mycat stop  停止  ./mycat restart 重启

注意:当/mycat/logs wrapper.log中 为successfully 则启动成功

4.其他代码和 springboot读写分离 保持一致,只需换数据库连接地址即可

mysql依赖项 mysql依赖包_mysql依赖项_15

八、一次线上 从服务器停电后的同步

mysql依赖项 mysql依赖包_mysql依赖项_16