一、什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。
二、主从复制的作用
1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。 3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
三、主从复制的原理
1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。
具体需要三个线程来操作:
1.binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
2.从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
3.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。
四、安装步骤
1.环境
我使用的是虚拟机,如下:
10.10.11.155
10.10.11.157
2.两个ECS都安装mysql,检查系统是否安装其他版本的MYSQL数据
#yum list installed | grep mysql
如图:
_3.启动mysql
# systmect start mysqld
4.设置mysql开机自启动
#systemctl enable mysqld
5.设置root密码
_—首先获取mysql的临时密码:_grep password /var/log/mysqld.log
—然后用临时密码登录:mysql -uroot -p’Jt-+uE1v3cg&’ -A
—修改密码首先需要设置密码的验证强度等级,设置 validate_password_policy 的全局参数为 LOW 即可,
输入设值语句 “ set global validate_password_policy=LOW; ” 进行设值。
—当前密码长度为 8 ,如果不介意的话就不用修改了,按照通用的来讲,设置为 6 位的密码,设置 validate_password_length 的全局参数为 6 即可
输入设值语句 “ set global validate_password_length=6; ” 进行设值
—现在可以为 mysql 设置简单密码了,只要满足六位的长度即可,
输入修改语句 “ ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘123456’; ” 可以看到修改成功,表示密码策略修改成功了!!!
如图所示:
6.登陆root账号
mysql -uroot -ppassword
创建用于数据同步的账户
CREATE USER ‘repl’@’10.10.11.157’ IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE ON . TO ‘repl’@’10.10.11.157’;
FLUSH PRIVILEGES;
7.配置数据库主从
编辑主节点配置文件,添加启用二进制日志文件
vim /etc/my.cnf
添加:
[mysqld]
log-bin=mysql-bin # 非必需
server-id=1 # 必需
修改配置后,需要重启mysql。
_8.进入数据库,查看日志信息,查看二进制日志是否开启
mysql> show global variables like ‘%log%’;
查看主节点二进制日志列表
mysql> show master logs;
查看主节点的server id
主服务器配置完成。
关闭防火墙
systemctl stop firewalld
注意:确保主服务器的iptables没有阻断3306的访问端口。
9.配置从服务器
编辑从节点配置文件,开启中继日志
在/etc/my.cnf添加:
server-id=2
查看server 相关信息:
mysql> show global variables like ‘%server%’;
执行同步语句,并启动slave;
mysql> CHANGE MASTER TO MASTER_HOST=’yourmasterip’,MASTER_USER=’root’,MASTER_PASSWORD=’yourmasterpassword’, MASTER_LOG_FILE=’mysql-bin.000001’,MASTER_LOG_POS=154;
查看从节点的状态信息:
mysql> show slave status\G;
启动复制线程START SLAVE 可以指定线程类型:IO_THREAD ,SQL_THREAD, 如果不指定,则两个都启动。然后再次查看从节点状态信息.
start slave;
此时,主从复制已搭建成功,下面我们进行测试!
五、测试
在主节点创建数据库,并查看主节点二进制日志信息
create database test1;
show master logs;
在从节点查找二进制日志信息,并查看mydb数据库是否复制成功
在主数据库上操作,从主数据库中建库,建表:
在从数据库上查看:
主从测试成功;
接下来开始配置读写分离
1、读写分离原理:
读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。
Mysql-proxy读写分离
Mysql-proxy代理:将写操作分到mysql-master,读操作分到mysql-slave
下载mysql-proxy
[root@master dingmingyi]#wget http://mirrors.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz
tar zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gzmv mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit /usr/local/mysql_proxy
mkdir lua #创建脚本存放目录
mkdir logs #创建日志目录
cp share/doc/mysql-proxy/rw-splitting.lua ./lua #复制读写分离配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua #复制管理脚本
vim /etc/mysql-proxy.cnf #创建配置文件
[mysql-proxy]
user=root
admin-username=proxy
admin-password=123456
proxy-address=10.10.11.205:4000
proxy-read-only-backend-addresses=10.10.11.157:3306
proxy-backend-addresses=10.10.11.155:3306
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=info
daemon=true
keepalive=true
修改配置文件权限
chmod 660 /etc/mysql-proxy.cnf
修改读写分离配置文件
启动mysql-proxy:
$ /usr/local/mysql-proxy/bin/mysql-proxy —defaults-file=/etc/mysql-proxy.cnf
$ netstat -tupln | grep 4000 #已经启动
登陆主服务器上
mysql> grant all on . to proxy@’%’identified by ‘123456’;
mysql>flush privileges;
使用客户端连接 mysql-proxy
$ mysql -u proxy -h 10.10.11.205 -P 4000 -p
因为mysql客户端对proxy的支持有bug不是很好,所以用软件连接展示:
mysql> use test;
mysql> select * from bwjf;
为了更显著看到读写分离效果,现将两台slave关闭
mysql> stop slave;
注:这里以bwjf为测试数据库,由于前面进行主从复制,在从服务器中也存在bwjf库。
为了看到单点效果,现做如下操作:
mysql> insert into bwjf values(02,’lisi’); ——〉主服务器
mysql> insert into bwjf values(01,’zhangsan’); ——〉从服务器
mysql>select * from bwjf; ——〉proxy # 如下图从结果可以看到数据是从slave上读取的,并没考虑master节点上的数据:
直接从 proxy 上插入数据
mysql> insert into bwjf values(03,’hehe’);
再次查询
1 mysql> select * from bwjf; # 结果显示查询数据没有变化,因为proxy上执行insert相当于写入到了master上,而查询的数据是从slave上读取的。
主表查询:
至此,读写分离测试完成,在proxy执行插入,会在主表执行,在proxy执行查询,会显示从表的结果。