MySQL主从复制,是一个MySQL的群集,可以很好的解决的单点故障,并且可以进行读写分离来减轻数据库的压力。很多情况下主服务器仅作为写入数据服务器,而构建多个从节点来进行数据读取。
构建主从复制的几个事项:
尽量保持主从数据库版本一致。
如果不一致,从数据库版本要高于主库的数据库版本。
创建数据存放目录和binlog存放目录,分开存放,建议是安装到不同的硬盘上,我这里就是安装在不同的目录上了。
将源码包复制到另外一台主机。
1
2
3
|
root@192.168.122.136'spassword:
mariadb-5.5.36-linux-x86_64. tar .gz 100% 212MB 11.2MB /s 00:19
|
本地主机解压,创建mysql账户和修改数据目录,日志目录属主属组。
1
2
3
4
5
6
|
drwxr-xr-x 2 mysqlmysql 4096 Sep 20 14:35 /mydata
drwxr-xr-x 2 mysqlmysql 4096 Sep 20 14:36 /mylog
|
链接到mariadb到mysql,创建配置文件存放路径,修改属主,属组。
复制配置文件及Sys脚本到相对应的目录。
修改数据目录存放位置和binlog日志存放位置。
1
2
3
|
datedir = /mydata/data
log-bin= /mylog/master-bin
|
将mysqld添加到系统服务,并初始化。
启动mysql,检查端口。
1
2
3
4
|
Starting MySQL..SUCCESS!
LISTEN 0 50 *:3306 *:
|
检查数据目录和日志目录。
1
2
3
4
5
6
|
/mydata :
data
/mylog :
master-bin.000001 master-bin.000002 master-bin.000003 master-bin.000004 master-bin.index
|
另外一台主机相同配置,可以不指定二进制日志位置,但是需要创建relaylog日志目录,修改serverID。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
datadir = /mydata/data
server- id = 10
relay-log = /relaylog/relay-log
Starting MySQL...SUCCESS!
LISTEN 0 50 *:3306 *:*
|
创建授权账户。
1
2
3
4
5
6
|
MariaDB[(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)
|
授权后登录从服务器测试连接,如果连接不上需要马上检查问题,而不是继续做下去。不然也会失败。
1
2
3
4
|
Enter password:
MariaDB[(none)]>
|
回到主服务器,查看日志位置。
1
2
3
4
5
6
7
8
|
MariaDB[(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
|master-bin.000004 | 492 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.01sec)
因为是开始重启失败,重新初始化了一次,导致日志已经走到000004的位置。
|
切换到从服务器,开始复制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
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: 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: 1
1 row in set (0.00sec)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
|
现在已经开始同步,可以看到relay-log已经到了000002了,开始连接的时候是因为少写了一个字符,导致同步的时候IO_THREAD状态为no。重新连接后就正常了。
在主库创建一个数据库,看从库能否同步。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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)
|
从库查看
1
2
3
4
5
6
7
8
9
10
11
|
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.01 sec)
|
主从复制已经完成。如果是一个已经写入过数据的数据库同步,需要把主库的数据导出导入到从库, 然后才能做主从复制。
限制从服务器写如数据,变为只读服务器,进行数据读写分离。
更改slave的全局服务器变量read-only为yes。
1
|
MariaDB [(none)]> SET GLOBALread_only=1;
|
创建一个普通账户,测试能否创建数据。
主库创建,从库会直接同步过来。
1
2
|
MariaDB [(none)]> GRANTCREATE,UPDATE,INSERT ON testdb.* TO testuser@ '192.168.%.%' IDENTIFIED BY 'testuser' ;
Query OK, 0 rows affected (0.00 sec)
|
切换到从库,查看账户是否同步,看看是否修改从库为read-only后数据是否正常同步。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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登录从数据库,检查能否创建数据。
1
2
3
4
|
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节点配置。
1
2
3
4
5
6
7
|
datadir = /mydata/data
log-bin= /mylog/master-bin
relay-log= /myrelailogs/master-relay-log
server- id = 1
auto-increment-offset = 1
auto-increment-increment= 2
|
B节点配置文件修改。
1
2
3
4
5
6
7
|
datadir = /mydata/data
server- id = 10
relay-log = /relaylog/relay-log
log-bin = /mybinlog/master2-bin
auto-increment-offset = 2
auto-increment-increment= 2
|
AB节点相同操作。
1
|
MariaDB[(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TOubu@ '192.168.%.%' IDENTIFIED BY '123456' ;
|
A节点连接B节点开始复制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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节点开始复制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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节点数据库库查看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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节点查看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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不对
出现这种问题的原一般先检查写入是字母是否正确,其次去检查网络原因。
(责任编辑:IT) |