700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > mysql主从复制 互为主从与读写分离

mysql主从复制 互为主从与读写分离

时间:2024-03-29 21:51:35

相关推荐

mysql主从复制 互为主从与读写分离

目录

一、主从复制以及主从复制的作用

二、mysql主从复制的原理:

三、Mysql主从复制实战

3.1 环境说明

3.2 复制的基本原则

3.3实现MySQL主从复制需要进行的配置

3.4 在主机(master)上建立账户并授权slave

3.5 在(slave)告知从服务器二进制文件名与位置(从服务器操作)

四、Mysql互为主从,主主架构

4.1 互为主从的配置

4.1.1 修改一台服务器配置文件

4.1.2 修改另一台服务器配置文件

4.1.3创建复制帐号

4.1.4启动从服务器复制线程

4.1.5查看从服务器状态

4.2.验证(创建表,设置ID为自增长,两边插入数据看数据增长)

一、主从复制以及主从复制的作用

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

二、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 slave thread(sql从线程)处理该过程的最后一步,sql线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小

三、Mysql主从复制实战

3.1 环境说明

两个CentOS7的虚拟机Master_IP:192.168.150.16slave_IP:192.168.150.17

注意:MySQL版本号最好一致,为了方便学习测试,建议大家直接克隆虚拟机然后修改下网卡配置文件,重新设置一个IP,并关闭防火墙。

mysql 5.6以后的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy data文件夹后server_uuid是相同的

查看mysql uuid:

show variables like ‘%server_uuid%’;

解决办法:找到/var/lib/mysql文件夹下的f文件,修改里面的uuid值,保证各个db的uuid不一样。

重启mysql即可。

3.2 复制的基本原则

每个Slave只有一个Master每个Slave只能有一个唯一的服务ID每个Master可以有多个Slave

3.3实现MySQL主从复制需要进行的配置

主服务器:

开启二进制日志 binlog配置唯一的server-id获得master二进制文件名及位置创建一个用于slave和master通信的用户账号

从服务器:

配置唯一的server-id使用master分配的用户账号读取master二进制日志启动slave服务

具体操作如下:

找到的配置文件f,我的在/etc/f,在[mysqld]部分插入如下:

修改master配置:

[mysqld]

#开启二进制日志

log-bin=mysql-bin

#设置server-id,建议使用ip最后2位

server-id=16

修改slave配置:

[mysqld]

#开启中继日志

relay-log=mysql-relay

#设置server-id,建议使用ip最后2位

server-id=17

重启mysql服务

3.4 在主机(master)上建立账户并授权slave

创建用于zcf并给予权限:

create user 'zcf'@'%' identified with mysql_native_password by 'Zcf@04';

GRANT REPLICATION SLAVE ON *.* TO 'zcf'@‘%‘;

flush privileges;

查询master状态:

mysql> show master status \G;*************************** 1. row ***************************File: mysql-bin.000004Position: 154Binlog_Do_DB:Binlog_Ignore_DB:Executed_Gtid_Set:1 row in set (0.00 sec)ERROR:No query specified

3.5 在(slave)告知从服务器二进制文件名与位置(从服务器操作)

这里要根据上面主服务器的状态来填写,不要直接用下面的SQL,需要根据实际值修改。

changemaster to

master_host = ‘192.168.42.16’, #主库的IP地址

master_user = ‘zcf’, #在主库上创建的复制账号

master_password = 'Zcf@04', #在主库上创建的复制账号密码

master_log_file = ‘mysql-bin.000004’, #开始复制的二进制文件名(从主库查询结果中获取)

master_log_pos = 154; #开始复制的二进制文件位置(从主库查询结果中获取)

查询slave状态:

mysql> show slave status \G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.150.16Master_User: zcfMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 154Relay_Log_File: mysql-relay.000014Relay_Log_Pos: 367Relay_Master_Log_File: mysql-bin.000004Slave_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: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 154Relay_Log_Space: 736Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 16Master_UUID: cbb62356-38c0-11ed-922a-000c2911fea4Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:1 row in set (0.00 sec)ERROR:No query specified

查看从服务器状态

start slave; ##开启服务

注意:上述出现两个YES才正确连接

四、Mysql互为主从,主主架构

在两台服务器上既执行master的操作有执行slave的操作(注意:两台服务器都必须是可以写的)

4.1 互为主从的配置

在主从复制的基础上进行修改。

4.1.1 修改一台服务器配置文件

vim /etc/f

[mysqld]server-id = 16log_bin = mysql_binrelay_log = relay-logskip-name-resolve = onlog_slave_updates = 1auto_increment_increment=2#表示自增长字段从那个数开始auto_increment_offset=1#表示自增长字段从那个数开始

重启mysql服务

4.1.2 修改另一台服务器配置文件

vim /etc/f

[mysqld]server-id = 15relay_log = relay-loglog_bin = mysql-logskip-name-resolve = onlog_slave_updates = 1auto_increment_increment=2 #表示自增长字段每次递增的量auto_increment_offset=2#表示自增长字段从那个数开始

重启mysql服务

4.1.3创建复制帐号

两台服务器都要创建

create user 'zcf'@'%' identified with mysql_native_password by 'Zcf@04';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'zcf'@'%'

4.1.4启动从服务器复制线程

这里要根据上面主服务器的状态来填写,不要直接用下面的SQL,需要根据实际值修改。

changemaster to

master_host = '192.168.42.15', #主库的IP地址

master_user = 'zcf', #在主库上创建的复制账号

master_password = 'Zcf@04', #在主库上创建的复制账号密码

master_log_file = 'mysql-bin.000001', #开始复制的二进制文件名(从主库查询结果中获取)

master_log_pos = 3306; #开始复制的二进制文件位置(从主库查询结果中获取)

另一台已经在主从复制配置好了

4.1.5查看从服务器状态

mysql> show slave status \G;*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.150.15Master_User: zcfMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-log.000001Read_Master_Log_Pos: 2090Relay_Log_File: relay-log.000002Relay_Log_Pos: 661Relay_Master_Log_File: mysql-log.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 2090Relay_Log_Space: 865Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 15Master_UUID: c6e942b2-3ca0-11ed-a287-000c29a7d949Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:Master_public_key_path:Get_master_public_key: 0Network_Namespace:1 row in set, 1 warning (0.01 sec)

注意:上述出现两个YES才正确连接

4.2.验证(创建表,设置ID为自增长,两边插入数据看数据增长)

在一台数据库服务器上创建

create table userinfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20) NOT NULL);

insert into userinfo (name) values('ni'),('wo'),('ta');

然后查看表,因为是自增长id,从1开始,步长为2,所以添加的数据id为1,3,5。

然后在另一台数据库服务器插入数据,因为是自增长id,从2开始,步长为2,所以新 添加的数据id为6,8,10。

insert into userinfo (name) values('n'),('w'),('t');

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