1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > mysql双主和主从的区别_MySQL群集 主从复制及双主模式

mysql双主和主从的区别_MySQL群集 主从复制及双主模式

时间:2021-05-19 12:09:15

相关推荐

mysql双主和主从的区别_MySQL群集 主从复制及双主模式

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

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

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

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

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

#mkdir/mylog

将源码包复制到另外一台主机。#scpmariadb-5.5.36-linux-x86_64.tar.gz192.168.122.136:/root

root@192.168.122.136'spassword:

mariadb-5.5.36-linux-x86_64.tar.gz100%212MB11.2MB/s00:19

本地主机解压,创建mysql账户和修改数据目录,日志目录属主属组。#tarxfmariadb-5.5.36-linux-x86_64.tar.gz-C/usr/local/

#useradd-r-s/sbin/nologinmysql

#chownmysql:mysql/my*

#ls-ld/my*

drwxr-xr-x2mysqlmysql4096Sep:35/mydata

drwxr-xr-x2mysqlmysql4096Sep:36/mylog

链接到mariadb到mysql,创建配置文件存放路径,修改属主,属组。#ln-smariadb-5.5.36-linux-x86_64/mysql

#mkdir/etc/mysql

#chown-Rmysql:mysqlmysql/

复制配置文件及Sys脚本到相对应的目录。#cpsupport-files/my-f/etc/mysql/f

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

修改数据目录存放位置和binlog日志存放位置。#vim/etc/mysql/f

datedir=/mydata/data

log-bin=/mylog/master-bin

将mysqld添加到系统服务,并初始化。#chmod+x/etc/init.d/mysqld

#chkconfig--addmysqld

#./scripts/mysql_install_db--user=mysql--datadir=/mydata/data

启动mysql,检查端口。#servicemysqldstart

StartingMySQL..SUCCESS!

#ss-tnl

LISTEN050*:3306*:

检查数据目录和日志目录。#ls/my*

/mydata:

data

/mylog:

master-bin.000001master-bin.000002master-bin.000003master-bin.000004master-bin.index

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

#vim/etc/mysql/f

datadir=/mydata/data

#log-bin=mysql-bin

#binlog_format=mixed

server-id=10

relay-log=/relaylog/relay-log

#servicemysqldstart

StartingMySQL...SUCCESS!

#ss-tnl

LISTEN050*:3306*:*

创建授权账户。#mysql

MariaDB[(none)]>GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*TOubu@'192.168.122.136'IDENTIFIEDBY'123456';

QueryOK,0rowsaffected(0.00sec)

MariaDB[(none)]>FLUSHPRIVILEGES;

QueryOK,0rowsaffected(0.00sec)

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

Enterpassword:

MariaDB[(none)]>

回到主服务器,查看日志位置。MariaDB[(none)]>SHOWMASTERSTATUS;

+-------------------+----------+--------------+------------------+

|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|

+-------------------+----------+--------------+------------------+

|master-bin.000004|492|||

+-------------------+----------+--------------+------------------+

1rowinset(0.01sec)

因为是开始重启失败,重新初始化了一次,导致日志已经走到000004的位置。

切换到从服务器,开始复制。MariaDB[(none)]>CHANGEMASTERTOMASTER_HOST='192.168.122.134',MASTER_USER='ubu',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master-bin.000004',MASTER_LOG_POS=492;

QueryOK,0rowsaffected(0.15sec)

MariaDB[(none)]>STARTSLAVE;

MariaDB[(none)]>SHOWSLAVESTATUS\G

***************************1.row***************************

Slave_IO_State:Waitingformastertosendevent

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

1rowinset(0.00sec)

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

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

在主库创建一个数据库,看从库能否同步。MariaDB[(none)]>CREATEDATABASEtestdb;

QueryOK,1rowaffected(0.00sec)

MariaDB[(none)]>SHOWDATABASES;

+--------------------+

|Database|

+--------------------+

|information_schema|

|mysql|

|performance_schema|

|test|

|testdb|

+--------------------+

5rowsinset(0.00sec)

从库查看MariaDB[(none)]>SHOWDATABASES;

+--------------------+

|Database|

+--------------------+

|information_schema|

|mysql|

|performance_schema|

|test|

|testdb|

+--------------------+

5rowsinset(0.01sec)

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

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

更改slave的全局服务器变量read-only为yes。MariaDB[(none)]>SETGLOBALread_only=1;

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

主库创建,从库会直接同步过来。MariaDB[(none)]>GRANTCREATE,UPDATE,INSERTONtestdb.*TOtestuser@'192.168.%.%'IDENTIFIEDBY'testuser';

QueryOK,0rowsaffected(0.00sec)

切换到从库,查看账户是否同步,看看是否修改从库为read-only后数据是否正常同步。MariaDB[mysql]>SELECTUser,HostFROMuser;

+----------+---------------+

|User|Host|

+----------+---------------+

|root|127.0.0.1|

|testuser|192.168.%.%|

|root|::1|

||localhost|

|root|localhost|

|||

|root||

+----------+---------------+

7rowsinset(0.00sec)

使用testuser登录从数据库,检查能否创建数据。#mysql-utestuser-h192.168.122.136-p

MariaDB[(none)]>CREATEDATABASEtestuser;

ERROR1290(HY000):TheMariaDBserverisrunningwiththe--read-onlyoptionsoitcannotexecutethisstatement

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

MySQL双主模式:

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

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

下面贴出来需要修改的部分,为A节点配置。#vim/etc/mysql/f

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节点配置文件修改。#vim/etc/mysql/f

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节点相同操作。MariaDB[(none)]>GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*TOubu@'192.168.%.%'IDENTIFIEDBY'123456';

A节点连接B节点开始复制。MariaDB[(none)]>CHANGEMASTERTOMASTER_HOST='192.168.122.136',MASTER_USER='ubu',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master2-bin.000003',MASTER_LOG_POS=418;

QueryOK,0rowsaffected(0.01sec)

MariaDB[(none)]>STARTSLAVE;

QueryOK,0rowsaffected(0.00sec)

MariaDB[(none)]>SHOWSLAVESTATUS\G

***************************1.row***************************

Slave_IO_State:Waitingformastertosendevent

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)]>CHANGEMASTERTOMASTER_HOST='192.168.122.134',MASTER_USER='ubu',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master1-bin.000003',MASTER_LOG_POS=418;

QueryOK,0rowsaffected(0.13sec)

MariaDB[(none)]>STARTSLAVE;

QueryOK,0rowsaffected(0.00sec)

MariaDB[(none)]>SHOWSLAVESTATUS\G

***************************1.row***************************

Slave_IO_State:Waitingformastertosendevent

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)]>CREATEDATABASEtestdb;

QueryOK,1rowaffected(0.01sec)

B节点数据库库查看

MariaDB[(none)]>SHOWDATABASES;

+--------------------+

|Database|

+--------------------+

|information_schema|

|mysql|

|performance_schema|

|test|

|testdb|

+--------------------+

5rowsinset(0.00sec)

B节点删除testdb,A节点查看。MariaDB[(none)]>DROPDATABASEtestdb;

QueryOK,0rowsaffected(0.06sec)

A节点查看

MariaDB[(none)]>CREATEDATABASEtestdb;

QueryOK,1rowaffected(0.01sec)

MariaDB[(none)]>SHOWDATABASES;

+--------------------+

|Database|

+--------------------+

|information_schema|

|mysql|

|performance_schema|

|test|

+--------------------+

4rowsinset(0.01sec)

双主模式完成了。

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

总结:

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

1、网络不通

2、密码不对

3、pos不对

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。