MySQL8基于Sharding-Proxy5搭建主从复制与读写分离(CentOS7 物理机版)

前言

要搭建MySQL的读写分离就需要先搭建MySQL的主从复制

一、搭建背景

  1. CentOS7
  2. MySQL8
  3. 39.108.103.166(主机)
  4. 119.3.185.19(从机)
  5. Sharding-Proxy 5

二、MySQL8的主从复制

1.主机配置

这里选择39.108.103.166这台 物理机做主从复制。前提是主机与从机必须先安装好MySQL8

  1. 进去主机的MySQL8配置
vi /etc/my.cnf
  1. 配置以下信息:
server-id=166mysql服务的唯一id 随意设置值不需要加引号,一般为ip的最后一组
log-bin=master-bin开启MySQL二进制日志
log-slave-updates=true设置从库从主库复制的数据会写入log-bin日志文件里
这里解释是一下log-bin参数:
基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;
作用:
1、可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)
2、数据库增量备份和恢复(增量备份和基于时间点的恢复)
3、MySQL的复制(主主数据库的复制、主从数据库的复制)
默认放在/var/lib/mysql
更换路径例如:
log-bin=/home/logs/mysql
然后将文件夹赋予权限(必须):
chown -R mysql.mysql /home/logs/mysql
查看该日志,由于是二进制文件所以不能用常规方式打开
/usr/bin/mysqlbinlog /home/logs/mysql-bin.*********
  1. 重启MySQL服务
sysyemctl restart mysqld;
  1. 进入主机MySQL服务
mysql -u root -p 
  1. 创建从机访问主机的用户
CREATE USER 'myslave'@'119.3.185.19' IDENTIFIED WITH mysql_native_password BY '123456';

myslave是从机访问的账户 119.3.185.19是从机的地址 123456是密码 
主机创建的用户的ip必须是从机ip或者具有相同前缀的ip最后一组可以使用%代替具体的ip
这样就不需要一个从机配一个用户,但前提是ip前缀必须一样。
  1. 给创建的用户授权
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'119.3.185.19';
  1. 刷新用户信息
flush privileges;
  1. 查看主表当前bin-log文件名(File)和位置(position)
SHOW MASTER STATUS;

在这里插入图片描述
注意
1、如果重启MySQL服务或者刷新等操作都会刷新不同的文件
2、如果是要配置多台
为防止position一直变动,此时我们给主服务器加上只读锁
flush table with read lock;
配置完所有从机之后请及时打开
unlock tables;

  1. 查看主机binlog开启状态,以及binlog日志路径
show variables like 'log_%';

在这里插入图片描述

2.从机配置

119.3.185.19为从机

  1. 进入从机配置
vi /etc/my.cnf
  1. 配置以下信息
server-id=19mysql服务的唯一id 随意设置值不需要加引号,一般为ip的最后一组
relay-log=relay-log-bin从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器
relay-log-index=slave-relay-bin.index设定中继日志的索引文件名,默认为为数据目录中的host_name-relay-bin.index。
  1. 重启MySQL服务
systemctl restart mysqld;
  1. 进入MySQL服务
mysql -u root -p;
  1. 暂停sql线程
stop slave;
  1. 配置主表上创建的对应从机地址的用户
CHANGE MASTER TO
MASTER_HOST='39.108.103.166',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000008',
MASTER_LOG_POS=3549;
  1. 开启sql线程
start slave;
  1. 查看从表同步状态
show slave status\G
这个命令千万不能加; 
虽然也会有数据出来也会提示一个错误 ERROR:No query specified
但这个数据是不准确的,会影响查看是否完全连接的值

看到以下两个值为yes就证明链接成功了
在这里插入图片描述

3.部分参数

