网站发展到一定程度应用服务器和数据库服务器分离,然后单台服务器满足不了生产需要就要做集群处理。特别是现在数据极其重要以及重视用户体验的年代,无论是在安全性,高可用性以及高并发等各个方面,我们都要做到万无一失。一直没时间整理,今天抽空整理了一下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复制是异步的且串行化的

如图所示:

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


项目架构:

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







一、环境

         主机:
                   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,如果启动成功,你应该会看到类似下面的日志。
[[email protected] ~]# vi /etc/my.cnf

091104 8:42:02 [Note] Slave I/O thread: connected to master ‘[email protected]: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

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

相关文章: