MySQL主从复制,是一个MySQL的群集,可以很好的解决的单点故障,并且可以进行读写分离来减轻数据库的压力。很多情况下主服务器仅作为写入数据服务器,而构建多个从节点来进行数据读取。

构建主从复制的几个事项:

    尽量保持主从数据库版本一致。

    如果不一致,从数据库版本要高于主库的数据库版本。

创建数据存放目录和binlog存放目录,分开存放,建议是安装到不同的硬盘上,我这里就是安装在不同的目录上了。

# mkdir /mydata# mkdir /mylog

将源码包复制到另外一台主机。

# scpmariadb-5.5.36-linux-x86_64.tar.gz 192.168.122.136:/rootroot@192.168.122.136'spassword: mariadb-5.5.36-linux-x86_64.tar.gz                            100%  212MB 11.2MB/s   00:19

本地主机解压,创建mysql账户和修改数据目录,日志目录属主属组。

# tar xfmariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/# useradd -r -s/sbin/nologin mysql# chownmysql:mysql /my*# ls -ld /my*drwxr-xr-x 2 mysqlmysql 4096 Sep 20 14:35 /mydatadrwxr-xr-x 2 mysqlmysql 4096 Sep 20 14:36 /mylog

链接到mariadb到mysql,创建配置文件存放路径,修改属主,属组。

# ln -smariadb-5.5.36-linux-x86_64/ mysql# mkdir /etc/mysql# chown -Rmysql:mysql mysql/

复制配置文件及Sys脚本到相对应的目录。

# cpsupport-files/my-large.cnf /etc/mysql/my.cnf# cpsupport-files/mysql.server /etc/init.d/mysqld

修改数据目录存放位置和binlog日志存放位置。

# vim/etc/mysql/my.cnfdatedir =/mydata/datalog-bin=/mylog/master-bin

将mysqld添加到系统服务,并初始化。

# chmod +x/etc/init.d/mysqld # chkconfig --addmysqld#./scripts/mysql_install_db --user=mysql --datadir=/mydata/data

启动mysql,检查端口。

# service mysqld startStarting MySQL..SUCCESS!# ss -tnlLISTEN     0     50                               *:3306                             *:

检查数据目录和日志目录。

# ls /my*/mydata:data /mylog:master-bin.000001  master-bin.000002  master-bin.000003  master-bin.000004  master-bin.index

另外一台主机相同配置,可以不指定二进制日志位置,但是需要创建relaylog日志目录,修改serverID。

# mkdir /relaylog # vim/etc/mysql/my.cnfdatadir =/mydata/data#log-bin=mysql-bin#binlog_format=mixedserver-id       = 10relay-log       = /relaylog/relay-log # service mysqldstartStarting MySQL...SUCCESS! # ss -tnlLISTEN     0     50                               *:3306                            *:*

 

创建授权账户。

# mysqlMariaDB[(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TOubu@'192.168.122.136' IDENTIFIED BY '123456';Query OK, 0 rowsaffected (0.00 sec) MariaDB[(none)]> FLUSH PRIVILEGES;Query OK, 0 rowsaffected (0.00 sec)

授权后登录从服务器测试连接,如果连接不上需要马上检查问题,而不是继续做下去。不然也会失败。

# mysql -u ubu -h192.168.122.134 -p Enter password:  MariaDB[(none)]>

回到主服务器,查看日志位置。

MariaDB[(none)]> SHOW MASTER STATUS;+-------------------+----------+--------------+------------------+| File              | Position | Binlog_Do_DB |Binlog_Ignore_DB |+-------------------+----------+--------------+------------------+|master-bin.000004 |      492 |              |                  |+-------------------+----------+--------------+------------------+1 row in set (0.01sec)因为是开始重启失败,重新初始化了一次,导致日志已经走到000004的位置。

切换到从服务器,开始复制。

MariaDB[(none)]> CHANGE MASTER TOMASTER_HOST='192.168.122.134',MASTER_USER='ubu',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master-bin.000004',MASTER_LOG_POS=492;Query OK, 0 rowsaffected (0.15 sec) MariaDB[(none)]> START SLAVE; MariaDB[(none)]> SHOW SLAVE STATUS\G***************************1. row ***************************               Slave_IO_State: Waiting formaster to send event                  Master_Host: 192.168.122.134                  Master_User: ubu                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File:master-bin.000004          Read_Master_Log_Pos: 492               Relay_Log_File: relay-log.000002                Relay_Log_Pos: 530        Relay_Master_Log_File:master-bin.000004             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: 492              Relay_Log_Space: 818              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: 0Master_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 row in set (0.00sec)  Slave_IO_Running: Yes Slave_SQL_Running: Yes

现在已经开始同步,可以看到relay-log已经到了000002了,开始连接的时候是因为少写了一个字符,导致同步的时候IO_THREAD状态为no。重新连接后就正常了。

在主库创建一个数据库,看从库能否同步。

MariaDB [(none)]> CREATE DATABASEtestdb;Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || test               || testdb             |+--------------------+5 rows in set (0.00 sec)

从库查看

MariaDB [(none)]> SHOW DATABASES;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || test               || testdb             |+--------------------+5 rows in set (0.01 sec)

主从复制已经完成。如果是一个已经写入过数据的数据库同步,需要把主库的数据导出导入到从库,      然后才能做主从复制。