参数说明
expire_logs_days={0…99}设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时。作用范围为全局,可用于配置文件,属动态变量。
general_log={ON/OFF}设定是否启用查询日志,默认值为取决于在启动mysqld时是否使用了–general_log选项。如若启用此项,其输出位置则由–log_output选项进行定义,如果log_output的值设定为NONE,即使用启用查询日志,其也不会记录任何日志信息。作用范围为全局,可用于配置文件,属动态变量。
general_log_file=FILE_NAME查询日志的日志文件名称,默认为“hostname.log"。作用范围为全局,可用于配置文件,属动态变量。
binlog-format={ROW/STATEMENT/MIXED}指定二进制日志的类型,默认为STATEMENT。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。作用范围为全局或会话,可用于配置文件,且属于动态变量。
log={YES/NO}是否启用记录所有语句的日志信息于一般查询日志(general query log)中,默认通常为OFF。MySQL 5.6已经弃用此选项。
log-bin={YES/NO}是否启用二进制日志,如果为mysqld设定了–log-bin选项,则其值为ON,否则则为OFF。其仅用于显示是否启用了二进制日志,并不反应log-bin的设定值。作用范围为全局级别,属非动态变量。
log_bin_trust_function_creators={TRUE/FALSE}此参数仅在启用二进制日志时有效,用于控制创建存储函数时如果会导致不安全的事件记录二进制日志条件下是否禁止创建存储函数。默认值为0,表示除非用户除了CREATE ROUTING或ALTER ROUTINE权限外还有SUPER权限,否则将禁止创建或修改存储函数,同时,还要求在创建函数时必需为之使用DETERMINISTIC属性,再不然就是附带READS SQL DATA或NO SQL属性。设置其值为1时则不启用这些限制。作用范围为全局级别,可用于配置文件,属动态变量。
log_error=/PATH/TO/ERROR_LOG_FILENAME定义错误日志文件。作用范围为全局或会话级别,可用于配置文件,属非动态变量。
log_output={TABLE/FILE/NONE}定义一般查询日志和慢查询日志的保存方式,可以是TABLE、FILE、NONE,也可以是TABLE及FILE的组合(用逗号隔开),默认为TABLE。如果组合中出现了NONE,那么其它设定都将失效,同时,无论是否启用日志功能,也不会记录任何相关的日志信息。作用范围为全局级别,可用于配置文件,属动态变量。
log_query_not_using_indexes={ON/OFF}设定是否将没有使用索引的查询操作记录到慢查询日志。作用范围为全局级别,可用于配置文件,属动态变量。
log_slave_updates={ON/OFF}用于设定复制场景中的从服务器是否将从主服务器收到的更新操作记录进本机的二进制日志中。本参数设定的生效需要在从服务器上启用二进制日志功能。
log_slow_queries={YES/NO}是否记录慢查询日志。慢查询是指查询的执行时间超出long_query_time参数所设定时长的事件。MySQL 5.6将此参数修改为了slow_query_log。作用范围为全局级别,可用于配置文件,属动态变量。
log_warnings=#设定是否将警告信息记录进错误日志。默认设定为1,表示启用;可以将其设置为0以禁用;而其值为大于1的数值时表示将新发起连接时产生的“失败的连接”和“拒绝访问”类的错误信息也记录进错误日志。
long_query_time=#设定区别慢查询与一般查询的语句执行时间长度。这里的语句执行时长为实际的执行时间,而非在CPU上的执行时长,因此,负载较重的服务器上更容易产生慢查询。其最小值为0,默认值为10,单位是秒钟。它也支持毫秒级的解析度。作用范围为全局或会话级别,可用于配置文件,属动态变量。
max_binlog_cache_size={4096 … 18446744073709547520}二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定。作用范围为全局级别,可用于配置文件,属动态变量。
max_binlog_size={4096 … 1073741824}设定二进制日志文件上限,单位为字节,最小值为4K,最大值为1G,默认为1G。某事务所产生的日志信息只能写入一个二进制日志文件,因此,实际上的二进制日志文件可能大于这个指定的上限。作用范围为全局级别,可用于配置文件,属动态变量。
max_relay_log_size={4096…1073741824}设定从服务器上中继日志的体积上限,到达此限度时其会自动进行中继日志滚动。此参数值为0时,mysqld将使用max_binlog_size参数同时为二进制日志和中继日志设定日志文件体积上限。作用范围为全局级别,可用于配置文件,属动态变量。
innodb_log_buffer_size={262144 … 4294967295}设定InnoDB用于辅助完成日志文件写操作的日志缓冲区大小,单位是字节,默认为8MB。较大的事务可以借助于更大的日志缓冲区来避免在事务完成之前将日志缓冲区的数据写入日志文件,以减少I/O操作进而提升系统性能。因此,在有着较大事务的应用场景中,建议为此变量设定一个更大的值。作用范围为全局级别,可用于选项文件,属非动态变量。
innodb_log_file_size={108576 … 4294967295}设定日志组中每个日志文件的大小,单位是字节,默认值是5MB。较为明智的取值范围是从1MB到缓存池体积的1/n,其中n表示日志组中日志文件的个数。日志文件越大,在缓存池中需要执行的检查点刷写操作就越少,这意味着所需的I/O操作也就越少,然而这也会导致较慢的故障恢复速度。作用范围为全局级别,可用于选项文件,属非动态变量。
innodb_log_files_in_group={2 … 100}设定日志组中日志文件的个数。InnoDB以循环的方式使用这些日志文件。默认值为2。作用范围为全局级别,可用于选项文件,属非动态变量。
innodb_log_group_home_dir=/PATH/TO/DIR设定InnoDB重做日志文件的存储目录。在缺省使用InnoDB日志相关的所有变量时,其默认会在数据目录中创建两个大小为5MB的名为ib_logfile0和ib_logfile1的日志文件。作用范围为全局级别,可用于选项文件,属非动态变量。
relay_log=file_name设定中继日志的文件名称,默认为host_name-relay-bin。也可以使用绝对路径,以指定非数据目录来存储中继日志。作用范围为全局级别,可用于选项文件,属非动态变量。
relay_log_index=file_name设定中继日志的索引文件名,默认为为数据目录中的host_name-relay-bin.index。作用范围为全局级别,可用于选项文件,属非动态变量。
relay-log-info-file=file_name设定中继服务用于记录中继信息的文件,默认为数据目录中的relay-log.info。作用范围为全局级别,可用于选项文件,属非动态变量。
relay_log_purge={ON/OFF}设定对不再需要的中继日志是否自动进行清理。默认值为ON。作用范围为全局级别,可用于选项文件,属动态变量。
relay_log_space_limit=#设定用于存储所有中继日志文件的可用空间大小。默认为0,表示不限定。最大值取决于系统平台位数。作用范围为全局级别,可用于选项文件,属非动态变量。
slow_query_log={ON/OFF}设定是否启用慢查询日志。0或OFF表示禁用,1或ON表示启用。日志信息的输出位置取决于log_output变量的定义,如果其值为NONE,则即便slow_query_log为ON,也不会记录任何慢查询信息。作用范围为全局级别,可用于选项文件,属动态变量。
slow_query_log_file=/PATH/TO/SOMEFILE设定慢查询日志文件的名称。默认为hostname-slow.log,但可以通过–slow_query_log_file选项修改。作用范围为全局级别,可用于选项文件,属动态变量。
sql_log_bin={ON/OFF}用于控制二进制日志信息是否记录进日志文件。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。作用范围为全局和会话级别,属动态变量。
sql_log_off={ON/OFF}用于控制是否禁止将一般查询日志类信息记录进查询日志文件。默认为OFF,表示不禁止记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。作用范围为全局和会话级别,属动态变量。
sync_binlog=#设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步。

