MySQL复制:

  Mysql的扩展

   复制:每个节点都要相同的数据集;

    向外扩展;

    二进制日志;

    单向;

  复制的功用

    数据分布;

    负载均衡(读);

    备份

    高可用和故障切换;

    MySQL升级测试   

  主从复制:

    从节点:

     I/O 线程:从master请求二进制日志事件,并保存在中继日志中

     SQL 线程:从中继日志读取日志事件,在本地完成重发

    主节点:

    dump 线程:为每个Slave的I/O线程启动一个dump线程,用于向其发送binary log event.

  特点:

    异步复制:

     主从数据不一致比较常见

  复制架构:M/S,M/M

  二进制日志事件记录格式:

    STATEMEN(语句)

    ROW

    MIXED

  主从配置过程:

    主节点:

      1、启动二进制日志;

       log-bin=master-bin

      2、为当前节点设置一个全局唯一的ID号;

      server-id=1

      3、创建有复制权限的用户账号;

       grant replication slave,replication client on *.* to 'repluser'@'10.10.%.%' identified by 'replpass';

    从节点:

      1、启动中继日志;

         relay-log=relay-log

        relay-log.index=relay-log.index

      2、为当前节点设置一个全局唯一的ID号 ;

       server-id=3  

      3、使用有复制权限的用户账号连接至主服务器,启动复制线程;

change master to master_host='10.10.x.x',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=495;

   sql>start slave;


 如果主节点已经运行一段时间,且有大量数据,如何配置并启动slave节点?

    通过备份恢复数据至从服务器;

    复制起始位置为备份时,二进制日志文件及其pos.


  复制架构中应该注意的问题:

    1、限制从服务器为只读;

     在从服务器设置为read_only=ON;此限制对拥有SUPER权限的用户均无效;

       阻止所以用户:

        sql>flush tables with read lock;

    2、如何保证主从复制事务安全?

      在master节点启用参数:

        sync_binlog=ON

      如果用到为InnoDB存储引擎:

        innodb_flush_log_at_trx_commit=ON

        innodb_support_xa=ON

      在slave节点:

        skip_slave_start=ON


      master节点:

        sync_master_info      1

      slave节点:

           sync_relay_log           

           sync_relay_log_info   

  主主复制

      互为主从:    

        1、数据不一致;因此,慎用;

        2、自动增长ID:

          配置一个节点使用奇数id

            auto_increment_offset=1

            auto_increnent_increment=2

          另一个节点为偶数id    

                auto_increment_offset=2

            auto_increnent_increment=2

  半同步复制

    master:

        sql>install plugin rpl_semi_sync_master soname 'semisync_master.so';

        sql>set global rpl_semi_sync_master_enabled=1;

         sql>show global status like '%semi%';

         sql>show global variables like '%semi%'

    slave:

     

         sql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

        sql>set global rpl_semi_sync_slave_enabled=1;

         sql>show global variables like '%semi%';

   复制过滤器:

       让从节点仅复制指定的数据库,或指定的数据库的指定表;

       有两种实现方式:    

        1)主服务器仅向二进制日志中记录与特定数据库(特定表)相关的事件;

        时间还原无法实现;不建议使用;


        2)从服务器在replay中继日志中的事件中,仅读取与特定数据库(特定表)相关的事件应用本地;   

       问题:会造成网络及磁盘IO浪费

        replicate_do_db   设置白名单(数据库)

        replicate_ignore_db 设置黑名单

        replicate_ignore_table 设置白名单(表)


        sql>set global replicate_do_db='xx'   


  复制的监控和维护

   1、清理日志

    sql> purge binary logs to 'bin.xxxxxx';

   2、监控日志:

    sql>show master status;show processlist;

   3、从服务器是否落后主服务器:

    Seconds_Behind_Master:0

   4、数据库不一致如何修复?

    重新复制;


  MySQL Replication:

    MMM:Multi Master MySQL

    MHA:Master HA

     对节点进行监控,可实现自动故障转移至其他节点,提升某一从节点为新主节点;

    Galera Cluster:wresp

    通过wresp协议在全局实现复制,任何一节点都可读写;


    MHA:

 架构如下:

    manager:192.168.1.151

    master:192.168.1.152

    slave:192.168.1.153

    slave:192.168.1.154


  一. Master配置:

   1、 mysql配置文件:


innodb_file_per_table = 1

skip_name_resolve = 1

