主从配置需要注意的地方
1、主DB server和从DB server数据库的版本一致
2、主DB server和从DB server数据库数据名称一致
3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一(一般我们采用服务器ip地址的尾数)
在 https://blog.csdn.net/weixin_43231076/article/details/83515054 的基础上,进行mysql主从配置。
根据上述要注意的地方,所以在192.168.25.134 服务器上的mysql中创建一个数据库:db1。以 192.168.25.132 服务器上的mysql为主服务器,192.168.25.134上的mysql为从服务器。
Mysql主服务器配置
1.修改my.conf文件(文件地址:/etc/my.conf),在[mysqld]段下添加:
binlog-do-db=db1
binlog-ignore-db=mysql
#启用二进制日志
log-bin=mysql-bin
#服务器唯一ID,一般取IP最后一段
server-id=132
2.重启mysql服务:执行命令
service mysqld restart
3.建立帐户并授权 slave,执行命令,这些命令需要登录mysql
mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';
backup用户就是从服务器来连接主服务器的用户,一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确。
4. 刷新权限:命令:mysql> FLUSH PRIVILEGES;
5. 查看mysql现在有哪些用户:mysql>select user,host from mysql.user;
6. 查询master的状态:mysql> show master status;得到的结果为:
这里得到的结果,会在配置从服务器上用到。
至此,主服务器的配置就完成了。
Mysql从服务器配置
1.修改my.conf文件,在[mysqld]段下添加 server-id=134,指明server-id
2.登录mysql,执行下面的命令:
change master to master_host=‘192.168.25.132’,master_port=3306,master_user=‘backup’,master_password=‘123456’,master_log_file=‘mysql-bin.000001’,master_log_pos=606
注意:这些命令中间不能断开,master_host为主服务器的ip(要用引号括起来),master_port是主服务器的端口号,无引号,master_user和master_password是主服务器中创建并授予slave权限的用户密码。master_log_file就是在主服务器执行how master status得到的File的值,master_log_pos就是在主服务器执行how master status得到的position的值。
3.重启mysql服务:执行命令 service mysqld restart
4.启动从服务器复制功能:Mysql>start slave;
5.检查从服务器复制功能状态:mysql> show slave status
这个可以在mysql客户端的Navacat中执行,得到结果:
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
错误处理:
如果出现此错误:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
因为是mysql是克隆的系统所以mysql的uuid是一样的,所以需要修改。
解决方法:
删除/var/lib/mysql/auto.cnf文件,重新启动服务。
以上操作过程,从服务器配置完成。
测试
在192.168.25.132服务器的mysql的db1的tb_item表中插入一条数据之后,192.168.25.134里面的db1数据中的tb_item表会自动把插入的那条数据复制过来。(注意:192.168.25.134里面的db1中,必须有一个和192.168.25.132服务器的mysql的db1里的tb_item结构,表名一样的表)
Mycat配置读写分离
Mycat 1.4 支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
在schema.xml中配置:
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM" url="192.168.25.132:3306" user="root"
password="root">
<!--添加一个服务器用来读数据,这个标签可以配置多个-->
<!--这样就表示,通过mycat时,插入数据会插入到192.168.25.132中,因为主从配置,134上也会有数据,而读数据就只从134上读取-->
<readHost host="hostS" url="192.168.25.134:3306" user="root" password="root" />
</writeHost>
</dataHost>
设置 balance="1"与writeType=“0”
Balance参数设置:
1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
2. balance=“1”,所有读操作都随机的发送到readHost。
3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发
WriteType参数设置:
1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
2. writeType=“1”,所有写操作都随机的发送到readHost。
3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”
设置 switchType=“2” 与slaveThreshold=“100”
switchType 目前有三种选择:
-1:表示不自动切换
1 :默认值,自动切换
2 :基于MySQL主从同步的状态决定是否切换
测试
通过mycat,往逻辑表tb_item中插入一条数据,控制id的值,让它插入到db1中,因为配置了主从配置,所以134的db1里面的tb_item表也有一条相同的数据
但是,如果通过mycat,查询逻辑表,查询132的tb_item表中有的数据,但是134的db1里面的tb_item中没有的的数据,就查询无结果,就表示,读数据是从从服务器读取的数据。