mysql复制
系统性能的提升,高并发的实现,其中一个部分就是提高数据库性能。而数据库的读写分离,就是其中一个优化。在主库写入,在读库做查询,减少主库的请求压力,这对整个系统将会有大大性能提升。
但是,这里会出现一个问题,就是主从库在数据同步时候,会出现迟延问题,如何保证数据同步及时,保证数据一致性将是个难题。但是,在一般要求不是实时的系统,是没问题。
下面我们就来逐个探索这些问题的……
docker环境搭建mysql关系数据库一主多从架构
docker安装mysql。参考章节docker安装mysql
在三台服务器安装mysql服务器。
其中一台作为master,一台slave1,一台slave2,一主二从配置。
1.修改每台mysql服务配置:
- 主库master配置修改:
[mysqld]
port = 3910
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
default_authentication_plugin = mysql_native_password
log-bin = mysql-bin
server-id = 1
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
_注_: 主要就是在原来配置上,添加下面两行:
log-bin = mysql-bin
server-id = 1
_说明_:
server-id=1: 唯一服务器ID,非0整数,不能和其他服务器的server-id重复
log-bin=mysql-bin:开启二进制日志功能。使用binary logging,mysql-bin是log文件名的前缀
- 从库slave1,配置文件修改:
[mysqld]
port = 3911
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
default_authentication_plugin = mysql_native_password
log-bin = mysql-bin
server-id = 2
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
- 从库slave2,配置文件修改:
[mysqld]
port = 3912
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
default_authentication_plugin = mysql_native_password
log-bin = mysql-bin
server-id = 3
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
2.重新启动三个mysql服务:
docker restart mysql容器
3.用navicat工具连接数据库
保证三台mysql数据都能正确连接。
配置主从关系
为了方便直接在navicat客户端连接操作。
在master操作
1.新增用来复制数据的用户:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
用户名:slave 密码:123456
2.对用户slave授权:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
3.查看授权:
show grants for 'slave'@'%';
4.查看主库状态:
show master status;
如图,字段File,Position,后面会用到。
到此,不要再操作主库。 否则这连个字段会变。
从库slave1操作
1.连接从库slave1,执行如下命令:
change master to master_host='192.168.199.101', master_user='slave', master_password='123456', master_port=3910, master_log_file='mysql-bin.000001', master_log_pos= 155, master_connect_retry=30;
命令说明:
- master_host: 主数据库ip地址,navicat连接的master库的ip地址即可。
- master_user: 上面在主库创建的用来复制数据的用户名。
- master_port: 主库的端口,navicat连接的端口。
- master_password: 用于同步数据的主库用户的对应密码。
- master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值。
- master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值。
- master_connect_retry: 如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
2.查看从库状态:
show slave status;
正常会看到,Slave_IO_State字段是空的,Slave_IO_Runngin为NO,Slave_SQL_Running为No。
那是因为还没启动主从复制服务。
3.启动主从复制功能:
start slave;
启动后,再次查看从库状态:
show slave status;
如果看到:
Slave_IO_State: Waiting for master to send event
Slave_IO_Runngin: YES
Slave_SQL_Running: YES
则说明主从配置成功了。
4.停止主从配置服务:
stop slave;
5.刷新主从配置信息,重新设置主从配置:
reset slave all;
从库slave2操作
从库slave2的操作,和在从库slave1上的操作一样。
show slave status;
change master to master_host='192.168.199.101', master_user='slave', master_password='123456', master_port=3910, master_log_file='mysql-bin.000001', master_log_pos= 155, master_connect_retry=30;
start slave;
show slave status;
测试主从配置
在主库,随便新建数据库,新增表,然后打开两个从库,你会马上看到同样的库和表。
恭喜你,一主二从配置成功了。
双主双从配置
待续……