对于互联网架构来说,MySQL读写分离是很重要的。所以今天我决定在我自己的电脑上模拟下。
我一开始本以为可以用一个MySQL服务,建立两个数据库来模拟。但是网上的教程都是修改MySQL的配置文件,所以我只好另外又安装了个MySQL。为了避免不必要的麻烦,我们尽量保证MySQL版本一致。
我第一个MySQL是msi安装包安装的,在网上我下载的第二个MySQL是压缩包形式的。所以,我们从配置这种解压好的MySQL开始,如果自己会配置的话请忽略。
为了避免命令冲突,第二个MySQL我并不打算配置环境变量。以MySQL5.7版本为例,新建my.ini配置文件和data文件夹用来保存数据(有的版本带有此文件或文件夹,那就请可以直接编辑这个文件了)。
[mysqld]
port = 3307
basedir=F:/mysql5.7
datadir=F:/mysql5.7/data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
default-character-set=utf8
然后把上面的内容复制到my.ini文件里面,注意port,端口号不要冲突。原来的MySQL是3306,这次我搞成了3307。然后就是两个目录配置,改成自己的目录。
然后用管理员打开dos窗口,进入到MySQL安装目录的bin目录下,输入命令 .\mysqld -install mysqld,等出现成功后继续输入 .\mysqld --initialize-insecure --user=mysql 初始化。第一个命令是把MySQL安装为一个服务,因为相同版本的MySQL服务名都是MySQL,所以我们修改这个3307的从库服务名为mysqld(两个数据库不在一个服务器上的请忽略,端口都可以不变)。
此时,我们打开刚刚创建的data目录,就发现里面多了很多东西。接下来,我们进入MySQL,并且更改密码。用户名为root,初始是没有密码的。当我使用mysqladmin -u root -p password命令设置密码时,我发现这个从库的MySQL密码还是空,原来的MySQL密码变了。郁闷。不过,我们可以使用navicat来解决这种窘境,具体navicat怎么修改用户密码请出门百度。
然后大家看到了么,我这就出现了两个MySQL服务。姐下来,我们就可以开始着手配置MySQL主从架构了。
然后我们去修改my.ini。突然意识到,MySQL5.7安装包里面没有my,ini呀!其实不是没有,而是在C:\ProgramData\MySQL\MySQL Server 5.7这个目录下。总之就是ProgramData这个文件夹下面。如果找不到ProgramData文件夹的话请放弃IT行业。
首先我们去改主库的配置文件。
这个log-bin默认是注释掉的,代表主库的二进制日志。熟悉主从复制原理的同学们应该知道,MySQL从库就是读取这个文件去拷贝数据的,我们把它打开并且赋值为mysql-bin。然后,配置从库不需要赋值的数据库
[mysqld]
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
服务器的id我们先不用管,但是必须和从库不一样。就是这个字段。
主库的配置到此就差不多了,接下来去从库配置。
我们去改从库的server-id,设置成2就好了,反正每个数据库都要让他不一样。
然后,设置不需要去拷贝的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
配置好了重启两个MySQL服务。
有些人愿意让每个从库以新用户的身份去主库复制数据,因为我们做的是小demo,所以直接使用root用户操作。
去主库执行show master status,记住File和Position的值。
再去从库执行
change master to master_host='127.0.0.1',master_user='root',master_password='1234',master_log_file='mysql_bin.000001',
master_log_pos=0,master_port=3306;
注意,host,log_filr,port要改成自己的。然后从库执行start slave;
然后show slave status,你就发现了喜人的状态。具体看Salve_IO_Running和Slave_SQL_Running,如果都是yes,那就没问题了。
注意,在start slave之前,必须要把主库的数据手动复制一遍去从库(可以导出sql去从库执行一遍),否则如果主库直接去现有数据库操作数据时,从库会因为找不到此数据库而报错。如果我们没有这么做,此时,我们查看从库状态,发现从库的io线程仍在运行,但是sql线程不在运行了。这时候,我们可以去主库锁定所有表,防止再有数据更改。
flush tables with read lock;
然后去从库停止,
stop slave
再设置错误sql跳过,你可以设置为1,show slave status。如果sql线程还没有启动,那就设置为2,直到sql线程启动。
然后start slave,别忘了去主库unlock tables解锁哦!
测试主从配置是否成功,在navicat里面新建数据库tttt,新建表id,保存后,发现从库自己就同步过来了,啊哈哈哈
至此,我们的demo配置就完成了。
注意事项
- 一般我们需要设置从库只允许读,不允许写。只需要去配置文件里面,【mysqld】下面加入read-only = 1就好了。这个值为0表示支持可读写、1的话表明仅支持可读
- 其实主从数据库的配置区别主要就是server-id和这个read-only
- 最好在从库启动之前先把主库的数据拷贝过来,此时一般需要锁住MySQL主库。
- 如果出现错误了,我们需要根据情况去决策,我这里是跳过此错误,但是实际生产上,往往是重新备份的。
- 其实可以直接指定从库的master_log_pos,赋值为刚刚要你记住的主库的Position值,这样就不会出现错误了,但是同步之前的数据是不会被拷贝过来的。
来源:CSDN
作者:北半球第一帅
链接:https://blog.csdn.net/qq_19439605/article/details/104678750