1. MyCat 中间件
MyCat 是一款 数据集群软件 ,支持MySQL 和常用的关系型数据库
2. mysql忘记密码
vi /etc/my.cnf
#在[mysqld]下添加编码配置
skip-grant-tables #无需密码进入mysql
mysql -uroot -p #直接回车进入
#修改密码
use mysql;
update user set authentication_string=password('123456') where user='root';
#刷新权限
flush privileges;
exit;
#删除之前的无密码
vi /etc/my.cnf
systemctl restart mysqld #重启
3. 安装
mysql
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
systemctl start mysqld.service
grep "password" /var/log/mysqld.log
mysql -uroot -p
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
#关闭密码强度检测
grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
flush privileges;
#退出
exit
#防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
#配置默认编码为UTF-8 修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示
vi /etc/my.cnf
#在[mysqld]下添加
character_set_server=utf8
collation-server=utf8_general_ci
init_connect='SET NAMES utf8'
systemctl restart mysqld
# 开机启动
systemctl enable mysqld
systemctl daemon-reload
#用户名为root 密码为A37
mycat
#上传mycat到linux上
tar -xvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz
# 编辑环境变量
vi /etc/profile
#添加以下内容
export MYCAT_HOME=/root/mycat
source /etc/profile
cd /root/mycat/bin
./mycat start
firewall-cmd --zone=public --add-port=8066/tcp --permanent
firewall-cmd --reload
#用户root 密码123456 端口8066
4. 克隆
克隆重新生成mac地址
并修改mysql的uuid 随机改一下
vi /var/lib/mysql/auto.cnf
5. 主重复制
MyCat 的读写分离 需要用到主从复制 从表会根据主表进行同步
我们在写数据时 写入主表 而读取从从表中读取
#在主服务器上
vi /etc/my.cnf
#在[mysqld]加上 log-bin 开启主从复制 server-id 主从服务器的唯一标识
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
service mysqld restart
mysql -uroot -p
# 需要 file和position的值 配置从服务器用
show master status;
#在从服务器上
vi /etc/my.cnf
#在[mysqld]加上
server-id=2
mysql -uroot -p
use mysql;
drop table slave_master_info;
drop table slave_relat_log_info;
drop table slave_worker_info;
drop table innodb_index_stats;
drop table innodb_table_stats;
sorce /usr/share/mysql/mysql_system_tables.sql;
serveice mysqld restart
mysql -uroot -p
change master to master_host='主服务器ip',master_port=3306,master_user='root',master_password='password',master_log_file='刚刚在主服务器查到的值',master_log_pos=同样也是之前查到的;
# 开启从节点
start slave;
# 查询结果 Slave_IO_Runing和Slave_SQL_Running都为yes才成功
show slave status\G;
6. 读写分离
需要先配置主从复制 写操作只写主服务器 而读取是从从服务器中数据
# 修改server.xml
vi /root/mycat/conf/server.xml
<user name="root" defaultAccount="true">
<!-- 密码 -->
<property name="password">123456</property>
<!-- 库名 -->
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
# 修改schema.xml
vi /root/mycat/conf/schema.xml
<!-- 建议百度找配置文件这个不太准确 -->
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- name为主服务器 server文件的虚拟库名与name必须一致 -->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<table name="customer" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-intfile" autoIncrement="true" fetchStoreNodeByJdbc="true">
<childTable name="customer_addr" primaryKey="id" joinKey="customer_id" parentKey="id"> </childTable>
</table>
</schema>
<!-- name必须与datenode一致 database为真实的库名 -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root"
password="root">
<!-- 从服务器 负责读 -->
<readHost host="hostS1" url="从服务器+端口" user="" password="">
</writeHost>
</dataHost>
</mycat:schema>
# 重启 mycat
./mycat restart
使用时连接mycat的地址使用即可
7. 分库分表
将庞大数据量拆分为不同的数据库和数据表进行存储
7.1. 水平拆分
根据表的数据逻辑关系,将同一表中的数据按某种条件,拆分到多台服务器上,也叫横向拆分
修改主服务器中 server.xml vi /root/mycat/conf/server.xml
<!-- 添加property 配置主键方式 0为本地文件方式 -->
<property name="sequnceHandlerType">0</property>
修改主服务器的 sequence_conf.properties vi /root/mycat/conf/sequence_conf.properties
GLOBAL.HISIDS= #可以自定义关键字
GLOBAL.MINID=10001 #最小值
GLOBAL.MAXID=20000 #最大值
修改schema.xml vi /root/mycat/conf/schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="customer" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long">
</table>
</schema>
<!-- name必须与datenode一致 database为真实的库名 -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root">
<!-- 从服务器 负责读 -->
<readHost host="hostS1" url="从服务器+端口" user="" password="">
</writeHost>
</dataHost>
</mycat:schema>
修改 rule.xml vi /root/mycat/conf/rule.xml
<function name='mod-log' class='io.mycat.route.function.PartitionBymod'>
<property name='count'>3</property>
</function>
插入数据列名必须完整 如果是自增键 则需要用 NEXT VALUE FOR MYCATSEQ_GLOBAL 不能用null
以上配置用的是根据主键取模方式拆分
7.2. 垂直拆分
根据业务的维度,将不同的表切分到不同数据库上,也叫纵向拆分
修改schema.xml vi /root/mycat/conf/schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
</table>
<table name="dog" primaryKey="id" autoIncrement='true' dataNode='dn4'>
</table>
<table name="cat" primaryKey="id" autoIncrement='true' dataNode='dn5'>
</table>
</schema>
<!-- name必须与datenode一致 database为真实的库名 -->
<dataNode name="dn4" dataHost="localhost1" database="db1" />
<dataNode name="dn5" dataHost="localhost1" database="db2" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root">
<!-- 从服务器 负责读 -->
<readHost host="hostS1" url="从服务器+端口" user="" password="">
</writeHost>
</dataHost>
</mycat:schema>
根据 表名 区分库 如dog 存放在db1中 cat存放在db2中