一、什么是主从复制
    主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。
    二、主从复制的作用
    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
    如图:image.png

    _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’; ” 可以看到修改成功,表示密码策略修改成功了!!!
    如图所示:image.png

    6.登陆root账号
    mysql -uroot -ppassword
    image.png

    创建用于数据同步的账户
    CREATE USER ‘repl’@’10.10.11.157’ IDENTIFIED BY ‘123456’;
    GRANT REPLICATION SLAVE ON . TO ‘repl’@’10.10.11.157’;
    FLUSH PRIVILEGES;
    image.png

    7.配置数据库主从
    编辑主节点配置文件,添加启用二进制日志文件
    vim /etc/my.cnf
    添加:
    [mysqld]
    log-bin=mysql-bin # 非必需
    server-id=1 # 必需
    修改配置后,需要重启mysql。

    _8.进入数据库,查看日志信息,查看二进制日志是否开启

    mysql> show global variables like ‘%log%’;
    image.png
    查看主节点二进制日志列表
    mysql> show master logs;
    image.png

    查看主节点的server id
    image.png

    主服务器配置完成。
    关闭防火墙
    systemctl stop firewalld
    注意:确保主服务器的iptables没有阻断3306的访问端口。

    9.配置从服务器
    编辑从节点配置文件,开启中继日志
    在/etc/my.cnf添加:
    server-id=2
    image.png


    查看server 相关信息:
    mysql> show global variables like ‘%server%’;
    image.png

    执行同步语句,并启动slave;
    mysql> CHANGE MASTER TO MASTER_HOST=’yourmasterip’,MASTER_USER=’root’,MASTER_PASSWORD=’yourmasterpassword’, MASTER_LOG_FILE=’mysql-bin.000001’,MASTER_LOG_POS=154;
    image.png

    查看从节点的状态信息:
    mysql> show slave status\G;
    image.png

    启动复制线程START SLAVE 可以指定线程类型:IO_THREAD ,SQL_THREAD, 如果不指定,则两个都启动。然后再次查看从节点状态信息.
    start slave;
    image.png

    此时,主从复制已搭建成功,下面我们进行测试!

    五、测试
    在主节点创建数据库,并查看主节点二进制日志信息
    create database test1;
    show master logs;
    image.png

    在从节点查找二进制日志信息,并查看mydb数据库是否复制成功
    image.png

    在主数据库上操作,从主数据库中建库,建表:
    image.png

    在从数据库上查看:
    image.png
    主从测试成功;

    接下来开始配置读写分离
    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

    CentOS 7搭建部署MySQL主从复制,读写分离 - 图17

    修改配置文件权限
    chmod 660 /etc/mysql-proxy.cnf

    修改读写分离配置文件

    image.png

    启动mysql-proxy:
    $ /usr/local/mysql-proxy/bin/mysql-proxy —defaults-file=/etc/mysql-proxy.cnf
    $ netstat -tupln | grep 4000 #已经启动
    image.png

    登陆主服务器上
    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
    image.png
    因为mysql客户端对proxy的支持有bug不是很好,所以用软件连接展示:

    mysql> use test;
    mysql> select * from bwjf;
    image.png

    为了更显著看到读写分离效果,现将两台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节点上的数据:
    image.png

    直接从 proxy 上插入数据
    mysql> insert into bwjf values(03,’hehe’);
    image.png

    再次查询

    1 mysql> select * from bwjf; # 结果显示查询数据没有变化,因为proxy上执行insert相当于写入到了master上,而查询的数据是从slave上读取的。
    image.png

    主表查询:
    image.png

    至此,读写分离测试完成,在proxy执行插入,会在主表执行,在proxy执行查询,会显示从表的结果。