2023-01-16 MySQL主从复制+MyCat读写分离实现

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

MySQL+MyCat

文章目录

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文件删除

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql

“2023-01-16 MySQL主从复制+MyCat读写分离实现” 的相关文章