MySQL中如何实现读写分离
MySQL中如何实现读写分离,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
一,创建Master数据库的配置文件
vimaster.cnf[mysqld]#masterserveridserver-id=1#binloglog_bin=mysql-master-bin
server-id,在MySQL集群数据库中,这个参数必须唯一
log_bin,MySQL采用二进制日志文件复制的文件名
二,将该配置文件拷贝到MySQL Docker容器中
dockerrun--namemysql-eMYSQL_ROOT_PASSWORD=root-dmysqldockercpmaster.cnffdb98bbd52b6:/etc/mysql/conf.d
三,提交修改后的Docker容器
dockercommit-m"addmasterconfigurefile"fdb98bbd52b6mysql:master[root@dev01~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmysqlmaster345465966cb53hoursago445MB
commit -m是修改容器后提交的信息,类似Git提交;
fdb98bbd52b6是刚才修改的容器;
mysql:master是我们为修改后的容器打上tag标签master
接下来我们修改MySQL Slave(从数据库)的容器配置文件
一,创建Slave数据库的配置文件
vislave.cnf[mysqld]#slaveserveridserver-id=2#binloglog_bin=mysql-slave-binrelay_log=mysql-relay-binlog_slave_updates=1read_only=1
server-id为从数据库的ID,该参数在MySQL集群中必须保持唯一性;
log_bin如果slave为其它slave的master,必须设置bin_log,在这里我们暂时开启;
relay_log配置中继日志
log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处);
read_only尽量使用read_only,它防止改变数据(除了特殊的线程);
二,将配置文件拷贝到容器中
dockerrun--namemysql-eMYSQL_ROOT_PASSWORD=root-dmysqldockercpslave.cnf8ee82abb2e91:/etc/mysql/conf.d
三,提交修改后的Docker容器
dockercommit-m"addslaveconfigurefile"8ee82abb2e91mysql:slave[root@dev01~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmysqlslave3a53cd39ee454hoursago445MB
到此,所需要的两个MySQL容器已经修改完毕,并且保存在我们本地的容器仓库中,接下来我们开始启动刚才修改的两个容器进行后续的配置
一,启动Master数据库
dockerrun--namemaster-eMYSQL_ROOT_PASSWORD=root-dmysql:master
--name master是我们为启动的容器名;
mysql:master是我们刚才修改后并且提交到本地的Docker镜像
默认数据库root的密码设置为root
二,启动Slave数据库
dockerrun--linkmaster:master--nameslave-eMYSQL_ROOT_PASSWORD=root-dmysql:slave
为了master容器与slave容器的网络互通,我们添加了--line选项来连接到我们刚才启动的名为master容器;
--name slave是我们为启动的容器名;
mysql:slave是我们刚才修改后并且提交到本地的Docker镜像;
默认数据库root的密码设置为root
三,进入master容器中通过mysql命令进入数据库
dockerexec-itmaster/bin/bashmysql-uroot-proot
四,在master数据库中创建用于复制数据的账号,并且给该账号相应的权限
createuser'repl'@'%'identifiedby'repl-pwd';grantreplicationslaveon*.*to'repl'@'%';flushprivileges;
五,查看master数据库的状态
mysql>showmasterstatus;+-------------------------+----------+--------------+------------------+-------------------+|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|+-------------------------+----------+--------------+------------------+-------------------+|mysql-master-bin.000003|2743||||+-------------------------+----------+--------------+------------------+-------------------+1rowinset(0.00sec)
六,进入slave容器中通过mysql命令进入数据库
dockerexec-itslave/bin/bashmysql-uroot-proot
七,配置slave,将master数据库指向刚才配置好的master数据库节点,并且启动slave
changemastertomaster_host='master',master_user='repl',master_password='repl-pwd',master_log_file='mysql-master-bin.000003',master_log_pos=0;startslave;
八,查看slave数据库状态
mysql>showslavestatus\G***************************1.row***************************Slave_IO_State:Master_Host:masterMaster_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-master-bin.000003Read_Master_Log_Pos:4Relay_Log_File:mysql-relay-bin.000001Relay_Log_Pos:4Relay_Master_Log_File:mysql-master-bin.000003Slave_IO_Running:NoSlave_SQL_Running:NoReplicate_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:4Relay_Log_Space:155Until_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:NULLMaster_SSL_Verify_Server_Cert:NoLast_IO_Errno:2061Last_IO_Error:errorconnectingtomaster'repl@master:3306'-retry-time:60retries:1message:Authenticationplugin'caching_sha2_password'reportederror:Authenticationrequiressecureconnection.Last_SQL_Errno:0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id:0Master_UUID:Master_Info_File:mysql.slave_master_infoSQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State:Master_Retry_Count:86400Master_Bind:Last_IO_Error_Timestamp:19091206:06:14Last_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:1rowinset(0.00sec)
由于最新版的MySQL为了提升安全性更改了密码校验插件,在这里我们还是采用之前的密码校验插件,我们在master数据库上用如下的命令来修改刚才在master数据库创建的用户
alteruser'repl'@'%'identifiedby'repl-pwd'passwordexpirenever;alteruser'repl'@'%'identifiedwithmysql_native_passwordby'repl-pwd';flushprivileges;
九,再次查看slave状态
mysql>showslavestatus\G***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:masterMaster_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-master-bin.000003Read_Master_Log_Pos:2743Relay_Log_File:mysql-relay-bin.000002Relay_Log_Pos:2971Relay_Master_Log_File:mysql-master-bin.000003Slave_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:2743Relay_Log_Space:3179Until_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:1Master_UUID:f6e8062e-d521-11e9-9009-0242ac110008Master_Info_File:mysql.slave_master_infoSQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State:Slavehasreadallrelaylog;waitingformoreupdatesMaster_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:1rowinset(0.00sec)
我们主要查看Slave_IO_Running和Slave_SQL_Running,表示我们的slave数据库节点已经成功的连接到了我们的master数据库节点。
十,验证,我们在master数据库节点上创建一个空的数据库
mysql>createdatabasedata;QueryOK,1rowaffected(0.10sec)mysql>showdatabases;+--------------------+|Database|+--------------------+|data||information_schema||mysql||performance_schema||sys|+--------------------+5rowsinset(0.01sec)
十一,验证slave,查看刚才在master数据库节点上创建的数据库是否同步到slave数据节点
mysql>showdatabases;+--------------------+|Database|+--------------------+|data||information_schema||mysql||performance_schema||sys|+--------------------+5rowsinset(0.01sec)
可以看到,我们刚才在master数据库节点上创建的数据库已经同步到我们的slave数据库节点,master和slave的数据库数据已经保持一致。
关于MySQL中如何实现读写分离问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。