CentOS下构建MySQL数据库主从复制

  在实际的生产环境中,如果对数据库的的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载功能这样的方法来进行部署与实施的。

本文章先讲主从复制,只有先做到主从复制才能再去做读写分离,首选大家先要对MySQL支持的复制类型了解,MySQL数据库支持如下复制类型:

① 基于语法的复制.在主服务器上执行的SQL语句,在从服务器上执行同样的语句.MySQL默认采用基于语句的复制,效率比较高.

②基于行的复制.把改变的内存复制过去,而不是把命令在从服务器上执行一遍.

③混合类型的复制.默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制.

CentOS下构建MySQL数据库主从复制-Linux-me

MySQL主从复制的工作过程

①在每个事物更新数据完全之前,Master在二进制日志记录这些改变.写入二进制日志完成后,Master通知存储引擎提交事务.

②Slave将Master的Binary log 复制到其中继日志.首先,Slave开始一个工作线程——I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process.binlog dump process从Master的二进制日志中读取事件,如果已经跟上了Master,它会睡眠并等待Master产生新的事件.I/O线程将这些事件写入中继日志.

③SQL从线程处理该过程的最后一步.SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致.只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小.

 

环境准备:

主机 操作系统 IP地址 主要软件
Master CentOS 6.5 x86_64 192.168.1.10

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Slave CentOS 6.5 x86_64 192.168.1.20

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

为保证实验无误,首先将Master和Slave两台服务器时间同步、关闭防火墙、关闭Selinux等

Master:安装ntp,同步时间  
[root@localhost ~]# yum -y install ntp  
[root@localhost ~]# ntpdate time.nist.gov  
Slave:安装ntp,同步时间  
[root@localhost ~]# yum -y install ntp  
[root@localhost ~]# ntpdate time.nist.gov  
在两台服务器上关闭iptables或者指定端口进行开放  
[root@localhost ~]# service iptables stop  
[root@localhost ~]# chkconfig iptables off

其次就是安装MySQL,怎么安装前面有文章,请跳转安装步骤→点击跳转到安装MySQL数据库

安装完成MySQL后启动MySQL 
[root@localhost ~]# service mysqld start 
[root@localhost ~]# chkconfig mysqld on 
[root@localhost ~]# mysqladmin -u root password 'pwd123' 
此时MySQL的root密码为pws123
①在/etc/my.cnf中修改或增加下面内容 
server-id       = 11   //修改 
log-bin=master-bin      //修改 
log-slave-updates=true //增加 
②重启MySQL服务 
[root@localhost ~]# service mysqld restart 
③登陆MySQL程序,给从服务器授权 
[root@localhost ~]# mysql -u root -p 
Enter password:  
mysql> GRANT REPLICATION SLAVE ON *.* TO 'MYSLAVE'@'%' IDENTIFIED BY '123456'; 
mysql> FLUSH PRIVILEGES; 
mysql> show master status; 
 +-------------------+----------+--------------+------------------+
 | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
 +-------------------+----------+--------------+------------------+
 | master-bin.000003 |      107 |              |                  |
 +-------------------+----------+--------------+------------------+ 
 
1 row in set (0.00 sec) 
其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要Slave应从该点在Master上进行新的更新.

配置Slave从服务器

①在/etc/my.cnf中修改或增加下面内容 
server-id       = 22   //修改 
relay-log=relay-log-bin  //增加 
relay-log-index=slave-relay-bin.index   //增加 
PS:注意Server-id不能与主服务器相同. 
②重启MySQL服务 
[root@localhost ~]# service mysqld restart 
③登陆MySQL,配置同步 
[root@localhost ~]# mysql -u root -p 
Enter password:  
mysql> change master to master_host='192.168.1.10',master_user='MYSLAVE',master_password='123456',master_log_file='master-bin.000003',master_log_pos=107; 
Query OK, 0 rows affected (0.11 sec) 
④启动同步 
mysql> start slave; 
Query OK, 0 rows affected (0.00 sec) 
⑤查看Slave状态,确保Slave_IO_Running和Slave_SQL_Running的值均为YES 
mysql> show slave status\G 
*************************** 1. row *************************** 
               Slave_IO_State: Waiting for master to send event 
                  Master_Host: 192.168.1.10 
                  Master_User: MYSLAVE 
                  Master_Port: 3306 
                Connect_Retry: 60 
              Master_Log_File: master-bin.000003 
          Read_Master_Log_Pos: 262 
               Relay_Log_File: localhost-relay-bin.000002 
                Relay_Log_Pos: 409 
        Relay_Master_Log_File: master-bin.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: 262 
              Relay_Log_Space: 569 
              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 
Master_SSL_Verify_Server_Cert: No 
                Last_IO_Errno: 0 
                Last_IO_Error:  
               Last_SQL_Errno: 0 
               Last_SQL_Error:  
  Replicate_Ignore_Server_Ids:  
             Master_Server_Id: 11 
1 row in set (0.00 sec) 

验证主从复制效果

①在主、从服务器上登陆MySQL 
mysql> show databases; 
+--------------------+ 
| Database           | 
+--------------------+ 
| information_schema | 
| mysql              | 
| performance_schema | 
| test               | 
+--------------------+ 
4 rows in set (0.00 sec) 
PS:两台数据库执行结果应该相同才是对的 
②在主服务器上新建数据库linuxme_db. 
mysql> create database linuxme_db; 
Query OK, 1 row affected (0.00 sec) 
③在主从上面分别查看数据库,显示数据库相同,则为主从复制成功。 
mysql> show databases; 
+--------------------+ 
| Database           | 
+--------------------+ 
| information_schema | 
| linuxme_db         | 
| mysql              | 
| performance_schema | 
| test               | 
+--------------------+ 
5 rows in set (0.01 sec) 

好了,MySQL的主从复制大概就是这样的,如果大家对MySQL主从复制还有问题可以在文章下方留言或者直接联系我,我都会尽力帮大家解决问题;然后最后就是希望大家多多支持本博客,我也会不定式的给大家更新技术性的文章.