Mysql 主从库搭建

注意:确保主从库上安装了相同版本的数据库,因为主从库的角色可能会互换,同时减少出错的概率,所以在可能的情况下推荐安装最新的稳定版,本文使用版本为5.7.36

搭建主库

1、创建主库复制使用的账户

create user slavauser@'ip' identified by 'password';

grant replication slave on *.* to slavauser@'ip';

2、查看权限是否正确

show grants for slavauser@'ip';
image.png

3、修改主数据库配置文件my.cnf,开启binlog,并设置server-id,这两个参数修改需要重启数据库服务

[mysqld]
server-id=1
log-bin=/var/log/mysql/localhost-binlog

#需要同步的表,不配置默认同步所有数据库
binlog-do-db=db_a
binlog-do-db=db_b
binlog-do-db=db_c
......

4、将主数据库的数据备份到从数据库,建议设置读锁有效,确保没有数据库写操作,以便获得一致性的快照

flush tables with read lock

主数据库备份完成后,可以恢复写操作

unlock tables

5、查询主库上当前二进制日志名和偏移量值,目的是为了在从数据库启动以后,从这个点开始进行数据的恢复

show master status
image.png

6、启动或重启主数据库服务

搭建从库

1、修改my.cnf,增加server-id参数,注意值必须是唯一的,不能和主数据库的server-id相同:

[mysqld]
server-id=2

#指定同步的数据库,如果不配置,默认同步所有数据库
replicate-do-db=sql_inform

skip-slave-start

在从库上,使用--skip-slave-start选项启动从数据库,也可以在my.cnf中加入skip-slave-start配置,这样不会立即启动从数据库服务器上的复制进行,方便做进一步配置。

2、对从数据库服务器做相应设置
change master to
master_host = '主数据库服务器IP',
master_port = 数据库端口,
master_user = '主数据复制用户',
master_password = '主数据复制用户密码',
master_log_file = '主数据当前二进制日志名',
master_log_pos = 主数据当前二进制日志偏移量值;
示列:

change master to 
master_host = '192.168.1.102',
master_port = 9802,
master_user = 'slavauser',
master_password = '123456',
master_log_file = 'localhost-binlog.000009',
master_log_pos = 2329;

3、在从库上,启动slave线程

start slave

这时在从库上执行show processlist命令将显示类似如下进程:

image.png

这表明slave已经连上master,并开始接受并执行日志。也可以在从库上执行 show slave status 命令,查看两个重要字段是否都为yes

image.png

还可以在主数据库上执行一个更新操作,观察是否同步到从数据库。

如果以上操作之一没有成功,请查看从数据库上的错误日志,进行排查。

多线程复制(扩展)

mysql5.7,带来了全新的多线程复制技术,解决了master同一个schema下的数据发生了变更,从库不能并发应用的问题。

1、在从库my.cnf上追加配置以下参数

[mysqld]
#多线程复制(从库)
#复制依赖主库commit时刻的时间戳
slave_parallel_type=LOGICAL_CLOCK
#执行线程数量
slave_parallel_workers=4
#在复制过程中,保证和主库事务提交顺序的一致性
slave_preserve_commit_order=ON
relay_log_recovery=ON
master_info_repository=table
relay_log_info_repository=table  

增强半同步复制(扩展)

前面介绍的复制是异步操作,主库和从库的数据之间难免会存在一定的延迟,这样存在一个隐患:当在主库中写入一个事务并提交,而从库未得到主库的binlog日志时,主库由于磁盘损坏,内存故障,断点等原因意外宕机,导致主库上该事务binlog丢失,此时从库就会损失这个事务,从而造成主从不一致。

在传统的半同步复制中,主库写数据到BINLOG,且执行Commit操作后,会一直等待从库的ACK,即从库写入RelayLog(中继日志)后,并将数据落盘,返回给主库消息,通知主库可以返回前端应用操作成功,这样会出现一个问题,就是实际上主库已经将该事务Commit到了事务引擎层,应用已经可以看到数据发生了变化,只是在等返回而已,如果此时主库宕机,有可能从库还没能写入RelayLog,就会发生主从库数据不一致。

增强半同步就是为了解决这个问题,做了微调,即主库写数据到BINLOG后,就开始等待从库的应答ACK,直到至少一个从库写入RelayLog后,并将数据落盘,然后返回给主库消息,通知主库可以执行Commit操作,然后主库开始提交到事务引擎层,应用此时可以看到数据发生了变化。增强半同步复制的大致流程如图30-9所示。

image.png

半同步复制模式下,假如在传送 BINLOG日志到从库时,从库宕机或者网络故障,导致BINLOG并没有及时地传送到从库上,此时主库上的事务会等待一段时间(时间长短由参数rpl_semi_sync_master_timeout设置的毫秒数决定)如果 BINLOG在这段时间内都无法成功发送到从库上,则MySQL自动调整复制为异步模式,事务正常返回提交结果给客户端。

半同步复制很大程度上取决于主从库之间的网络情况,往返时延RTT越小决定了从库的实时性越好。通俗地说,主从库之间网络越快,从库越实时。