限制从服务器写如数据,变为只读服务器,进行数据读写分离。

更改slave的全局服务器变量read-only为yes。

MariaDB [(none)]> SET GLOBALread_only=1;

创建一个普通账户,测试能否创建数据。

主库创建,从库会直接同步过来。

MariaDB [(none)]> GRANTCREATE,UPDATE,INSERT ON testdb.* TO testuser@'192.168.%.%' IDENTIFIED BY'testuser';Query OK, 0 rows affected (0.00 sec)

切换到从库,查看账户是否同步,看看是否修改从库为read-only后数据是否正常同步。

MariaDB [mysql]> SELECT User,Host FROMuser;+----------+---------------+| User    | Host          |+----------+---------------+| root    | 127.0.0.1     || testuser | 192.168.%.%   || root    | ::1           ||         | localhost     || root    | localhost     ||         | www.zhang.com || root    | www.zhang.com |+----------+---------------+7 rows in set (0.00 sec)

使用testuser登录从数据库,检查能否创建数据。

# mysql -u testuser -h 192.168.122.136 -p MariaDB [(none)]> CREATE DATABASEtestuser;ERROR 1290 (HY000): The MariaDB server isrunning with the --read-only option so it cannot execute this statement

这里只是限制了普通用户创建数据库,但是以root用户登录的时候,还是可以正常创建,插入数据          的。

MySQL双主模式:

三台服务器,两个主节点。两个从节点,一台服务器充当master和slave服务器,当主服务器故障后,可以切换到另外一台服务器,保证数据正常写入同步。

删除原先的数据,重新初始化,但是A节点需要创建或者指定relay-log存放位置,而B节点需要指定binlog存放位置。这里就称呼为AB节点了。

下面贴出来需要修改的部分,为A节点配置。

# vim/etc/mysql/my.cnfdatadir =/mydata/datalog-bin=/mylog/master-binrelay-log=/myrelailogs/master-relay-logserver-id       = 1auto-increment-offset   = 1auto-increment-increment= 2

B节点配置文件修改。

# vim/etc/mysql/my.cnfdatadir =/mydata/dataserver-id       = 10relay-log       = /relaylog/relay-loglog-bin         =/mybinlog/master2-binauto-increment-offset   = 2auto-increment-increment= 2

AB节点相同操作。

MariaDB[(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TOubu@'192.168.%.%' IDENTIFIED BY '123456';

A节点连接B节点开始复制。

MariaDB[(none)]> CHANGE MASTER TOMASTER_HOST='192.168.122.136',MASTER_USER='ubu',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master2-bin.000003',MASTER_LOG_POS=418;Query OK, 0 rowsaffected (0.01 sec) MariaDB[(none)]> START SLAVE;Query OK, 0 rowsaffected (0.00 sec) MariaDB[(none)]> SHOW SLAVE STATUS\G***************************1. row ***************************               Slave_IO_State: Waiting formaster to send event                  Master_Host: 192.168.122.136                  Master_User: ubu                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File:master2-bin.000003          Read_Master_Log_Pos: 418               Relay_Log_File: relay-log.000002                Relay_Log_Pos: 531        Relay_Master_Log_File:master2-bin.000003             Slave_IO_Running: Yes            Slave_SQL_Running: Yes

B节点连接A节点开始复制。

MariaDB[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.122.134',MASTER_USER='ubu',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master1-bin.000003',MASTER_LOG_POS=418;Query OK, 0 rowsaffected (0.13 sec) MariaDB[(none)]> START SLAVE;Query OK, 0 rowsaffected (0.00 sec) MariaDB[(none)]> SHOW SLAVE STATUS\G***************************1. row ***************************               Slave_IO_State: Waiting formaster to send event                  Master_Host: 192.168.122.134                  Master_User: ubu                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File:master1-bin.000003          Read_Master_Log_Pos: 418               Relay_Log_File: relay-log.000002                Relay_Log_Pos: 531        Relay_Master_Log_File:master1-bin.000003             Slave_IO_Running: Yes            Slave_SQL_Running: Yes

双方都已经开始连接复制。

分别在AB节点数据库创建数据,看看是否同步。

现在A节点数据库库创建数据库,B节点数据库库查看。

MariaDB[(none)]> CREATE DATABASE testdb;Query OK, 1 rowaffected (0.01 sec) B节点数据库库查看MariaDB[(none)]> SHOW DATABASES;+--------------------+| Database           |+--------------------+|information_schema || mysql              ||performance_schema || test               || testdb             |+--------------------+5 rows in set(0.00 sec)

B节点删除testdb,A节点查看。

MariaDB[(none)]>  DROP DATABASE testdb;Query OK, 0 rowsaffected (0.06 sec) A节点查看MariaDB[(none)]> CREATE DATABASE testdb;Query OK, 1 rowaffected (0.01 sec) MariaDB[(none)]> SHOW DATABASES;+--------------------+| Database           |+--------------------+|information_schema || mysql              ||performance_schema || test               |+--------------------+4 rows in set(0.01 sec)

 

双主模式完成了。

而如果想要做M-M/S-S模型架构,只需要在B节点授权,C节点连接复制即可。并且C节点为只读数据库

总结:

导致slave_IO_Running 为connecting 的原因主要有以下 3 个方面:

1、网络不通

2、密码不对
3、pos不对

出现这种问题的原一般先检查写入是字母是否正确,其次去检查网络原因。