log-bin = master-bin

relay-log = relay-bin

server_id=1


   2、建立同步账号及管理账号
    

sql> show master status;


sql> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by 'replpass';


sql> flush privileges;



sql> grant all on *.* to 'mhauser'@'192.168.1.%' identified by 'mhapass';


sql> flush privileges;


 二. slave配置:

   1、 mysql配置文件:


innodb_file_per_table = 1

skip_name_resolve = 1

relay-log = relay-bin

log-bin = master-bin

server_id = 2

read_only = 1

relay_log_purge = 0


    2、使用同步账号连接到主节点,并启动服务:

    

sql> change master to master_host='192.168.1.152',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=245;


sql> start slave;


sql> show slave status\G;


 三. 建立服务器互信


    在其中一台服务器制作公钥及私钥并拷贝到其他服务器:

    ssh-keygen -t rsa -P '' 制作公钥

    cd .ssh

    cat id_rsa.pub >authorized_keys 制作私钥

    chmod 600 authorized.keys

    mkdir .ssh

    scp -p id_rsa authorized_keys 192.168.1.152:/root/.ssh 拷贝到其他服务器


 四. 安装MHA软件包

  下载并上传MHA安装包

    yum install mha4mysql-* -y


 五. MHA配置文件:

    global配置,为各application 提供默认配置;

    application配置:    

      server:

     # mkdir -p /etc/masterha;新建目录

     # vim /etc/masterha/app1.cnf; app集群1配置文件

    

 

[server default]

user=mhauser

password=mhapass

manager_workdir=/data/masterha/app1

manager_log=/data/masterha/app1/manager.log

remote_workdir=/data/masterha/app1

ssh_user=root

repl_user=repluser

repl_password=replpass

ping_interval=1

    

[server1]

hostname=192.168.1.152

candidate_master=1

    

[server2]

hostname=192.168.1.153

candidate_master=1

    

[server3]

hostname=192.168.1.154

   


    # masterha_check_ssh --conf=/etc/masterha/app1.cnf 检测服务器SSH互         

      [info] All SSH connection tests passed successfully. 正常

    # masterha_check_repl --conf=/etc/masterha/app1.cnf 

     MySQL Replication Health is OK! 主从复制正常

     # masterha_manager --conf=/etc/masterha/app1.cnf 启动管理节点,默认是前台显示

    # masterha_check_status --conf=/etc/masterha/app1.cnf 

    app1 (pid:2953) is running(0:PING_OK), master:192.168.1.152


    


注意事项:

    1、每个服务器关闭防火墙:

      systemctl stop firewalld

    2、repluser可能没有同步过去,需要重新同步一次。

     User repluser does not exist or does not have REPLICATION SLAVE privilege! Other slaves can not start replication from this host.

      3、如果主节点宕机,拷贝新主节点的二进制文件,按照时间点进行恢复:

    MYSQL按二进制方式备份:

    mysqdump -uroot --all-databases --lock-all-tables --master-data=2 >/backup/all.sql;

    MYSQL还原数据库按二进制时间节点;

    mysqlbinlog --start-position=245 /var/lib/mysql/mysql-bin.000001 >incre.sql;

    

 Galera Cluster

   1、安装galera分支的mysql版本:

   # vim /etc/yum.repos.d/mariadb.repo


[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/5.5.56/centos7-amd64/

enabled = 1

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

  # yum install MariaDB-Galera-server -y


    2、修改mysql配置文件

   # vim /etc/my.cnf.d/server.cnf


wsrep_provider=/usr/lib64/galera/libgalera_smm.so

wsrep_cluster_address="gcomm://192.168.1.151,192.168.1.152,192.168.1.153"

wsrep_cluster_name='mycluster'

wsrep_node_name='node1'

wsrep_node_address='192.168.1.151'

binlog_format=row

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

bind-address=0.0.0.0


   3、首次启动,需要初始化集群,在其中一个节点执行如下命令

    # /etc/rc.d/init.d/mysql start --wsrep-new-cluster

    Starting MySQL..... SUCCESS! 

    # 关闭SELinux(很重要)

    # setenforce 0

    # getenforce

    sed -i  's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 

    

[root@test152 mysql]# service mysql start

Starting MySQL.170828 16:36:00 mysqld_safe Logging to '/var/lib/mysql/test152.err'.

170828 16:36:00 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

...SST in progress, setting sleep higher....... SUCCESS!