科帮网-Java论坛、Java社区、JavaWeb毕业设计

登录/注册
您现在的位置:论坛 资料库 数据库开发 > linux下实现MySQL主从复制(Master-Slave)
总共48085条微博

动态微博

查看: 2004|回复: 1

linux下实现MySQL主从复制(Master-Slave)

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2016-06-19 21:59:10 |只看该作者 |倒序浏览

           网站发展到一定程度应用服务器和数据库服务器分离,然后单台服务器满足不了生产需要就要做集群处理。特别是现在数据极其重要以及重视用户体验的年代,无论是在安全性,高可用性以及高并发等各个方面,我们都要做到万无一失。一直没时间整理,今天抽空整理了一下mysql主从复制从而实现读写分离,提升服务性能。
            一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
    MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard。
    MySQL复制有那些好处:

    第一是解决宕机带来的数据不一致,因为MySQL复制可以实时备份数据;
    第二点是减轻数据库服务器的压力,多台服务器的性能一般比单台要好。但是MySQL复制不适合大数据量,大数据量推荐使用集群。

    MySQL复制过程分成三步:

    master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;

    slave将master的binary log events拷贝到它的中继日志(relay log);

    slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步的且串行化的

    如图所示:




    项目架构:







    一、环境

             主机:
                       master操作系统:centos 6.5
                       IP:192.168.1.190 (内网IP,实际情况为外网IP)
                       MySQL版本:5.1.73
             从机:         
                       slave操作系统:centos 6.5
                       IP:192.168.1.180 (内网IP,实际情况为外网IP)
                       MySQL版本:5.1.73

    二、配置

    配置主服务器(master)

    1、编辑数据库配置文件my.cnf,一般在/etc/目录下。

    #vi /etc/my.cnf
    在[mysqld]的下面加入下面代码:

    1. log-bin=mysql-bin
    2. server-id=190
    3. innodb_flush_log_at_trx_commit=1
    4. sync_binlog=1
    5. binlog-do-db=itstyle
    6. binlog_ignore_db=mysql

    复制代码

    server-id=190中的190可以任定义,只要是唯一的就行。
    binlog-do-db=
    itstyle是表示只备份itstyle。
    binlog_ignore_db=mysql表示忽略备份mysql。
    不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。


    2、然后重启MySQL:

    #service mysqld restart

    3、登录MySQL服务器。

    #mysql -uroot -p


    在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。在下面的命,192.168.1.180是从服务器的IP,123456 是用户密码,这里可以自行修改。

    mysql>CREATE USER 'mysqlcopy'@ '192.168.1.180' IDENTIFIED BY '123456';
    mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'192.168.1.180' IDENTIFIED BY '123456';

    你可以查看用户是否创建成功。
    mysql>use mysql
    mysql>select * from user;
    如果存在mysqlcopy用户,则说明成功。

    配置从服务器(slave)

    1、编辑配置文件my.cnf,在[mysqld]下面加入:
    server-id=180
    2可以自己定义,只要保证唯一的就行。

    2、保存文件并重启mysqld。
    #service mysqld restart

    3、登录mysql服务器,执行以下命令。
    mysql>CHANGE MASTER TO
    MASTER_HOST='
    192.168.1.190',
    MASTER_USER='
    mysqlcopy',
    MASTER_PASSWORD='123456',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=98,
    MASTER_CONNECT_RETRY=10;
    MASTER_HOST:主服务器的IP。
    MASTER_USER:配置主服务器时建立的用户名
    MASTER_PASSWORD:用户密码
    MASTER_PORT:主服务器mysql端口,如果未曾修改,默认即可。

    注意  
    MASTER_LOG_FILE 文件名称一致,不然导致 Slave_IO_Running: NO

    4、启动slave进程。

    mysql>START SLAVE;
    mysql>show slave status\G;
    如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功。

    显示如下:
    *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: 192.168.1.222
                    Master_User: repl
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: log.000003
            Read_Master_Log_Pos: 98
                Relay_Log_File: mysqld-relay-bin.000002
                  Relay_Log_Pos: 229
          Relay_Master_Log_File: log.000003
              Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
                Replicate_Do_DB:
            Replicate_Ignore_DB:
             Replicate_Do_Table:
         Replicate_Ignore_Table:
        Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
                     Last_Errno: 0
                     Last_Error:
                   Skip_Counter: 0
            Exec_Master_Log_Pos: 98
                Relay_Log_Space: 229
                Until_Condition: None
                 Until_Log_File:
                  Until_Log_Pos: 0
             Master_SSL_Allowed: No
             Master_SSL_CA_File:
             Master_SSL_CA_Path:
                Master_SSL_Cert:
              Master_SSL_Cipher:
                 Master_SSL_Key:
          Seconds_Behind_Master: 0
    1 row in set (0.00 sec)
    显示红色那两行,说明配置成功。



    5、查看mysql的日志,一般在/var/log/目录下的mysqld.log,如果启动成功,你应该会看到类似下面的日志。
    [root@localhost ~]# vi /etc/my.cnf

    091104 8:42:02 [Note] Slave I/O thread: connected to master ‘root@X.X.X.X:3306?, replication started in log ‘mysql-bin.000001? at position 98
    现在主服务器和从服务器已经配置好了。另外你可能需要设置主服务器的数据库二进制日志的过期时间,可以在配置文件中使用参数expire_logs_days来设定。

    =======================================

    可能出现问题
    一、 无法连接主服务器

    1.查看配置文件:

    skip-networking #注释掉 因为它是屏蔽掉一切TCP/IP连接

    bind-address = 127.0.0.1 #它和上一个选项是异曲同工,要想远程连接,也得注释掉

    2.如果以上工作都做过还是出现:


    ERROR 2003 (HY000): Can't connect to MySQL server on '*.*.*.*' (113),那就得考虑防火墙的问题了,关
    掉防火墙/etc/rc.d/init.d/iptables stop
    或者 vi /etc/sysconfig/iptables 加入
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT


    然后 service iptables restart 重启防火墙。


    二、Slave_IO_Running: No

    其实就是无法连接主服务器导致的,当然还有其他问题。









    科帮网-Java论坛、Java社区、JavaWeb毕业设计 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网-Java论坛、Java社区、JavaWeb毕业设计享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网-Java论坛、Java社区、JavaWeb毕业设计的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网-Java论坛、Java社区、JavaWeb毕业设计管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    沙发
    发表于 2016-06-21 13:02:43 |只看该作者
    其他复制方式

    主主复制

    master-slave只能进行单向操作,像网络中的半双工。master-master可以实现服务器之间互相同步,且主主复制可以避免出现单点故障后整个系统宕机。主主复制最大的问题就是数据插入或更新冲突。配置方法同主从复制,反过来让slave同步master。注意master_log_file和master_log_pos参数要与master上对应。具体可以参考这里

    单一master和多slave

    由一个master和多个slave组成的复制系统比较简单。slave之间并不互相通信,只能与master通信。如果写操作较少,读操作很多,可以采用。可以将读操作分布到其他slave,从而减轻master的压力。但slave增加到一定数量时,slave对master的负载以及网络带宽都会成为问题。

    主从多级复制

    读操作很多可以采用单一maste和多slave,但增大到一定slave后连到master的slaveIO线程太多会造成master压力增大,从而造成数据复制延时。多级复制就是为了解决这个问题。如果想实现主-从(主)-从多级复制,需要设置log-slave-updates参数。同时二进制日志也必须启用。




    当然,增加复制的级联层次,同一个变更传到最底层的Slave所需要经过的MySQL也会更多,同样可能造成延时较长的风险。如果条件允许,倾向于通过拆分成多个Replication集群来解决。

    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表