MYSQL配置主从
作用
减轻数据库的负载,优化数据库性能,实现读写分离减轻单库CURD的压力,同时也具有备份数据库的作用。
主从复制分为Mater(主库)和Slave(从库),Master库主要负责, 增 删 改 操作, 由于查询操作较多,所以Slave库只负责 查询 操作,这样就实现了读写分离,很大的减轻了单个数据库的压力。
主从复制的原理
MySQL主从复制的基础是二进制日志文件(binary log file)。
Mater库必须开启binlog,当Master库发生操作,将操作记录(事件)存在binlog里。
Slave库将Mater库的binlog文件,同步到本机并记录在relay log中,
然后根据relay log记录的(事件)执行到自己的数据库,达到同步数据的效果。
在这里插入图片描述
同步过程
概念
Master有一个log dump线程,用来和Slave的I/O线程传递binlog,
当Slave (slave start)连接到Master的时候,Master机器会为Slave开启
binlog dump线程。当Master 的 binlog发生变化的时候,binlog dump
线程会通知Slave,并将相应的binlog内容发送给Slave。
Slave有两个线程,其中I/O线程用来同步Master的binlog并生成relay log,
另外一个SQL线程用来把relay log里面的sql语句落地(执行)
实现步骤
Slave 上的IO线程连接上 Master, 并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO线程根据请求信息读取指定日志指定位置之后的日志信息,
返回给 Slave 端的 IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 BinaryLog 中的位置。
Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的RelayLog文件(mysql-relay-lin.xxxxxx)的最末端,
并将读取到的Master端的bin-log的文件名和位置记录到 master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave端执行了同样的 Query,所以两端的数据是完全一样的。
1.1 确认是否符合条件
查看两个数据库,数据库的名字是否相同,是否都为jhipv1,安装位置是否相同。不同则做相应的修改。这两个服务器分为服务器A与服务器B。
1.2 新建用户
首先打开数据库命令行模式
验证
点击此处进入命令行界面,如图1.2.1所示。
点击进入命令行
输入mysql –V出现版本号,如图1.2.1所示及可证明安装成功。
验证成功
输入mysql –u root –p回车,输入jiahemk显示如图3.3.2即可表示可以打开MySQL。如果出现错误请检查环境变量和MYSQL80服务是否启动,如果服务未启动请启动程序,如果启动失败请卸载重新安装。
打开mysql
在数据库A的命令行模式中分别输入:
CREATE USER 'sync'@'服务器BIP' IDENTIFIED WITH mysql_native_password BY 'PASWORD';
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'服务器BIP';
在数据库B的命令行模式中分别输入
CREATE USER 'sync'@'服务器AIP' IDENTIFIED WITH mysql_native_password BY 'PASWORD';
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'服务器AIP';
大概如图所示
1.3更改配置文件
首先对配置文件进行备份
注意事项:注意用记事本打开的话,修改完成后要进行另存为选择编码为ANSI,防止编码错误服务启动不了。保存时直接覆盖原文件即可。确认在进行了备份。
1.3.1可以直接添加的部分
对配置文件进行更改,打开D:\ProgramData\MySQL\MySQL Server 8.0目录下的my.ini文件,对其进行编辑,首先找到[mysqld]节点,如图所示:
图中找到[mysqld]节点
在[mysqld]下添加几个值,分别为:
binlog_format=mixed
sync-binlog=1
binlog-do-db=jhipv1
auto-increment-increment=2
auto-increment-offset=1
#主键初始偏移量,服务器A设置为1,服务器B设置为2
replicate-do-db=jhipv1
#数据同步的数据库
relay_log=relay-bin
服务器A修改后如图所示:
服务器B修改后如图1.2.3所示:
1.3.2不可以直接添加的部分
server-id
找到[mysqld]节点下的server-id节点,并将服务器A的值改为1,服务器B的值改为2,如图所示。
log-bin
找到[mysqld]节点下的log-bin节点,并将两个服务器上此处改为
log-bin="mysql-bin"
如图所示:
max_allowed_packet:mysqlsql语句最大的长度,一般默认为4M。
找到[mysqld]节点下的max_allowed_packet节点,并将两个服务器上此处改为
max_allowed_packet=1G
如图所示:
添加group_concat_max_len
group_concat_max_len = 4294967291;
再[mysqld]节点下添加group_concat_max_len = 4294967291;默认的mysql的语句拼接最长为1024字节,当我们需要较长的拼接时需要扩大其大小。
注意事项:注意用记事本打开的话,修改完成后要进行另存为选择编码为ANSI,防止编码错误服务启动不了。保存时直接覆盖原文件即可。确认在1.2进行了备份。
1.4重启服务
进入服务,找到MySQL80服务,点击重启,如果重启失败则查看配置文件修改是否有问题,例如“"”是否是中文格式,如果是中文格式,请改正。
设置slave_pending_jobs_size_max,重启后进入mysql命令端或者Navicat设置。
set global slave_pending_jobs_size_max=2147483648;
默认的传输文件大小在我们更改最大传输大小后太小,需要增加。
1.5继续进行主主配置
在两台服务器上进入命令行模式,输入
SHOW MASTER STATUS\G;
根据File: mysql-bin.000021和Position: 982820038可知:当前写的二进制日志文件名称和位置是mysql-bin. 000021: 982820038,在文件mysql-bin.000021中有“end_log_pos 982820038”的地方就是这个位置
1.6配置主主服务
接着上一步的做,在命令行上输入“
CHANGE MASTER TO MASTER_HOST=‘另一个服务器的IP’,MASTER_USER=‘sync’,MASTER_PASSWORD=‘password’,MASTER_LOG_FILE=‘另一个服务器输出的File的值’,MASTER_LOG_POS=另一个服务器输出的Position的值;”
(File的值和Position的值是1.5中SHOW MASTER STATUS\G运行得出)
在两个服务器上分别打出“start slave;”
在两个服务器上分别打出“show slave status\G”。
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.118.25
Master_User: mysync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000023
Read_Master_Log_Pos: 39913
Relay_Log_File: mysql-relay-bin.000031
Relay_Log_Pos: 40059
Relay_Master_Log_File: mysql-bin.000023
Slave_IO_Running: Yes #Yes表示io_thread的和主库连接正常并能实施复制工作,No则说明与主库通讯异常,多数情况是由主从间网络引起的问题;
Slave_SQL_Running: Yes #具体就是语句是否执行通过,常会遇到主键重复或是某个表不存在。
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,test.%,information_schema.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 39913
Relay_Log_Space: 40361
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0 #判断主动同步延时的参考值,是通过比较sql_thread执行的event的timestamp和io_thread复制好的event的timestamp(简写为ts)进行比较,而得到的这么一个差值;
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 18
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
如果出现不是两个yes请卸载数据库重新安装。
1.7验证配置主主服务成功
在服务器A上添加表或数据查看是否能同步到服务器B,同理在服务器B上添加数据查看是否能够同步到服务器A。若能够同步数据,则配置成功。