注意:往返时延RTT(Round-TripTime)在计算机网络中是一个重要的性能指标,它表示从发送端发送数据开始到发送端接收到接收端的确认,总共经历的时长。

1、在主库上安装semisync_master.so插件

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

2、在从库上安装 semisync_slave.so插件

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

查看安装的插件

select * from mysql.plugin;
image.png

3、在主库my.cnf中配置参数打开半同步,默认是不打开的

[mysqld]
#半同步配置(主库)
rpl_semi_sync_master_enabled=on
#主库上的事务等待从库响应时间
rpl_semi_sync_master_timeout=1000
#增强半同步
rpl_semi_sync_master_wait_point=AFTER_SYNC

4、在从库my.cnf中配置参数,打开半同步

[mysqld]
#打开半同步(从库)
rpl_semi_sync_slave_enabled=ON

5、由于之前的配置,需要重启从库I/O线程(如果是全新配置的半同步复制,则不需要)

stop slave
start slave

到此半同步配置完成。主库上通过show status like '%semi_sync%'命令能够看到当前半同步复制的一些状态

image.png

着重关注以下3个状态值:
Rpl_semi_sync_master_status:值为ON,表示半同步复制目前处于打开状态。

Rpl_semi_sync_master_yest:值为6表示主库当前有6个事务是通过半同步复制到从库。

Rpl_semi_sync_master_no:值为1表示在半同步模式下,从库没有及时响应的事务为1个。

命令集合:

show master status;
show processlist;
start slave;
stop slave;
reset slave all;  //重置从库连接主库所有配置内容

change master to 
master_host = '192.168.1.102',
master_port = 9802,
master_user = 'repl',
master_password = 'Re123456..',
master_log_file = 'localhost-binlog.000007',
master_log_pos = 5665;

select @@have_dynamic_loading; // 查看是否支持动态增加插件
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
show status like '%semi_sync%'

主库my.cnf配置文件参考

[mysqld]
server-id=1
#端口
port=9802
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
pid-file=/usr/local/mysql/mysql.pid
symbolic-links=0
log_timestamps=SYSTEM

#需要同步的表
binlog-do-db=sql_inform
binlog-do-db=test

#半同步配置(主库)
rpl_semi_sync_master_enabled=on
rpl_semi_sync_master_timeout=1000
#增强半同步
rpl_semi_sync_master_wait_point=AFTER_SYNC

#启动日志,错误日志
log-error=/var/log/mysql/localhost-error.log

#慢日志
slow_query_log=ON
slow_query_log_file=/var/log/mysql/localhost-slow.log
#超时时间
long_query_time=5

#二进制日志
log-bin=/var/log/mysql/localhost-binlog
log_bin_index=/var/log/mysql/localhost-binlog.index
#二进制日志保留天数
expire_logs_days=7

#查询日志
general_log=0
general_log_file=/var/log/mysql/localhost-query.log

#密码强度
plugin-load-add=validate_password.so
validate_password_length=8
validate_password_policy=MEDIUM

#模式
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

[mysql]
default-character-set=utf8

[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.dlog
#pid-file=/var/run/mariadb/mariadb.pid
log-error=/var/log/mysql/localhost-error.log
pid-file=/usr/local/mysql/mysql.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

从库my.cnf配置文件参考

[mysqld]
server-id=3
port=9803
datadir=/usr/local/mysql9803/data
socket=/usr/local/mysql9803/mysql.sock
pid-file=/usr/local/mysql9803/mysql.pid
log_timestamps=SYSTEM

#多线程复制(从库)
slave_parallel_type=LOGICAL_CLOCK  #复制依赖主库commit时刻的时间戳
slave_parallel_workers=4   #执行线程数量
slave_preserve_commit_order=ON  #在复制过程中,保证和主库事务提交顺序的一致性
relay_log_recovery=ON
master_info_repository=table
relay_log_info_repository=table

#打开半同步(从库)
rpl_semi_sync_slave_enabled=ON

#error日志
log-error=/var/log/mysql9803/localhost-error.log

#慢日志
slow_query_log=ON
slow_query_log_file=/var/log/mysql9803/localhost-slow.log
#超时时间
long_query_time=5

#二进制日志
log-bin=/var/log/mysql9803/localhost-binlog
log_bin_index=/var/log/mysql9803/localhost-binlog.index
#二进制日志保留天数
expire_logs_days=7

#中继日志
relay_log=/var/log/mysql9803/localhost-relay-bin
log_slave_updates=on

#查询日志
general_log=0
general_log_file=/var/log/mysql9803/localhost-query.log

#密码强度
#plugin-load-add=validate_password.so
#validate_password_length=8
#validate_password_policy=MEDIUM

#模式
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

[mysql]
default-character-set=utf8

[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.dlog
#pid-file=/var/run/mariadb/mariadb.pid
log-error=/var/log/mysql9803/localhost-error.log
pid-file=/usr/local/mysql9803/mysql.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容