Mysql主从复制原理及搭建
主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
提醒:如果你有阿里云的mysql的话,就没有下面的这些烦恼了。
阿里云mysql:https://www.aliyun.com/product/rds/mysql
Mysq主从复制的类型
基于语句的复制:
主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23版本以后支持。
存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户。
基于行的复制:
把主服务器上面改变后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在MySQL-5.0版本以后引入。
存在的问题:如果修改的行数过多,造成的开销比较大。
MySQL默认使用基于语句的复制,当基于语句的复制会引发问题的时候就会使用基于行的复制,MySQL会自动进行选择。
在MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行。主从复制架构虽然给读操作提供了扩展,可如果写操作也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。
Mysql主从复制的工作原理
如上图所示,主服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。
如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。
Mysql主从复制的过程
- Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。
- Master接收到来自Slave的IO进程的请求后,负责复制的IO进程会根据请求信息读取日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。
- Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master从何处开始读取日志。
- Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
linux安装mysql8并且实现主从同步
服务器准备
准备服务器Server1和Server2,如果在同一个服务器的话则安装mysql时需要改变其端口。
卸载mysql
在安装之前必须先检查主机上有没有安装过mysql,如果安装过的话必须先卸载。
安装mysql
下载软件包:
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
本地安装:
yum localinstall mysql80-community-release-el7-1.noarch.rpm
安装mysql:
yum install mysql-community-server
设为开机启动:
systemctl enable mysqld systemctl daemon-reload
启动mysql:
systemctl start mysqld
以上步骤就安装好mysql8了。
获取mysql的临时密码:
grep 'temporary password' /var/log/mysqld.log
登录mysql:
mysql -uroot -p
会提示输入密码,输入之前获取的临时密码即可登录。
此时需要修改mysql的密码,要不然之后的步骤也会强制提示你需要修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '121b33dAj934J1^Sj9ag';
mysql8默认对密码的强度有要求,需要设置复杂一点,要不然也会提示错误。
刷新配置:
FLUSH PRIVILEGES;
主从配置
在主从配置之前需要确保两台mysql需要同步的库状态一致。
主
配置文件默认在js/etc/my.cnf
下。
在配置文件中新增配置:
[mysqld] ## 同一局域网内注意要唯一 server-id=100 ## 开启二进制日志功能,可以随便取(关键) log-bin=mysql-bin
修改配置后需要重启才能生效:
service mysql restart
重启之后进入mysql:
mysql -uroot -p
在master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED BY '@#$Rfg345634523rft4fa'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
语句中的%代表所有服务器都可以使用这个用户,如果想指定特定的ip,将%改成ip即可。
查看主mysql的状态:
show master status;
记录下File和Position的值,并且不进行其他操作以免引起Position的变化。
从
在从my.cnf配置中新增:
mysqld] ## 设置server_id,注意要唯一 server-id=101 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin
修改配置后需要重启才能生效:
service mysql restart
重启之后进入mysql:
mysql -uroot -p
change master to master_host='172.17.0.2', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
master_host:Master的地址
master_port:Master的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在从mysql中查看主从同步状态:
show slave status \G;
此时的SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。
开启主从复制:
start slave;
再次查看同步状态:
show slave status \G;
SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启。
若SlaveIORunning一直是Connecting,有下面4种原因:
- 1、网络不通,检查ip端口
- 2、密码不对,检查用于同步的用户名和密码
- 3、pos不对,检查Master的Position
- 4、mysql8特有的密码规则问题引起:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';
将密码规则修改为:jsmysql_native_password
如果需要指定想要主从同步哪个数据库,可以在master的my.cnf添加配置:
binlog-do-db:指定mysql的binlog日志记录哪个db
或者在slave的my.cnf添加配置:
`replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可`
如果想要同步所有库和表,在从mysql执行:
STOP SLAVE SQL_THREAD; CHANGE REPLICATION FILTER REPLICATE_DO_DB = (); start SLAVE SQL_THREAD;
如果以上步骤出现问题,可以查看日志:
/etc/log/mysqld.log
至此完成了mysql8主从同步搭建工作。
推荐阿里云mysql:https://www.aliyun.com/product/rds/mysql
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【redis】redis应用场景,缓存的各种问题
redis有一个重要的应用领域——缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下,我们的服务架构如下图,客户端请求service,然后service去读取mysql数据库 问题存在于,数据库性能不够用,数据库是整个架构中最重要的一个环节,它在高并发,高写入频次的时候非常容易崩掉,这是一般的数据库本身的特性所决定的,它们的架构模式注定了不可以承受较大的并发量,所以就有了缓存: service与高速的缓存进行交互,如果缓存中有数据直接返回客户端,如果没有才会从MySql中去查询。减小数据库的压力,提升效率,避免宕机。 例如上面章节提到的,超卖问题,有可能瞬间的流量高达上万,我们不可能把这些请求都响应到数据库上,这样速度慢不说,还随时可能宕机。 提到缓存,就不得不说下面的四大缓存名场面,几乎是做缓存必须面对的问题。 缓存击穿想象一个场景,现在在一个xx办事大厅 张三、李四、王五、赵六、钱钱、刘八、陈九 七个人正在排队 办事处有一个窗口,有一些自动业务机,窗口里面的同志一下子只能接待一个人,而自动业务机因为速度很快可以很快接待很多人。 现在,突然、自动业务机都坏了... 所有人都排到...
- 下一篇
4个影响缓存命中率的因素,你知道几个?
一、缓存命中率的介绍命中:可以直接通过缓存获取到需要的数据。不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。 二、如何监控缓存的命中率在memcached中,运行state命令可以查看memcached服务的状态信息,其中cmd_get表示总的get次数,get_hits表示get的总命中次数,命中率 = get_hits/cmd_get。当然,我们也可以通过一些开源的第三方工具对整个memcached集群进行监控,显示会更直观。比较典型的包括:zabbix、MemAdmin等。如图:MemAdmin对memcached服务的命中率情况的监控统计 同理,在redis中可以运行info命令查看redis服务的状态信息,其中keyspace_hits为总的命中中次数,keyspace_misses为总的miss次数,命中率=keysp...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS关闭SELinux安全模块
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度