【MySQL主从复制和简易主从切换】

准备条件

要配置主从同步和主从切换需要两台服务器,并且均安装了MySQL,一台作为master,一台作为slave。
没有远端服务器的可以自己开两台虚拟机来操作。

操作步骤

要做主从复制就需要从节点订阅主节点的binlog日志,然后在从节点进行回放实现主从复制。所以我们要做的就是打开主库的binlog日志,然后从节点去订阅主节点

主库配置

1.1 开启master二进制日志配置

vi /etc/my.cnf
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index

1.2 配置完成后重启mysql生效

service mysql restart

1.3 登入mysql查看是否生效

mysql -u 用户名 -p
show master status

出现自己定义的binlog名称就是OK了
在这里插入图片描述
1.4 配置成功后就需要给slave建一个用户去订阅mater节点的binlog
我是用的mysql8.0 出现了一些问题 就是不能使用他们说的GRANT XXXX IDENTIFIED BY ‘密码’;
后面查了一些解决办法是去掉后面的 IDENTIFIED BY ‘密码’; 分成两步执行,即建用户和赋权分开就可以。
建用户

mysql>CREATE USER 'mysqlcopy'@'%' IDENTIFIED BY '123456';

赋权

mysql>GRANT REPLICATION SLAVE ON *.* TO 'mysqlcopy'@'%'

刷新权限

mysql>flush privileges;

这里面还遇到了一个问题 就是8.0版本的加密问题 slave没办法连接到master 我解决的方法采用的是在master上面执行这个

alter user 'mysqlcopy'@'%' identified with  mysql_native_password  by '123456';

1.5 给slave用户赋予远程登录

mysql>use mysql
mysql> select user,host from user;

看一下当前的信息
在这里插入图片描述
一般刚才新建的用户都没有这个%需要设置一下

mysql> update user set host='%' where user='mysqlcopy';

然后master基本就OK了

从库配置

2.1 从库主要是配置relay-log 然后指定master是哪一台
配置二进制日志

vim /etc/my.cnf

添加二进制日志配置,里面的server-id需要指定

server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin

在这里插入图片描述
2.2 保存配置重启

service mysql restart

2.3 进入mysql指向master
登入mysql命令 mysql -u 用户名 -p

mysql>change master to master_host='master所在服务器的IP',master_port=master数据库的的端口,master_user='master授权的账号',master_password='授权账号的密码',master_log_file='二进制文件名',master_log_pos=0;

2.4开启主从复制

mysql>start slave

看一下状态

mysql>show slave status \G;

在这里插入图片描述
只要出现这个wating for master to send event 并且下面这两个是YES基本就可以了。
之前出现过Slave_SQL_Running: No 查了一下解决办法
解决办法:

mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;

大概意思就是告诉slave跳过当前卡住的event,继续运行,就像是删文件跳过一样,如果出现多次就需要运行多次。

主从切换简易版

主节点有问题了切换到从节点,很多人是用的中间件来解决,比如keepalived,看到了一篇文章
java连接主从架构的mysql数据库实现故障自动切换
如果是java程序使用jdbc方式连接的话其实mysql驱动包(mysql-connector-java-xxx.jar)中就已经具备了自动切换故障数据库的功能
就着简单的方式我试了一下翻了翻官方文档发现是可行的
配置方式我采用的是这种类型:
url: jdbc:mysql://address=(host=192.168.XXX.XXX)(port=3336)(user=XX)(password=XX),address=(host=XXX.XXX.XXX.134)(port=3306)(user=XX)(password=XX)/数据库名?characterEncoding=utf-8&useSSL=false
这种可以指定端口和用户名

但是有个问题就是他能自动切换,master挂了他切slave会需要十几二十秒,切换成功后他会过一会儿试试master活过来没有 活过来就切回去,所以万一出现从节点写入的请况切回去会很尴尬,大家需要注意这个问题,最好是从节点就不写入只读取可以避免挺多问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值