当前位置: 首页 > news >正文

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

相关文章:

  • wordpress手机端网站/交换链接营销的典型案例
  • 1688网站怎么做分销/如何优化网页
  • 深圳市电商网站建设企业/seo属于什么职位类型
  • 做网站前景/好看的网站模板
  • 网站建设行业衰落/手机百度账号登录入口
  • dede做的网站弹广告/网络营销ppt
  • 二阶段法线性规划代码分享
  • 编译原理-链接实例分析
  • Pytorch实战笔记(1)——BiLSTM 实现情感分析
  • c语言实现扫雷(详细讲解)
  • 接口返回数据实体类属性大写变成小写
  • 小白必看!用JMeter+ANT进行接口自动化测试,并生成HTML测试报告
  • jvm系列(2)--类加载子系统
  • 给定一个非负整数num,如何不用循环语句,返回>=num,并且离num最近的,2的某次方
  • Linux (open、write、read、close、lseek、chmod、sync)操作文件的函数详解
  • Linux系统信息查看命令大全
  • Kotlin~软件开发7大原则
  • Ajax的学习笔记(包括原生的ajax,jquery,axios,fetch)