mysql从库同步日志设置6_聊聊Mysql主从同步读写分离配置实现

Hi,各位热爱技术的小伙伴您们好,好久没有写点东西了,今天写点关于mysql主从同步配置的操作日志同大家一起分享。最近自己在全新搭建一个mysql主从同步读写分离数据库简单集群,我讲实际操作步骤整理分享处理,希望对在学习路上的你有所以帮助,当然如果是你是老鸟,写的不好的地方,多多包涵。废话不多说,言归正传,直入主题。

一、背景介绍

Mysql数据库主从同步,数据集群其实大家一点都不陌生,但是实际操作的估计就不一定了。至于为什么要使用主从同步策略,在此我就不必多说了,你懂我知大家晓。说实话原来的项目一直都在用户主从同步读写分离,我并没有实际操作过,都是其他小伙伴在搭建。但是最近一个项目,从服务器环境搭建,部署都必须要自己亲手去做,所以也就借此机会来练一练手。嘿嘿,其实我就是一个菜鸟…

本次的数据库搭建是基于centos7、docker容器部署的。

二、mysql复制原理

原理:

(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

也就是说:

从库会生成两个线程,一个I/O线程,一个SQL线程;

I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;

主库会生成一个log dump线程,用来给从库I/O线程传binlog;

SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;

86e64cc1ecbec566ae917c58464a630b.png

三、前期配置文件准备

主从同步很关键的一个配置就是my.cnf。由于本次所有服务都是运行在docker容器上,所以在my.cof配置文件,采用在磁盘文件创建对应的文件,在mysql运行时讲相应的配置文件挂载到对应的物理磁盘,方便后期维护。

主从数据库都需要对my.cnf进行配置。

my.cnf在docker容器的相对位置是:/etc/mysql/my.cnf

假设配置文件在物理磁盘的存放位置为:/home/mysql/my.cnf

1、主数据库(Master)my.cnf配置文件

[mysqld]

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /var/lib/mysql

secure-file-priv= NULL

server-id=31 #设置主服务器的ID,可以任意配置但是多个主从之间不能重复

innodb_flush_log_at_trx_commit=2 # 写入磁盘策略

sync_binlog=1 #开启binlog日志同步功能

expire_logs_days=180, # 二进制日志保留天数

log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)

#binlog-do-db=test # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)

#binlog-ignore-db=xxxx # 二进制日志中忽略数据库

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Custom config should go here

!includedir /etc/mysql/conf.d/

具体的配置信息,我都做了简单的说明,大家可以根据自己的实际需要进行配置。

2、 从数据库(Slave)my.cnf配置文件

[mysqld]

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /var/lib/mysql

secure-file-priv= NULL

read-only=1 #是否只读,0 代表非只读 1:代表只读

server-id=32 #设置主服务器的ID,可以任意配置但是多个主从之间不能重复

innodb_flush_log_at_trx_commit=2 #

sync_binlog=1 #开启binlog日志同步功能

expire_logs_days=180, # 二进制日志保留天数

log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)

# binlog-do-db=test # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)

# 还有一个参数是指定不同步哪些库,这里不再赘述

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Custom config should go here

!includedir /etc/mysql/conf.d/

具体的配置信息,其实和主大同小异。read-only=1 将从数据库作为读库处理

四、主从数据库容器运行

1、 创建运行主数据库容器:

docker run --name mysqlMasterMic-d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/my.cnf:/etc/mysql/my.cnf mysql

2、 创建运行从数据库容器:

docker run --name mysqlSlaveMic-d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/my.cnf:/etc/mysql/my.cnf mysql

五、主从数据同步配置

1、主数据库设置

// 第一步:进入master容器

docker exec -it mysqlMasterMic bash

// 第二步:登录到mysql

mysql -u root –p

// 在输入框输入对应的root密码:123456

// 第三步:创建数据同步登录账号

假设创建账号为:slavesynchro。同时需要赋值上:REPLICATION SLAVE 权限

改账号主要用于从数据库访问主数据库使用。

CREATE USER 'slavesynchro'@ '%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE ON *.* to 'slavesynchro'@'%' identified by '123456';

// 第四步:查看主数据库状态

查看主数据库状态,其主要目的是查看数据库的日志文件名称和日志记录行号,从数据库在配置同步开始节点就是来之此处:

show master status

e1941858297172851134dcb5be17828d.png

2、从数据库设置

// 第一步:进入slaver容器

docker exec -it mysqlSlaveMic bash