4.主从复制问题总结

  1. 配置全部正确却无法正确链接。

  2. 有没有给关闭防火墙

    关闭且开机不启动 :systemctl disable firewalld.service;
    查看状态:firewall-cmd --state
    
  3. 用的是服务器有没有在特定的平台的控制台将端口放开,即如阿里云为例,需要去阿里云的控制台的防火墙里配置该端口

  4. 配置从机链接的配置中的MASTER_LOG_POS参数的值不能带引号

  5. 当主服务器中有个库从服务器从来没有,如果主服务器操作之后,从服务器就会存在一个或多个事务需要手动去跳过

    stop slave;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
    start slave;
    

    不然就会在之后的同步过程中会同步失败,想要通过配置,自动跳过这些错误的事务,在mysql的配置文件【mysqld】节点中加入
    slave-skip-errors=all

三、基于Sharding-Proxy5搭建读写分离

1.准备工作

本人在主机上搭建

  1. 下载 ShardingSphere-Proxy
    官网地址
    http://shardingsphere.apache.org/index_zh.html
    下载跳转
    https://shardingsphere.apache.org/document/current/cn/downloads/
    在这里插入图片描述
    在这里插入图片描述
    注意:
    若在Windows下载需要将文件发送到服务器
    创建一个目录用于存放解压的文件我的为/home/ssp
    使用tar zxvf命令解压,最好不要在Windows用解压软件,部分解压软件会将解压后的名字截取。

  2. 下载MySQL驱动依赖
    5版本:
    https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar
    8版本:
    https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar
    其他版本:
    https://repo1.maven.org/maven2/mysql/mysql-connector-java/

  3. 安装java环境

    yum install java
    

