大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
数据库内均无数据,关闭主从库的iptables(chkconfig iptables off)。
创新互联建站-专业网站定制、快速模板网站建设、高性价比海棠网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式海棠网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖海棠地区。费用合理售后完善,10多年实体公司更值得信赖。
1、主库配置
修改主库MySQL配置文件/ect/my.cnf:
[mysqld]
log-bin=mysql-bin
server-id=1
#skip-networking
#bind-address
server-id用来标识MySQL数据库,log-bin开启二进制日志,注释掉skip-networking和bind-address。 重启主库MySQL。
2、账号配置
在主库服务器上,新建一个用于同步的账号。
mysql create user 'user'@'%.domain.com' identified by 'password';
mysql grant repliction slave on *.* to 'user'@'%.domain.com';
新建的用户user@%.domain.com,赋予slave权限。
3、主库状态
mysql show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000009 | 480 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
记录下File和Position的值,之后暂时不要操作主库,防止主库状态发生变化。
4、从库配置
修改主库MySQL配置文件/ect/my.cnf:
[mysqld]
log-bin=mysql-bin
server-id=2
注意主从库的server-id不要相同。
将主库信息导入到从库中:
mysql CHANGE MASTER TO
- MASTER_HOST='192.168.3.11',
- MASTER_USER='usere',
- MASTER_PASSWORD='password',
- MASTER_LOG_FILE='mysql-bin.000009',
- MASTER_LOG_POS=480;
启动从库slave同步:
mysql start slvae;
5、从库状态
mysql show slave status;
查看 Slave_IO_Running | Slave_SQL_Running,如果出现的结果是Yes | Yes,说明mysql主从配置成功完成了。
6、验证同步
在主库新建数据库,导入sql脚本后,查看从库也做了相应的改变,说明mysql主从同步成功。
在配置Mysql数据库主从复制集群的时候要保证:
1.主从服务器操作系统版本和位数一致。
2.Mysql版本一致。
为了保证稳定性,最好服务器操作系统和Mysql数据库环境一致。
CentOS服务器上Mysql的安装方法可以参见博客:
服务器配置:
Master:192.168.1.18
Slave:192.168.1.16
Master(192.168.1.18)服务器:
1.编辑/etc/my.cnf
[root@jhq0229 ~]# vim /etc/my.cnf
2.配置
[plain] view plain copy print?
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
#主从复制配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#需要备份的数据库
binlog-do-db=orders
#不需要备份的数据库
binlog-ignore-db=mysql
#启动二进制文件
log-bin=mysql-bin
#服务器ID
server-id=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
若没有配置binlog-do-db和binlog_ignore_db,表示备份全部数据库。
3.重启Mysqld服务
[root@jhq0229 ~]# service mysqld restart
4.为从Mysql创建用户
登录
[root@jhq0229 ~]# mysql -uroot -p
Enter password:
创建用户
mysql create user 'mastj'@'192.168.1.16' identified by '123456';
配置主从复制权限
mysql grant replication slave on *.* to 'mastj'@'192.168.1.16' identified by '123456';
若orders数据库中已经有数据,还需要:
锁定数据库
mysql flush tables with read lock;
将数据导入到从数据库,方法有多种,我是用Navicat复制的,复制完成后:
查看master状态并解锁:
[html] view plain copy print?
mysql show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2005 | orders | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql unlock tables;
Slave(192.168.1.16)服务器:
1.配置服务ID
[root@jhq0113 ~]# vim /etc/my.cnf
在[mysqld]下面加入
server-id=2
重启Mysql服务
[root@jhq0113 ~]# service mysqld restart
2.配置复制
登录mysql
[root@jhq0113 ~]# mysql -uroot -p
执行
mysql change master to master_host='192.168.1.18',
master_user='mastj',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos=2005,
master_connect_retry=10;
参数详解:
master_host:主服务器的IP。
master_user:配置主服务器时建立的用户名
master_password:用户密码
master_port:主服务器mysql端口,如果未曾修改,默认即可。
master_log_file:日志文件名称,填写查看master状态时显示的File
master_log_pos:日志位置,填写查看master状态时显示的Position
master_connect_retry:重连次数
启动进程
mysql start slave;
检查主从复制状态
[plain] view plain copy print?
mysql show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.18
Master_User: mastj
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 2369
Relay_Log_File: jhq0113-relay-bin.000002
Relay_Log_Pos: 647
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
若Slave_IO_Running和Slave_SQL_Running均为Yes,则表示连接正常。
此时就可以测试主从复制了。
MySQL 主从一直是面试常客,里面的知识点虽然基础,但是能回答全的同学不多。
比如楼哥之前面试小米,就被问到过主从复制的原理,以及主从延迟的解决方案,因为回答的非常不错,给面试官留下非常好的印象。你之前面试,有遇到过哪些 MySQL 主从的问题呢?
所谓 MySQL 主从,就是建立两个完全一样的数据库,一个是主库,一个是从库, 主库对外提供读写的操作,从库对外提供读的操作 ,下面是一主一从模式:
对于数据库单机部署,在 4 核 8G 的机器上运行 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS, 当遇到一些活动时,查询流量骤然,就需要进行主从分离。
大部分系统的访问模型是读多写少,读写请求量的差距可能达到几个数量级,所以我们可以通过一主多从的方式, 主库只负责写入和部分核心逻辑的查询,多个从库只负责查询,提升查询性能,降低主库压力。
MySQL 主从还能做到服务高可用,当主库宕机时,从库可以切成主库,保证服务的高可用,然后主库也可以做数据的容灾备份。
整体场景总结如下:
MySQL 的主从复制是依赖于 binlog 的,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。
主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步的完成。
详细流程如下:
当主库和从库数据同步时,突然中断怎么办?因为主库与从库之间维持了一个长链接,主库内部有一个线程,专门服务于从库的这个长链接的。
对于下面的情况,假如主库执行如下 SQL,其中 a 和 create_time 都是索引:
我们知道,数据选择了 a 索引和选择 create_time 索引,最后 limit 1 出来的数据一般是不一样的。
所以就会存在这种情况:在 binlog = statement 格式时,主库在执行这条 SQL 时,使用的是索引 a,而从库在执行这条 SQL 时,使用了索引 create_time,最后主从数据不一致了。
那么我们改如何解决呢?
可以把 binlog 格式修改为 row,row 格式的 binlog 日志记录的不是 SQL 原文,而是两个 event:Table_map 和 Delete_rows。
Table_map event 说明要操作的表,Delete_rows event用于定义要删除的行为,记录删除的具体行数。 row 格式的 binlog 记录的就是要删除的主键 ID 信息,因此不会出现主从不一致的问题。
但是如果 SQL 删除 10 万行数据,使用 row 格式就会很占空间的,10 万条数据都在 binlog 里面,写 binlog 的时候也很耗 IO。但是 statement 格式的 binlog 可能会导致数据不一致。
设计 MySQL 的大叔想了一个折中的方案,mixed 格式的 binlog,其实就是 row 和 statement 格式混合使用, 当 MySQL 判断可能数据不一致时,就用 row 格式,否则使用就用 statement 格式。
有时候我们遇到从数据库中获取不到信息的诡异问题时,会纠结于代码中是否有一些逻辑会把之前写入的内容删除,但是你又会发现,过了一段时间再去查询时又可以读到数据了,这基本上就是主从延迟在作怪。
主从延迟,其实就是“从库回放” 完成的时间,与 “主库写 binlog” 完成时间的差值, 会导致从库查询的数据,和主库的不一致 。
谈到 MySQL 数据库主从同步延迟原理,得从 MySQL 的主从复制原理说起:
总结一下主从延迟的主要原因 :主从延迟主要是出现在 “relay log 回放” 这一步,当主库的 TPS 并发较高,产生的 DDL 数量超过从库一个 SQL 线程所能承受的范围,那么延时就产生了,当然还有就是可能与从库的大型 query 语句产生了锁等待。
我们一般会把从库落后的时间作为一个重点的数据库指标做监控和报警,正常的时间是在毫秒级别,一旦落后的时间达到了秒级别就需要告警了。
解决该问题的方法,除了缩短主从延迟的时间,还有一些其它的方法,基本原理都是尽量不查询从库。
具体解决方案如下:
在实际应用场景中,对于一些非常核心的场景,比如库存,支付订单等,需要直接查询从库,其它非核心场景,就不要去查主库了。
两台机器 A 和 B,A 为主库,负责读写,B 为从库,负责读数据。
如果 A 库发生故障,B 库成为主库负责读写,修复故障后,A 成为从库,主库 B 同步数据到从库 A。
一台主库多台从库,A 为主库,负责读写,B、C、D为从库,负责读数据。
如果 A 库发生故障,B 库成为主库负责读写,C、D负责读,修复故障后,A 也成为从库,主库 B 同步数据到从库 A。
大致步骤如下:主MySQL服务器:192.168.3.1备MySQL服务器:192.168.3.2配置文件路径:/etc/my.cnfMySQL服务状态:停止-------------------------主服务器配置-------------------编辑配置文件:vi
/etc/my.cnf找到[mysqld]在它下面添加内容:server-id=1log-bin=backuplogbinlog-do-db=test#如果有多个数据库需要同步,添加多行即可#binlog-do-db=test2保存my.cnf配置文件。启动mysql:service
mysqld
start用root登录mysql,为同步数据创建新帐号:grant
file,select,replication
slave
on
*.*
to
'test'@'%'
identified
by
'123456';------------------------备服务器配置-------------------------编辑配置文件:vi
/etc/my.cnf在[mysqld]下加入:server-id=2master-host=192.168.3.1master-user=testmaster-password=123456master-port=3306#replicate-do-db=test
#此配置项为设置仅同步的数据库名,其它数据库忽略(建议不设置此选项)保存并启动mysql即可。如果需要查看同步状态,可分别在主从服务器上用如下命令查看:主服务器:show
master
status;从服务器:show
slave
status\G------------------值得说明的两个文件-----------------备份服务器上的/var/lib/mysql/目录下有两个:master.info和relay-log.info它们记录了主服务器的配置信息和同步信息,如果出现备份服务器不能同步数据的问题,可尝试将这两个文件删除,让备服务器重新同步。备注:进行操作之前先备份下数据比较保险一点。