mysql 主从复制模式主要为master负责接收用户的请求,DDL,DML,DCL等操作,slave主要负责同步master的二进制日志,以便备份数据。在一此数据库访问量比较大的场景,master-slave模式还可以结合mysql-proxy做读写分离,mysql-proxy负责将用户的写请求转发到master,将用户的读请求转发到slave,以分担数据库的压力。甚至更健壮的系统,一个master对应多个slave,做成高可用HA集群,当master宕机的时候,多个slave会协商出一个slave重新成为master,以达到服务的持续性。


        在mysql master-slave架构中,slave会启动两个主要的线程,一个是io thread,另一个是sql thread。大家都知道,mysql的replication主要是通过slave同步master中的二进制日志,然后将二进制日志先储存在slave中的中继日志中,然后再在本地通过读取中继日志执行sql操作。io thread主要完成的工作就是第一步,而sql thread主要工作是从中继日志中读取日志,然后进行本地操作。而对于master而言,也会启动一条dump线程,该线程主要的作用是响应slave的io thread请求,将二进制日志发送到slave。主要流程图如下:mysql master-slave集群搭建_主从复制


        下面来一步一步搭建mysql的master-slave架构。


        1、环境准备

            os:centos 6.4

            mysql服务器:5.5.28(2台)

       ip分配:master:192.168.1.101

                        slave:192.168.1.108

            mysql通过二进制安装包:mysql-5.5.28-linux2.6-x86_64.tar.gz


        2、mysql安装

            解压到/usr/local目录

            tar xf mysql-5.5.28-linux2.6-x86_64.tar.gz -C /usr/local

            添加软链

            ln -sv /usr/local/mysql-5.5.28-linux2.6-x86_64 /usr/local/mysql

        添加mysql用户,用户组

            groupadd -r mysql

            useradd -r -g mysql -s /sbin/nologin mysql

            添加mysql数据目录

            mkdir -pv /data/mysql

            chown -R mysql:mysql /data/mysql

            初始化mysql数据库

            cd /usr/local/mysql

            chown -R root.mysql ./*

            scripts/mysql_install_db --user=mysql --datadir=/data/mysql

        复制mysql配置文件,启动脚本

            cp support-files/my-large.cnf /etc/my.cnf

            cp support-files/mysql.server /etc/init.d/mysqld

            chkconfig --add msyqld


        3、master配置

            vim /etc/my.cnf

            在[mysqld]中添加:

            datadir=/data/mysql

            innodb_file_per_table=1 # 对innodb来说每表一个表空间文件

        log-bin=master-bin #开启二进制日志功能

            log-bin-index=master-bin.index #二进制日志文件的索引文件

            #server_id可暂时不用改,只要不和slave中的server_id一样即可

           保存退出。


        4、初始化master

            用mysql进入交互命令行界面

            授权relication slave复制权限

            mysql> grant relication slave on *.* to 'repluser'@'192.168.1.%' identified by 'replpass';

            mysql> flush privileges; #读取授权表


        5、安装slave

            按上述相同方式安装好slave。


        6、slave配置

            vim /etc/my.cnf

            在[mysqld]中添加:

            datadir=/data/mysql

            innodb_file_per_table=1 # 对innodb来说每表一个表空间文件

        relay-bin=relay-bin #开启中继日志功能

            relay-bin-index=relay-bin.index #中继日志文件的索引文件

            read_only=1 #设置slave为只读模式

            server_id=10#注意,slave中的server_id不能和master的server_id相同。

        保存退出。


        7、初始化slave

            用mysql进入交互命令行界面

            mysql> change master to

                       master_host='192.168.1.101',

                       master_user='repluser',

                       master_password='replpass',

                       master_log_file='master-bin.000002',

                       master_log_pos=107

            #其中master_log_file和master_log_pos是在master中通过show master status命令查看到的。

            #所以务必要先在master中查看对应的值后,再执行此命令

            #master_log_file:slave要同步的二进制文件

            #master_log_pos同步的起始位置


        8、启动slave

                mysql> start slave

                #此命令会同步启动io_thread和sql_thread,也可以独启动它们。

                #mysql> start slave io_thread

                #mysql> start slave sql_thread


        至此,mysql的master-slave模式基本搭建完成了。

        在slave中可查看slave的状态信息

        mysql> show slave status \G;

           mysql master-slave集群搭建_master-slave_02


            看到以上信息,恭喜你,master-slave已经搭建成功了。


        9、测试

        在master中创建一个数据库

        mysql> create database leedb;

        在slave中查看数据库

        mysql> show databases;

        可以看到刚才在master中的leedb自动同步到slave中了。以后在master中所有可能引起数据库变更

        的动作都会自动同步到slave中了。当然,mysql可以对数据库或对数据表进行过滤同步,可以有选

        择性地同步某个数据库或者某个数据库的某张表,这个留待后续再讨论。