准备条件
要配置主从同步和主从切换需要两台服务器,并且均安装了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活过来没有 活过来就切回去,所以万一出现从节点写入的请况切回去会很尴尬,大家需要注意这个问题,最好是从节点就不写入只读取可以避免挺多问题。