MySQL优化之主从复制
概念
影响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 # 这里主要是为了将容器中的数据持久化到磁盘上
然后运行容器
使用Navicat远程连接数据库
修改主服务器的配置
1、进入容器虚拟机
找到my.cnf
在my.cnf中插入
server_id=128 ###服务器id
log-bin=mysql-bin ###开启日志文件
服务器id唯一
为什么不用vi/vim
因为docker配置是容器最简启动配置,没有这两个命令
查询一下
当然,最好的解决方法是将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'
查询服务器信息
输入:show master STATUS
如果能查询到,主服务器就算配置完成
如果结果为null,则主服务器my.cnf没有配置好.
修改从(slave)服务器
同样,在重服务器中的my.cnf添加
server_id=129 # 这个为服务id,在集群中必须唯一
log-bin=mysql-bin
binlog_do_db=test # 这个为你连接的数据库
添加成功
重启服务
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