欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL优化之主从复制

程序员文章站 2024-03-20 20:52:34
...

概念

影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中。
假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端口,通过网络发给MYSQL-B。
MYSQL-B收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库中完成。
那么,MYSQL-A的变化,MYSQL-B也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication。

解决问题

数据如何不被丢失
备份
读写分离
数据库负载均衡
高可用

服务器准备

10.3.136.128 	主服务器 master
10.3.136.129	从服务器slave

为了简化MySQL的安装,我这里使用的docker-compose启动服务器
docker-compose.yml的内容为

version: '3.1'
services:
  db:
    # 目前 latest 版本为 MySQL8.x
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ./data:/var/lib/mysql  # 这里主要是为了将容器中的数据持久化到磁盘上

然后运行容器
MySQL优化之主从复制
使用Navicat远程连接数据库
MySQL优化之主从复制
修改主服务器的配置
1、进入容器虚拟机
MySQL优化之主从复制
找到my.cnf
MySQL优化之主从复制
在my.cnf中插入

server_id=128  ###服务器id
log-bin=mysql-bin   ###开启日志文件

服务器id唯一

MySQL优化之主从复制
为什么不用vi/vim
因为docker配置是容器最简启动配置,没有这两个命令
MySQL优化之主从复制
查询一下
MySQL优化之主从复制
当然,最好的解决方法是将my.cnf这个文件持久化到我们磁盘,这样我们就能直接在宿主机上进行操作,但是,目前对这个文件持久化的时候出现我还无法解决的问题,所以,只能使用这种方法,这里先将my.cnf配置文件放在这里,方便以后操作

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

重启服务器
docker restart 容器id

查询 服务器id

建立查询后输入:SHOW VARIABLES LIKE 'server_id'
MySQL优化之主从复制

查询服务器信息

输入:show master STATUS
MySQL优化之主从复制
如果能查询到,主服务器就算配置完成
如果结果为null,则主服务器my.cnf没有配置好.

修改从(slave)服务器

同样,在重服务器中的my.cnf添加

server_id=129 # 这个为服务id,在集群中必须唯一
log-bin=mysql-bin
binlog_do_db=test # 这个为你连接的数据库

MySQL优化之主从复制
MySQL优化之主从复制
添加成功

重启服务

docker restart 容器id

主服务器给从服务器账号授权

输入:GRANT REPL ICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456';

实际开发中,我们需要为主服务器授权,这图省事,直接使用root进行访问

//一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

重服务器请求同步

先在主服务中查询状态

show master STATUS

开启同步之前先停止同步
stop slave
配置同步

change master to master_host='10.3.136.128',master_user='root',master_password='123456',
         master_log_file='mysql-bin.000001',master_log_pos=155;
           master_log_file,master_log_pos为你在主数据库使用show master STATUS命令查询到了数据
         

开启同步
start slave

如果执行上面三个命令有错则在从数据库执行

set sql_mode = ‘’;
set sql_mode = ‘NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES’;

my.cnf的主要配置

[client]
default-character-set=utf8    #客户端连接编码

[mysql]
auto-rehash                   #客户端tab补全
default-character-set=utf8    #编码

[mysqld] 
user=mysql
port=3307                     #定义端口
log-bin=mysql-bin             #开启二进制日志
server-id=011                 #定义服务ID

max_allowed_packet=50M        ###最大
wait_timeout=3600             ###等待超时默认s
interactive_timeout=3600      ###活动超时

innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M

basedir=/tmp/mysql_mulit                 #MYSQL根目录
datadir=/tmp/mysql_mulit/data_3307       #MYSQL数据存放目录
socket=/tmp/3307_mysql.sock              #套接字

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8                #定义数据库默认字符 server\collation
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

symbolic-links=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

lower_case_table_names = 0             #对表的大小写不敏感

[mysqld_safe]
log-error=/tmp/3307_err.log              #错误日志
pid-file=/tmp/mysql_mulit/data_3307/mysqld.pid   #pid,多协议通信 tcp/sock