主从复制读写分离

一、主从复制

存储引擎:主要负责数据的存储和读取
myisam 引擎 与 innodb 引擎区别:
innodb:行级锁,适用经常写的表,支持事物
mysiam:表级锁,适用经常读的表,不支持事物

主从复制的原理

在这里插入图片描述
1、主服务器:
配置my.cnf
[root@ mycat ~]# vim /etc/my.cnf 添加一下内容
[mysqld]
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
重启mysql
[root@ mycat ~]# systemctl restart mysqld
授权:mysql> grant replication slave on . to slave@192.168.100.1 identified by “123456”;
2、从服务器:
测试连接到主服务器是否成功
[root@ mycat ~]# mysql -uslave -p123456 -h 192.168.100.1
修改my.cnf配置文件
[root@ mycat ~]# vim /etc/my.cnf
server-id = 2 #从服务器ID号,不要和主ID相同
重启mysql
[root@ mycat ~]# systemctl restart mysqld
[root@ mycat ~]# mysql -uroot -p123456
mysql> stop slave;
mysql> change master to master_host=‘192.168.100.1’,master_user=‘slave’,master_password=‘123456’;
mysql> start slave; #启动slave
mysql> show slave status\G 查看状态
主创建数据库,看主从数据是否同步
mysql> create database HA;
mysql> create table T1 (name char(10),age tinyint);
Slave_IO_Running :一个负责与主机的io通信,拉取主的二进制文件
I/O线程有问题,可能是主创建的用户你没有指定对,salve与master建立连接的问题,可能是客户端与服务器的防火墙的问题,或者master给与slave的授权账号,再在lave中无法登陆,也可能是salve账号权限的问题
Slave_SQL_Running:将中继日志里的文件重放到自己本地
SQL线程有问题,可能是自己本地的问题。sql线程是可能是从中继日志中还原数据的时候,salve中可能已经存在这个数据,将对应数据删除,再进行数据同步
看到2个yes说明设置成功
主服务器插入数据测试同步

二、读写分离(mycat)

上传并解压软件包
tar zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/
网上下载地址:
MyCAT有提供编译好的安装包,支持windows、Linux、Mac、Solaris等系统上安装与运行。 官方下载主页http://www.mycat.io
Mycat 需要安装JDK 1.7 或者以上版本
上传并解压软件包jdk包:tar zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
创建mycat用户:useradd mycat
修改主机名:hostnamectl set-hostname mycat bash
添加主机名到hosts文件:
[root@ mycat ~]# vim /etc/hosts #mysql服务器和mycat ip对应的主机名
192.168.100.1 master
192.168.100.2 slave1
192.168.100.3 slave2
192.168.100.101 mycat
配置环境变量
[root@ mycat ~]# vim /etc/profile #在文件最后加入一下行
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@ mycat ~]# source /etc/profile #使环境变量生效
查看java环境
[root@ mycat ~]# java -version
配置mycat环境变量
[root@ mycat ~]# ln -s /usr/local/mycat/bin/* /usr/local/bin/
在conf/server.xml文件中配置mycat用户账号和授权信息
[root@ mycat ~]#vim /usr/local/mycat/conf/server.xml
编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息
在这里插入图片描述
[root@centos1 ~]# vim /usr/local/mycat/conf/schema.xml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

 <schema name="HA" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" />
 <dataNode name="dn1" dataHost=" localhost1" database="HA" />
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" 
     dbDriver="native" switchType="-1"  slaveThreshold="100">
     <heartbeat>select user()</heartbeat>
     <!-- can have multi write hosts -->
     <writeHost host="centos1" url="192.168.100.1:3306" user="root" password="123456">
     </writeHost>
     <writeHost host="centos2" url="192.168.100.1:3306" user="root" password="123456">
     </writeHost>
     <writeHost host="centos3" url="192.168.100.3:3306" user="root" password="123456">
     </writeHost>
 </dataHost>
 </mycat:schema>

所有mysql 给mycat远程登陆权限(root用户所有库所有表的权限)
mysql> grant all on . to root@‘192.168.1.%’ identified by ‘123456’;
[root@ mycat]# mycat console #先使用console进行检测
[root@ mycat]# mycat start #检测成功,执行开启
查看端口
[root@ mycat]# netstat -antup | grep 8066

参数详解:

server.xml
客户端访问mycat,mycat去找数据库
指定客户端登录mycat的用户名密码还有对哪个数据库有什么权限
root有读写权限 repl有读权限
schema.xml
mycat去找数据库,但是默认mysql不让远程登录,要在所有mysql上面建一个(用户),让它远程登录(让它指定客户读写应该找哪个服务器,通过这个调用主服务器从服务器)。在这个文件当中指定mysql服务器赋权的用户名密码ip,哪个是主服务器哪个是从服务器,要不要主坏掉之后从服务器顶替
balance=“1” -->除了第一个以外,(读)请求其他服务器,负载均衡
writeType=“0” -->(写)发送到第一个服务器上,第一个坏了切换到第二台上,第二台坏了切换到第三台上,以此类推。
switchType="-1" -->上面那个能不能(切换),是这个选项来决定的。-1表示不切换,当写坏了它是不会切换的。1表示能切换

三、客户端连接mycat(测试)

使用root账号登陆(有写权限)

[root@centos1 ~]# mysql -uroot -p123456 -P 8066 -h192.168.100.1
mysql> show databases;
mysql> use HA;
mysql> show tables;
mysql> select * from T1;
mysql> insert into t1 values (‘liming’,20);
使用repl账号登陆(有读权限)
使用repl只读账号登陆测试是否有写权限
[root@centos1 ~]# mysql -urepl -p123456 -P 8066 -h192.168.100.1
mysql> use HA;
mysql> insert into T1 values(zs,‘20’); 报错,写不了!

模拟故障:从服务器挂掉了

[root@centos3 ~]# systemctl stop mysqld #关闭从mysqld
[root@centos3 ~]# mysql -uroot -p123456 -P 8066 -h192.168.100.1 # 使用root读写权限
mysql> use HA;
mysql> insert into T1 values(4,‘wang’,20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from T1;
读写都没有问题。

模拟故障:主服务器挂掉了

[root@centos1 ~]# systemctl stop mysqld #关闭主服务器
在客户端测试读写
[root@centos1 ~]# mysql -uroot -p123456 -P 8066 -h192.168.100.1
mysql> use HA;
mysql> select * from T1; #查询T1表
mysql> insert into T1 values(5,‘lisi’,30);
说明:ERROR 1184 (HY000): 拒绝连接 #主数据库停止了,是无法写操作的,但不影响读.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值