环境准备
MySQL5.7
MyCAT1.6.7.3
VBox
三台CentOS7.3虚拟机:
192.168.1.7 MyCat01 -MySQL
192.168.1.8 MyCat02 -MySQL
192.168.1.9 MyCat03 -MyCat
搭建环境
192.168.1.7 MyCat01 -MySQL
192.168.1.8 MyCat02 -MySQL
两台节点搭建MySQL
192.168.1.9MyCat03 搭建MyCat中间件
MyCat官网,下载某个版本之后上传到服务器
http://www.mycat.org.cn/
解压
tar -zxvf Mycat-server-1.6.7.3-release-20190828135747-linux.tar.gz
进入到解压之后的mycat目录,进入到配置文件conf文件下
修改server.xml
vim server.xml
修改root的密码,和schemas的逻辑库,也修改user账户的逻辑库
修改schema.xml
vim schema.xml
修改逻辑库对应的库名称,跟server.xml中对应。
配置节点主机就是两台MySQL地址。
配置分配节点,就是对应两台MySQL的配置。
启动MyCat
console是可以将日志打印,记得要配置Java环境
start就是后台启动
./mycat console
测试插入数据
使用Navcat连接这3节点,MyCat默认端口是8066
在MyCat中插入两条数据,可以看到,两台数据根据配置的规则分别插入到了两个库中。
默认规则0-500M的主键在第一个库,500M-1000M在第二个库
MyCat-Manager
除了8066端口之外还有一个9066端口
show @@help;
通过命令窗口打开这个链接
通过查看命令可以看到有
reload @@config
reload @@config_all
命令,通过这个命令可以重载MyCat的配置,这样在生成环境中就可以不重新启动MyCat带来的影响。
用户配置
server.xml中用户的配置
<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">user</property>
</user>
schemas的配置要要跟schema.xml配种中有多少schema标签匹配,有多个是就用,隔开,如:
<property name="schemas">user,order,product</property>
schema.xml配置
配置dataHost(节点主机),包括读host,写host
配置dataNode(数据节点),指定到具体的数据库
配置schema,表名、数据节点、分配规则
dataHost
<dataHost name="db7" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="M1" url="192.168.1.7:3306" user="root" password="123456"><!-- can have multi read hosts --><!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> -->
</writeHost>
</dataHost>
name:集群别名,随便取
maxCon,minCon:连接池的最大连接数和最小连接数
balance:负载均衡类型,0表示不使用读写分离,所有的读写请求都发送给写节点1和2读写均匀分配;3表示读落在readHost上
writeType:0表示所有的写请求都会落到第一个读库上;1表示读写请求随机发送给可用的节点
dbType:mysql代表的是配置的是mysql集群
dbDriver:mycat自带的数据库驱动
switchType:1代表mycat会使用自己的心跳监测结果去判断那个节点宕机了
slaveThreshold:100表示如果从库的时间落后于主库的时间超过100秒就被剔除,mycat就不会从这个从节点读取数据
heartbeat:心跳监测执行的SQL语句,也可以更改,比如select 1,只要有返回响应就行,表示没有宕机
writeHost :配置MySQL节点,有多少节点就配置多少个writeHost 标签。如果有主从关系,那就要把读的配置放在标签内部
host:自定义名称
url:节点地址+端口
user:节点的数据库登录账号
password:节点的数据库登录密码
dataNode
<dataNode name="dn7" dataHost="db7" database="user_7" />
name :节点名称
dataHost :对应的dataHost名称
database :对应数据库里的表
schema
<schema name="user" checkSQLschema="true" sqlMaxLimit="100"><!-- auto sharding by id (long) --><table name="user" dataNode="dn7,dn8" rule="auto-sharding-long" /><!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> -->
</schema>
checkSQLschema:true表示MyCat在执行SQL语句的时候会把SQL语句中逻辑库的名字去掉,直接使用表名;false反之
sqlMaxLimit:100表示每次查询最多返回100条数据,仅对分片表有效
table:
name:虚拟表的名称
** type**:gobal表示这是全局表,不做水平切分;mod-long主键求模切分
dataNode:表放置的逻辑库位置,根据配置的dataNode来填
rule :定义分片表的分片规则,必须与rule.xml中的tableRule对应
ruleRequired :是否绑定分片规则,true表示没有绑定分片规则,程序报错
配置主从MySql
配置
在作为主节点的服务器上配置/etc/my.cnf
添加如下配置,主节点的server-id必须为1,从节点不能重复
log-bin=sea_mysql
server-id=1
在从节点中的/etc/my.cnf配置
server-id=2
重启两台服务器的Mysql
主创建备份账户并授权replication slave
创建账户
mysql>create user 'repl'@'%' identified by '123456';
授权replication slave给repl账户
刷新权限
mysql>grant replication slave on *.* to 'repl'@'%';
mysql>FLUSH PRIVILEGES;
主进行锁表
这是为了在进行主从数据备份的时候,防止数据落到主库上,这样数据就没法插入到主库。
mysql>FLUSH TABLES WITH READ LOCK;
主 找到log-bin位置
mysql> SHOW MASTER STATUS;
主备份数据
mysqldump --all-databases --master-data > dbdump.db
然后在从节点的服务器上把主节点备份下来的dbdump.db复制过到相同的默认路径
scp root@192.168.1.7:~/dbdump.db .
加载过来之后在从节点的数据库中加载这份备份文件
mysql < dbdump.db -uroot -p
执行完并确认数据已经备份到主节点之后,释放主节点的锁
mysql> unlock tables;unlock tables;
设置主从同步
在从节点中进行配置
master_log_file=‘sea_mysql.000001’,
master_log_pos=747;
两条就是在主节点中 show master status的信息
mysql> change master to-> master_host='192.168.1.7',-> master_user='repl',-> master_password='123456',-> master_log_file='sea_mysql.000001',-> master_log_pos=747;
mysql> start slave;
字表
childTable :定义分片字表
name :字表名称
joinKey :标志字表的列,用于与父表做关联
parentKey :标志父表的列,与joinKey对应
primaryKey :子表主键,同table标签上的
needAddLimit :同table标签上的
joinKey表示是子表中的字段名称,parentKey表示是是父表中的字段名称
<table name="o_order" dataNode="dn7,dn8" rule="auto-sharding-long"><childTable name="order_item" joinKey="order_id" parentKey="id" />
</table>
HA
避免单点故障
两个keepalived会虚拟出一个虚拟IP,一个连接请求进来通过虚拟IP,然后会进入到其中一个haproxy,然后通过haproxy我们自己定义的负载均衡方式去访问两台mycat。
安装第二台mycat
在192.168.1.8上也安装MyCat
-r表示mycat目录下的所有文件
scp -r root@192.168.1.9:/usr/mycat .
然后启动mycat,navcat连接
安装haproxy
yum -y install haproxy.x86_64
修改配置
vim /etc/haproxy/haproxy.cfg
连接mycat要用tcp协议去连接
把mycat的节点配置上
启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg
连接的密码就是mycat的账号密码
HA-Keepalived
安装keepalived
yum install -y keepalived.x86_64
配置
vim /etc/keepalived/keepalived.conf
注释掉如下配置,不然会影响虚拟ip
然后把下面这段配置之后的配置都删除就可以了,不影响使用
查看当前主机的网卡名称
修改网卡的名称
在另一台的主机手也安装keepalived,配置跟上面一样,唯一区别的就是要改成SLAVE,虚拟IP就MASTER的一致
启动keepalived
keepalived -f /etc/keepalived/keepalived.conf
查看网卡下的虚拟地址,可以看到现在有2个了,多了一个我们刚刚自己配置的
然后用Navcat连接,地址用虚拟IP,账号密码用mycat的
Keepalived的Master挂了
当Master挂了之后,虚拟IP就会绑定到SLAVE上,当主节点再次启动之后,虚拟IP也还是绑定在SLAVE上。
haproxy挂了之后的热备
keepalived配置中的TCP_CHECK没有起到作用,暂时先去掉
安装killall命令,这并不是杀掉进程的命令,而是探测你进程是否还存在的命令。
yum install -y psmisc.x86_64
修改keepalived的配置
vrrp_script chk_haproxy {
script "killall -0 haproxy"interval 2
}
track_script {
chk_haproxy
}
至此,重启两台keepalived之后,可以尝试杀掉haproxy,可以看到虚拟IP也是在互相存在于另一台的主机上。并且也不影响查询。