我们接着上一个文档继续做!由于还要用到上面装的mysql数据库,在这个进行一些配置
首先删除数据库testdb,然后关闭slave并重置 (在两台mysql上都要执行)
drop database testdb
stop slave
reset master
接下来我们开始新的章节,在这一章节里我们会实现mysql的双主双从的读写分离(高可用)。
前面我们已经在192.168.10.1和192.168.10.2上搭建的mysql,接下来我们在192.168.10.3和192.168.10.4上搭建mysql
角色 | IP地址 | 主机名 |
---|---|---|
master1 | 192.168.10.1 | Master1 |
slave1 | 192.168.10.2 | Slave1 |
master2 | 192.168.10.3 | Master1 |
slave2 | 192.168.10.4 | Slave2 |
在192.168.10.3和192.168.10.4上搭建mysql服务
yum install -y mariadb-server mariadb
systemctl start mariadb && systemctl enable mariadb
#进入/etc/my.cnf
添加:
[mysqld]
skip-grant-tables
重启mysql
systemctl restart mariadb
mysql -uroot -p
回车
设置root密码为
UPDATE mysql.user SET password = PASSWORD('123456') WHERE user = 'root';
exit
#进入/etc/my.cnf
在[mysqld]的段注释掉:skip-grant-tables 保存并且退出vi。
重启mysql
systemctl restart mariadb
##授权
mysql -uroot -p123456
grant all privileges on *.* to root@'%' identified by '123456';
grant all privileges on *.* to root@'localhost' identified by '123456';
flush privileges;
exit
##验证数据库访问情况(在192.168.10.1上)
mysql -uroot -p123456 -h 192.168.10.1 -P 3306
mysql -uroot -p123456 -h 192.168.10.2 -P 3306
mysql -uroot -p123456 -h 192.168.10.3 -P 3306
mysql -uroot -p123456 -h 192.168.10.4 -P 3306
1.修改master1(192.168.10.1)的配置文件
修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
2.修改master2(192.168.10.3)的配置文件
修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 注意:自增长字段不能和master1的一样
auto-increment-offset=2
3.修改slave1(192.168.10.2)的配置文件
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
4.修改slave2(192.168.10.4)的配置文件
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay
5.双主机、双从机重启 mysql 服务 关闭防火墙
systemctl restart mariadb && systemctl stop firewalld && systemctl disable firewalld
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
flush privileges;
7.查看master(192.168.10.1,192.168.10.2)的状态
##查询Master1的状态
show master status;
#查询Master2的状态
show master status;
Slava1 复制 Master1,Slava2 复制 Master2
##Slava1的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.1',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=473;
##Slava2的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.3',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=473;
##启动两台从服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;
##下面两个参数都是Yes,则说明主从配置成功!
## Slave_IO_Running: Yes
## Slave_SQL_Running: Yes
9.两个master互相复制(互为主备)
Master2 复制 Master1,Master1 复制 Master2
## Master1的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.3',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=473;
## Master2的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.1',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=473;
#启动两台主服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;
![](https://ask8088-private-1251520898.cn-south.myqcloud.com/developer-images/article/8880527/olx7yuoe8i.png?q-sign-algorithm=sha1&q-ak=AKID2uZ1FGBdx1pNgjE3KK4YliPpzyjLZvug&q-sign-time=1635478227;1635485427&q-key-time=1635478227;1635485427&q-header-list=&q-url-param-list=&q-signature=9a66cbc0e07f49d580ba23f2837d15ccc742930c)
![](https://ask8088-private-1251520898.cn-south.myqcloud.com/developer-images/article/8880527/kde9k318zy.png?q-sign-algorithm=sha1&q-ak=AKID2uZ1FGBdx1pNgjE3KK4YliPpzyjLZvug&q-sign-time=1635478234;1635485434&q-key-time=1635478234;1635485434&q-header-list=&q-url-param-list=&q-signature=bbaa48a51c13a8667f01bbf64dc4859a491934f6)
##下面两个参数都是Yes,则说明主从配置成功!
##效果:在master1上新建库、新建表、insert 记录,Master2 和从机会复制
##以下命令在master1上执行
create database testdb
use testdb
create table mytbl(id int,name varchar(20));
insert into mytbl values(1,'zhangsan');
##以下命令在slave1,master2,slave2上执行:
select * from testdb.mytbl;
修改<dataHost>的balance属性,通过此属性配置读写分离的类型
负载均衡类型,目前的取值有4 种默认是0:
(1)balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
(2)balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
(3)balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
(4)balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
##双主双从模式选择:balance="1" 一主一从选择:balance="3"
为了双主双从读写分离balance设置为1
#balance="1": 全部的readHost与stand by writeHost参与select语句的负载均衡。
#writeType="0": 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
#writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
#writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。
#switchType="1": 1 默认值,自动切换。
# -1 表示不自动切换
# 2 基于 MySQL 主从同步的状态决定是否切换。
12.验证读写分离以及高可用
##验证读写分离
##在写主机Master1数据库表mytbl中插入带系统变量数据,造成主从数据不一致
mysql -uroot -p123456
INSERT INTO mytbl VALUES(2,@@hostname);
mysql -umycat -p123456 -P 8066 -h 192.168.10.1
select * from mytbl;
##在Mycat里查询mytbl表,可以看到查询语句在Master2(192.168.10.3)、Slava1(192.168.10.2)、Slava2(192.168.10.4) 主从三个主机间切换
##验证mysql高可用
在master1(192.168.10.1)输入如下命令:
systemctl stop mariadb
systemctl status mariadb
##在Mycat里插入数据依然成功,Master2自动切换为写主机
mysql -umycat -p123456 -P 8066 -h 192.168.10.1
INSERT INTO mytbl VALUES(3,@@hostname);
select * from mytbl;
##在Mycat里查询mytbl表,可以看到查询语句在Slave2(192.168.10.4)上进行查询
##然后在启动master1(192.168.10.1)输入如下命令:
systemctl start mariadb
systemctl status mariadb
##在Mycat里查询mytbl表,可以看到查询语句在Master2(192.168.10.3)、Slava1(192.168.10.2)、Slava2(192.168.10.4) 主从三个主机间切换
总结:Master1、Master2 互做备机,master1宕机之后会有master2继续master1写工作,但是此时查询的操作也只有slave2进行。
当master1恢复,此时就会有三台查询的机器,master2继续作为写的操作。当master2宕机后,由master1成为写的操作,此时读的操作也只有slave1。
也就是说,当master出现故障,slave也不会继续工作。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。