参考文章:https://www.cnblogs.com/phpstudy2015-6/p/6706465.html
1、Mysql读写分离架构
主库,负责写入数据,我们称之为“写库”;
其他都是从库,负责读取数据,我们称之为“读库”
要求:
1)读库和写库的数据要一致
2)写数据必须写到写库中
3)读数据必须到读库
存在问题思路解决:
一、在程序controller到service层加一个aop切层,切换数据源,但是对service层方法命名有要求
二、中间件解决
主从之间的同步,是异步完成,也就意味着是弱一致性。由于网络传输问题,可能从库没有同步到主库的数据 —— 这个问题可以通过PXC集群解决
2、中间件架构
单个中间件压力过大,采取多个中间件
3、PXC架构
4、混合架构
5、主从复制原理
主库配置文件my.conf
#开启主从复制,主库的配置 log-bin = mysql-bin #指定主库serverid server-id=1 #指定同步的数据库,如果不指定则同步全部数据库 binlog-do-db=my_test #执行SQL语句查询状态 SHOW MASTER STATUS
在主库创建同步用户
#授权用户slave01使用123456密码登录mysql grant replication slave on *.* to 'slave01'@'127.0.0.1' identified by '123456'; #刷新配置 flush privileges;
从库配置文件my.conf
#指定serverid,只要不重复即可,从库也只有这一个配置,其他都在SQL语句中操作 server-id=2 #以下执行SQL: CHANGE MASTER TO master_host='127.0.0.1', master_user='slave01', master_password='123456', master_port=3306, master_log_file='mysql-bin.000006', master_log_pos=1120; #启动slave同步 START SLAVE; #查看同步状态 SHOW SLAVE STATUS;
搭建主库
#创建目录 mkdir /data/mysql/master01 cd /data/mysql/master01 mkdir conf data chmod 777 * -R #创建配置文件 cd /data/mysql/master01/conf vim my.cnf #输入如下内容 [mysqld] log-bin=mysql-bin #开启二进制日志 server-id=1 #服务id,不可重复 #创建容器 docker create --name percona-master01 -v /data/mysql/master01/data:/var/lib/mysql -v /data/mysql/master01/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23 #启动 docker start percona-master01 && docker logs -f percona-master01 #创建同步账户以及授权 create user 'itcast'@'%' identified by 'itcast'; grant replication slave on *.* to 'itcast'@'%'; flush privileges; #出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误解 决方案,在my.cnf配置文件中设置 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' #查看master状态 show master status; #查看二进制日志相关的配置项 show global variables like 'binlog%'; #查看server相关的配置项 show global variables like 'server%';
搭建从库
#创建目录 mkdir /data/mysql/slave01 cd /data/mysql/slave01 mkdir conf data chmod 777 * -R #创建配置文件 cd /data/mysql/slave01/conf vim my.cnf #输入如下内容 [mysqld] server-id=2 #服务id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' #创建容器 docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23 #启动 docker start percona-slave01 && docker logs -f percona-slave01 #设置master相关信息 CHANGE MASTER TO master_host='192.168.1.18', master_user='itcast', master_password='itcast', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos=648; #启动同步 start slave; #查看master状态 show slave status;