// 第二步:登录到mysql

mysql -u root –p

// 在输入框输入对应的root密码:123456

// 第三步:设置主数据库连接

Change master to master_host='主数据地址',master_user=' slavesynchro ',master_password='123456!',get_master_public_key=1,master_log_file='mysql-bin-1.000004 ',master_log_pos= 209210719,master_port=3306;

参数说明:

master_host:主数据库IP地址

master_user:主数据库连接用户名

master_password:主数据量连接密码

master_port:主数据端口

master_log_file:开始同步的主数据库日志名称,主数据库show master status

队列的Flie列数据

master_log_pos:开始同步的主数据库日志开始位置,主数据库show master status

队列的Position列数据

// 第四步:启动主从同步

start slave;

// 第五步:查看主从同步状态

show slave status\G;

只有Slave_IO_Running: Yes

Slave_SQL_Running: Yes

都为yes,才代表主从同步正常运行,否则都需要根据实际情况做对于的调整处理。

114fa839b0966d744b11c6d9de64324d.png

六、sql同步执行失败后不在同步处理

主从同步在实际使用过程中,如果处理的不好,可能会导致同步失败,比如:从数据库也在做新增操作,如果有自增主键约束,那么就可能导致同步失败。因为主从同步最终目的是实现数据的一致性,所有当某一项同步失败,那么就不会再做后同步处理。那么如果出现同步失败后又该如何处理呢?

在实际处理过程中,大概有两种处理方式:

1、主从数据差异小,并且不关最终数据的一致性,那么可以设置直接跳过同步出差的日志,继续同步后续数据,具体操作命令如下:

第一步:停止主从同步

stop slave;

第二步:跳过错误的日志位置,继续后续同步,后面的数字可变

set global sql_slave_skip_counter =1;

第三步:继续开启主从同步

start slave;

2、如果主从数据差异大,并且要求主从数据完全一致,那么需要:重新做主从,完全同步。

第一步:删除从数据库,讲主数据库备份到从数据库(确保主从数据完全一致)

第二步:按照上面的流程,重新配置主从同步

七、自我一些总结

1、 主从同步数据库,一定要注意读写分离。从数据库做读操作,不要做写操作,最好直接只给从数据库读权限,不给写权限

2、 数据库设置主从同步账号时,最好创建专门的账号用来做主从同步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你已经在MySQL上成功配置主从同步,并且已经安装了ShardingProxy。下面是在ShardingProxy中配置MySQL主从同步数据库实现读写分离的步骤: 1. 在ShardingProxy的配置文件中,定义主从同步的数据源,如下所示: ``` dataSources: dbtest_master: url: jdbc:mysql://master:3306/dbtest?useSSL=false&serverTimezone=UTC username: root password: root connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 minPoolSize: 1 dbtest_slave: url: jdbc:mysql://slave:3306/dbtest?useSSL=false&serverTimezone=UTC username: root password: root connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 minPoolSize: 1 ``` 在这个配置文件中,我们定义了两个数据源,一个是主库dbtest_master,一个是从库dbtest_slave。 2. 在ShardingProxy的配置文件中,定义路由规则,将写操作路由到主库上,将读操作路由到从库上,如下所示: ``` rules: - !REPLACE sql: select table: users dataSources: dbtest_slave - !REPLACE sql: update,insert,delete table: users dataSources: dbtest_master ``` 在这个配置文件中,我们定义了两个路由规则。第一个规则将所有的select语句路由到从库dbtest_slave上,第二个规则将所有的update、insert和delete语句路由到主库dbtest_master上。 3. 在应用程序中,使用ShardingProxy提供的数据源,如下所示: ``` spring.shardingsphere.datasource.names=ds spring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://127.0.0.1:3307/dbtest?useSSL=false&serverTimezone=UTC spring.shardingsphere.datasource.ds.username=root spring.shardingsphere.datasource.ds.password=root spring.shardingsphere.datasource.ds.max-active=100 spring.shardingsphere.datasource.ds.initial-size=10 spring.shardingsphere.datasource.ds.max-wait=10000 spring.shardingsphere.datasource.ds.min-idle=10 ``` 在这个配置文件中,我们定义了一个数据源ds,使用了ShardingProxy提供的HikariDataSource,并将它的jdbc-url设置为ShardingProxy的端口号,即3307。 通过以上几个步骤,你就可以在ShardingProxy中配置MySQL主从同步数据库实现读写分离了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值