2.开始配置

  1. 将下载好的MySQL驱动移到解压好的中间件文件lib下
    在这里插入图片描述
  2. 打开conf目录
    在这里插入图片描述
    这里就需要配置两个文件:server.yaml,config-readwrite-splitting.yaml
    不管使用Sharding-Proxy做什么都需要配置server.yaml文件,他就是一个启动Sharding-Proxy的服务。
  3. 配置server.yaml
    刚开始该文件全是注释,而我们配置读写分离大概只需要两个节点
rules:
  - !AUTHORITY
    users:
      - root@%:123456  # 启动该服务的用户密码
      - sharding@:123456 # 启动该服务的用户密码
    provider:
      type: NATIVE
props:
  max-connections-size-per-query: 1 # 一次查询请求在每个数据库实例中所能使用的最大连接数。
  kernel-executor-size: 16 # 线程池大小  默认值: CPU核数
  kernel-acceptor-size: 16  # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
  proxy-frontend-flush-threshold: 128  # 设置传输数据条数的 IO 刷新阈值
  proxy-opentracing-enabled: false #是否开启链路追踪功能,默认为不开启
  proxy-hint-enabled: false #是否启用hint算法强制路由 默认false
  sql-show: ture #是否打印sql 默认falsefalse
#  show-process-list-enabled: false
    # Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy.
    # The default value is -1, which means set the minimum value for different JDBC drivers.
  proxy-backend-query-fetch-size: -1
  check-duplicate-table-enabled: false
  sql-comment-parse-enabled: false
  proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide.
    # Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL execution
    # if client connections are more than proxy-frontend-netty-executor-size, especially executing slow SQL.
  proxy-backend-executor-suitable: OLAP
#  proxy-frontend-max-connections: 0 # Less than or equal to 0 means no limitation.
#  sql-federation-enabled: false
  1. 配置config-readwrite-splitting.yaml
schemaName: tissue  
# 逻辑库,相当于独立主机与从机的一个中间库,搭起该服务后就要使用该逻辑库
# 注意修改已经配置好一个逻辑库并启动了,再修改这个逻辑库时就得先暂停该服务再启动。

dataSources:
  write_ds:
    url: jdbc:mysql://39.108.103.166:3306/test?allowPublicKeyRetrieval=true&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000  # 连接超时时间
    idleTimeoutMilliseconds: 60000  # 空闲连接回收超时毫秒数
    maxLifetimeMilliseconds: 1800000  # 连接最大存活时间毫秒数
    maxPoolSize: 50  # 最大连接数
    minPoolSize: 1  # 最小连接数 
  read_ds_0:
    url: jdbc:mysql://119.3.185.19:3306/test?allowPublicKeyRetrieval=true&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
    minPoolSize: 1

rules:
- !READWRITE_SPLITTING
  dataSources:
    pr_ds:
      writeDataSourceName: write_ds
      readDataSourceNames:
        - read_ds_0
  1. 启动服务

