2023-01-16 MySQL主从复制+MyCat读写分离实现
MySQL+MyCat
文章目录
- MySQL+MyCat
- 1. Linux下MySQL安装
- 2.Mysql文件存放位置
- 3.MySQL主从复制搭建
- 3.1 介绍及准备
- 原理:
- 主从搭建准备:
- 3.2 Master节点配置文件修改
- 3.3 创建授权用户
- 3.4 Slave操作
- 4.MyCat读写分离配置
- 1. Server.xml配置文件
- 2. Schema.xml配置文件
1. Linux下MySQL安装
安装mysql需要联网从网上下载安装 版本选择mysql5.7
yum -y install wget
1.下载mysql包安装源
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
2.安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
3.检查Mysql源是否安装成功
yum repolist enabled | grep "mysql.*-community.*"
4.执行获取新的源公钥导入 :
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
5.安装mysql
yum install mysql-community-server
安装完成后
6.启动mysql服务
service mysqld start
7.安装时系统会创建一个root密码 需要获取到root密码
grep 'temporary password' /var/log/mysqld.log
8.显示密码后登陆mysql客户端
mysql -uroot -p
执行后输入密码 不显示一定不能写错!!!
9.进入mysql客户端后修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL5.7#';
出于安全机制密码要包含大小特殊字符不能少于8位
10.mysql环境变量查询当前mysql密码策略相关信息
show variables like '%password%';
11.允许mysql被远程登录访问设置
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'MySQL5.7#' WITH GRANT OPTION;
12.设置MySQL字符编码格式
进入/etc
目录 vi编辑my.cnf
文件
在[mysqld]
下加入以下内容
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
windows系统是大小写不敏感 Linux是严格区分大小写的
13.加入完成后保存退出 重启mysql服务
14.重启完成后进入mysql 通过下面命令查看编码设置
show variables like '%character%' ;
2.Mysql文件存放位置
配置文件: /etc/my.cnf
日志文件: /var/log/var/log/mysqld.log
服务启动脚本: /usr/lib/systemd/system/mysqld.service
socket文件: /var/run/mysqld/mysqld.pid
3.MySQL主从复制搭建
3.1 介绍及准备
作用: 主数据库损坏可以切到从数据库运行, 读写分离
Mysql主从的底层实现是通过binlog
日志方式来实现的,一个写请求发送到主mysql后会在binlog
日志中追加相应的记录 mysql中会通过一个中继日志的线程来同步从mysql
来实现主从复制
MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能
原理:
MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
主从搭建准备:
-
主从数据库版本一致
-
主从数据库内数据保持一致
-
克隆虚拟机,生成主从数据库
-
修改mysql配置文件
vim /etc/my.cnf
3.2 Master节点配置文件修改
server-id=138
log-bin=mysql-bin
binlog_format=MIXED
sync_binlog=1
expire_logs_days=0
binlog-do-db=news #数据库名
修改配置文件后重启mysql服务,查看启动是否成功,如果失败查看日志或配置文件出现的问题.
3.3 创建授权用户
1.创建一个从机用户 并指定可以从本机外部进行访问
create user 'slave'@'%' identified by 'MySQL5.7clone'
2.设置slave远程从机账户拥有一个可以复制的权限
grant replication slave,replication client on *.* to 'slave'@'%''
3.查看log_bin日志是否属于开启状态
show variables like 'log_bin'
4.必须要执行且记录文件号和偏移位置查看当前操作的宿主机是否为master状态
show master status
记录日志起始点标记与偏移位置
,slave需要使用
3.4 Slave操作
进入从库宿主机后修改my.cnf
配置文件加入server-id
即可
1.启动slave的mysql服务并进入客户端
2.执行stop slave命令
stop slave;
3.执行下列语句
change master to master_host='192.168.25.101',master_port=3306,master_password='xxx',master_log_file='mysql-bin.000001',master_log_pos=617;
4.执行成功后开始启动slave
start slave;
5.查看同步状态
show slave status \G
如果出现
Slave_IO_Running: No
Slave_SQL_Running: Yes
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解决办法
查看主机与从机的uuid
Show variables like '%uuid%'
删除后在启动从机mysql服务进入客户端执行salve状态
show slave status \G
4.MyCat读写分离配置
默认端口号8066
1. Server.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!-- off heap for merge/order/group/limit 1开启 0关闭 -->
<property name="useOffHeapForMerge">1</property>
<!-- 单位为m -->
<property name="memoryPageSize">1m</property>
<!--单位为k -->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!-- 单位为m -->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火墙设置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="root">
<!--Mycat数据库连接配置-->
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
2. Schema.xml配置文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--读写分离数据库表配置-->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="admin_role" dataNode="dn1" />
<table name="admins" dataNode="dn1" />
<table name="comment" dataNode="dn1" />
<table name="config" dataNode="dn1" />
<table name="logs" dataNode="dn1" />
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<!--数据库节点配置-->
<dataNode name="dn1" dataHost="localhost1" database="dubbo_news" />
<!--读写分离数据库连接配置-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.25.100:3306" user="root"
password="xxxx">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.25.101:3306" user="root" password="xxxx" />
<readHost host="hostS2" url="192.168.25.102:3306" user="root" password="xxxx" />
</writeHost>
</dataHost>
</mycat:schema>
如果两边一致就需要将从库的auto.cnf文件删除