做网站延期交付了,衡水建立网站,企业服务专区,WordPress完美建站一#xff0c;MySQL主从配置原理1. mysql支持的复制格式基于语句复制(STATEMENT)#xff08;优点#xff09;基于statement复制的优点很明显#xff0c;简单的记录执行语句同步到从库执行同样的语句#xff0c;占用磁盘空间小#xff0c;网络传输快#xff0c;并且通过m…一MySQL主从配置原理1. mysql支持的复制格式基于语句复制(STATEMENT)优点基于statement复制的优点很明显简单的记录执行语句同步到从库执行同样的语句占用磁盘空间小网络传输快并且通过mysqlbinlog工具容易读懂其中的内容 。缺点并不是所有语句都能复制的比如insert into table1(create_time) values(now())取的是数据当前时间不同的数据可能时间不一致另外像存储过程和触发器也可能存在问题。基于行复制(ROW优点从MySQL5.1开始支持基于行的复制最大的好处是可以正确地复制每一行数据。一些语句可以被更加有效地复制另外就是几乎没有基于行的复制模式无法处理的场景对于所有的SQL构造、触发器、存储过程等都能正确执行。缺点主要的缺点就是二进制日志可能会很大比如update table1 set nameadmin where id1000基于行复制可能需要复制1000条记录而基于语句复制只有一条语句另外一个缺点就是不直观所以你不能使用mysqlbinlog来查看二进制日志。混合类型的复制(MIXED)混合复制是借用语句复制和行复制的有点进行整合MIXED也是MySQL默认使用的二进制日志记录方式但MIXED格式默认采用基于语句的复制一旦发现基于语句的无法精确的复制时就会采用基于行的复制。比如用到UUID()、USER()、CURRENT_USER()、ROW_COUNT()等无法确定的函数。2. mysql主从复制作用数据分布主从分摊负载。高可用性和故障切换。数据备份。利用从服务器做查询。3. mysql主从复制原理binlog Events 我们知道binlog日志用于记录所有对MySQL的操作的变更而这每一个变更都会对应的事件也就是Event。index文件记录了所有的binlog位置 每个binlog会有heade eventrotate三个eventbinlog的结构如下。常见event如下Format_desc一个全新的binlog日志文件event信息Rotate 日志分割时结束event。Table_map表列等元数据的event。Query查询就是DDL这类的Event如果binlog格式为STATEMENT格式增删改都属于Qeury event。Write_rowsBinlog为ROW格式时的插入event。Update_rowsBinlog为ROW格式时的更新event。Delete_rowsBinlog为ROW格式时的删除event。我们也可以通过binlog 看到这些事件通过mysql提供的工具查看binlog日志如下:主从复制流程当从库发出 start slave命令时从库会创建I/O线程和SQL threadSQL线程从库的IO和主库的dump线程建立连接 并监听binlog二进制日志事件从库根据change master to 语句提供的file名和position号IO线程向主库发起binlog的请求主库dump线程根据从库的请求将本地binlog以events的方式发给从库IO线程从库IO线程接收binlog evnets并存放到本地relay-log中传送过来的信息会记录到http://master.info中。从库SQL线程应用relay-log并且把应用过的记录到relay-log.info,默认情况下已经应用过的relay会自动被清理purge。二MySQL只从配置缺陷MySQL的复制replication功能配置简单深受开发人员的喜欢基于复制的读写分离方案也非常流行。而MySQL数据库高可用大多也是基于复制技术但是MySQL复制本身依然存在部分缺陷最为主要的问题如下
复制代码数据丢失问题consistency数据同步延迟问题delay扩展性问题scalability从MySQL 5.7的lossless semi-sync replication已经解决了主从数据丢失的问题MySQL 5.7的multi-thread slave也很大程度地解决了数据同步延迟的问题MySQL 5.7的Group replication也很大程度地解决了扩展性问题。另外MySQL 5.7.22 backlog了MySQL 8.0中的基于WriteSet的并行复制可以说完全解决了主从数据延迟的问题。可以看出MySQL正在朝着一个非常好的方向发展三准备工作准备3台服务器分别为Master 192.168.1.234Slave 192.168.1.235Slave 192.168.1.236四MySQL安装配置下载MySQL安装包下载地址cdn.mysql.com//Downloads/…解压安装文件[rootlocalhost ~]# cd /software[rootlocalhost software]# tar -zxzf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
复制代码拷贝安装文件到指定文件夹[rootlocalhost ~]# cp /software/mysql-5.7.17-linux-glibc2.5-x86_64/* /usr/local/mysql -r
复制代码添加系统mysql组和mysql用户[rootlocalhost ~]# groupadd mysql[rootlocalhost ~]# useradd -r -g mysql mysql
复制代码进入安装mysql软件目录执行命令 cd /usr/local/mysql修改当前目录拥有者为mysql用户执行命令 chown -R mysql:mysql ./安装数据库5.6以及之前版本安装数据库/usr/local/mysql/bin/mysql_install_db --usermysql --basedir/usr/local/mysql/ --datadir/usr/local/mysql/data/5.7版本安装数据库/usr/local/mysql/bin/mysqld --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data/ --initialize拷贝配置文件到指定文件夹[rootlocalhost mysql]# cp -a ./support-files/my-default.cnf /etc/my.cnf[rootlocalhost mysql]# cp -a ./support-files/mysql.server /etc/init.d/mysqld后台启动mysql[rootlocalhost mysql]# ./bin/mysqld_safe --usermysql 重启mysql执行命令 /etc/init.d/mysqld restart设置为开机启动执行命令chkconfig --level 35 mysqld on初始化密码依据官方说明5.6以后版本第一次启动时会在root目录下生产一个随机密码文件名.mysql_secret。cat /root/.mysql_secret修改root密码/usr/local/mysql/bin/mysqladmin -u root -h localhost password 123456 -pEnter password处输入输入.mysql_secret里第二行内容遇上-bash: mysql: command not found未找到命令的情况别着急这个是因为/usr/local/bin目录下缺失mysql导致只需要一下方法建立软链接即可以解决ln -s /usr/local/mysql/bin/mysql /usr/bin五MySQL主从复制配置下载MySQL安装包Master服务器my.cnf增加配置#GTID:server_id234 #服务器id一般为IP末位gtid_modeon #开启gtid模式enforce_gtid_consistencyon #强制gtid一致性开启后对于特定create table不被支持 #binloglog_bin/usr/local/mysql/binlogs/master-binloglog-slave-updates1 binlog_formatrow #强烈建议其他格式可能造成数据不一致 #relay logskip_slave_start1
复制代码Slave服务器my.cnf增加配置#GTID:gtid_modeonenforce_gtid_consistencyonserver_id235 #binloglog-bin/usr/local/mysql/binlogs/slave-binloglog-slave-updates1binlog_formatrow #强烈建议其他格式可能造成数据不一致 #relay logskip_slave_start1read-only ON #这项功能只对非管理员组以为的用户有效
复制代码在Master服务器上创建用于同步的账号create user cspmslave192.168.1.% identified by cspm-slave;对账号进行Slave授权grant replication slave on . to cspmslave192.168.1.%;从库连接主库mysql change master to master_host192.168.1.234, master_port3306, master_usercspmslave, master_passwordcspm-slave, master_auto_position1;mysql start slave;查看从服务器连接状态下图所示两个Yes表示连接成功mysql show slave status G;作者小林啊链接https://juejin.cn/post/6907499323810906126来源掘金侵删