之后进入到bin目录 ./start.sh即可 默认端口为3307
自定义端口可以为 ./start.sh 11311
暂停为:./stop.sh
netstat -nltp 可以查看端口是否起来
没起来可以看日志什么原因
在这里插入图片描述
日志位置:
在这里插入图片描述

  1. 验证
    验证读写分离需要现关闭主从复制,先去从机将sql线程关闭,然后重启两个机子的服务。
    这里就不贴图只说步骤:

    1. 先在主机与从机各自创键同一个库同一个表,并且在主机与从机的两个表各插入不同的数据。

    2. 连接Sharding-Proxy服务

      mysql -h 服务的ip -P 服务的端口 -p
      
    3. 使用show databases;命令查看库时会发现库名与我们配置读写分离的逻辑库是一样的名字,然后我们切进该库然后使用show tables;查看表时自动会有一个跟主机与从机一样的表

    4. 查询该表的数据,会与从表的数据一样,当向该表插入数据时,在查询时,发现刚刚插入的数据没有显示

    5. 连接 主机的MySQL服务查询 主机的表,发现刚刚插入的数据有显示,那么证明MySQL8基于Sharding-Proxy5搭建读写分离就此成功!

3.读写分离遇到的问题

  1. javax.net.ssl.SSLException
    MESSAGE: closing inbound before receiving peer’s close_notify

    不建议在没有服务器身份验证的情况下建立SSL连接,根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有设置显式选项,则必须默认建立SSL连接。为了符合不使用SSL的现有应用程序,verifyServerCertificate属性被设置为“false”。您需要通过设置useSSL=false显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储

    Establishing SSL connection without server's identity verification is 
    not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ 
    requirements SSL connection must be established by default if explicit 
    option isn't set. For compliance with existing applications not using 
    SSL the verifyServerCertificate property is set to 'false'. You need 
    either to explicitly disable SSL by setting useSSL=false, or set 
    useSSL=true and provide truststore for server certificate verificatio
    
    ** BEGIN NESTED EXCEPTION **
    
    javax.net.ssl.SSLException
    MESSAGE: closing inbound before receiving peer’s close_notify
    
    STACKTRACE:
    
    javax.net.ssl.SSLException: closing inbound before receiving peer’s close_notify
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:263)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:254)
    at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645)
    at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624)
    at com.mysql.cj.protocol.a.NativeProtocol.quit(NativeProtocol.java:1319)
    at com.mysql.cj.NativeSession.quit(NativeSession.java:182)
    at com.mysql.cj.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:1750)
    at com.mysql.cj.jdbc.ConnectionImpl.close(ConnectionImpl.java:720)
    at cn.wbslz.jdbc.JdbcDemo1.main(JdbcDemo1.java:27)
    
    ** END NESTED EXCEPTION **
    
    Process finished with exit code 0
    

    在config-readwrite-splitting.yaml文件中,配置主机与从机的每个url后面加上useSSL=false

  2. 连接失败

     ```
     com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 
     
     ** BEGIN NESTED EXCEPTION ** 
     
     java.net.ConnectException
     MESSAGE: Connection refused: connect
     
     STACKTRACE:
     
     java.net.ConnectException: Connection refused: connect
     ```
    

    需要先查看相应的MySQL服务是否起来,相应的端口是否有暴露

  3. Public Key Retrieval is not allowed
    在config-readwrite-splitting.yaml文件中,配置主机与从机的每个url后面加上allowPublicKeyRetrieval=true

  4. host … is not allowed to connect to this MySql server

    如果是刚装MySQL的同学初次使用连接时会出现该错误
    在主机与从机MySQL服务器:
    1、连接服务器: mysql -u root -p
    
    2、看当前所有数据库:show databases;
    
    3、进入mysql数据库:use mysql;
    
    4、查看mysql数据库中所有的表:show tables;
    
    5、查看user表中的数据:select Host, User,Password from user;
    
    6、修改user表中的Host:update user set Host='%' where User='root';
    7、最后刷新一下:flush privileges;
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pierce°ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值