1. MyCat 中间件

MyCat 是一款 数据集群软件 ,支持MySQL 和常用的关系型数据库

2. mysql忘记密码

  1. vi /etc/my.cnf
  2. #在[mysqld]下添加编码配置
  3. skip-grant-tables #无需密码进入mysql
  4. mysql -uroot -p #直接回车进入
  5. #修改密码
  6. use mysql;
  7. update user set authentication_string=password('123456') where user='root';
  8. #刷新权限
  9. flush privileges;
  10. exit;
  11. #删除之前的无密码
  12. vi /etc/my.cnf
  13. systemctl restart mysqld #重启

3. 安装

mysql

  1. wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
  2. yum -y install mysql57-community-release-el7-10.noarch.rpm
  3. yum -y install mysql-community-server
  4. systemctl start mysqld.service
  5. grep "password" /var/log/mysqld.log
  6. mysql -uroot -p
  7. #修改密码
  8. ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
  9. #关闭密码强度检测
  10. grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
  11. flush privileges;
  12. #退出
  13. exit
  14. #防火墙
  15. firewall-cmd --zone=public --add-port=3306/tcp --permanent
  16. firewall-cmd --reload
  17. #配置默认编码为UTF-8 修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示
  18. vi /etc/my.cnf
  19. #在[mysqld]下添加
  20. character_set_server=utf8
  21. collation-server=utf8_general_ci
  22. init_connect='SET NAMES utf8'
  23. systemctl restart mysqld
  24. # 开机启动
  25. systemctl enable mysqld
  26. systemctl daemon-reload
  27. #用户名为root 密码为A37

mycat

  1. #上传mycat到linux上
  2. tar -xvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz
  3. # 编辑环境变量
  4. vi /etc/profile
  5. #添加以下内容
  6. export MYCAT_HOME=/root/mycat
  7. source /etc/profile
  8. cd /root/mycat/bin
  9. ./mycat start
  10. firewall-cmd --zone=public --add-port=8066/tcp --permanent
  11. firewall-cmd --reload
  12. #用户root 密码123456 端口8066

4. 克隆

克隆重新生成mac地址

并修改mysql的uuid 随机改一下

  1. vi /var/lib/mysql/auto.cnf

5. 主重复制

MyCat 的读写分离 需要用到主从复制 从表会根据主表进行同步

我们在写数据时 写入主表 而读取从从表中读取

  1. #在主服务器上
  2. vi /etc/my.cnf
  3. #在[mysqld]加上 log-bin 开启主从复制 server-id 主从服务器的唯一标识
  4. log-bin=mysql-bin
  5. server-id=1
  6. innodb_flush_log_at_trx_commit=1
  7. sync_binlog=1
  8. service mysqld restart
  9. mysql -uroot -p
  10. # 需要 file和position的值 配置从服务器用
  11. show master status;
  1. #在从服务器上
  2. vi /etc/my.cnf
  3. #在[mysqld]加上
  4. server-id=2
  5. mysql -uroot -p
  6. use mysql;
  7. drop table slave_master_info;
  8. drop table slave_relat_log_info;
  9. drop table slave_worker_info;
  10. drop table innodb_index_stats;
  11. drop table innodb_table_stats;
  12. sorce /usr/share/mysql/mysql_system_tables.sql;
  13. serveice mysqld restart
  14. mysql -uroot -p
  15. change master to master_host='主服务器ip',master_port=3306,master_user='root',master_password='password',master_log_file='刚刚在主服务器查到的值',master_log_pos=同样也是之前查到的;
  16. # 开启从节点
  17. start slave;
  18. # 查询结果 Slave_IO_Runing和Slave_SQL_Running都为yes才成功
  19. show slave status\G;

6. 读写分离

需要先配置主从复制 写操作只写主服务器 而读取是从从服务器中数据

  1. # 修改server.xml
  2. vi /root/mycat/conf/server.xml
  1. <user name="root" defaultAccount="true">
  2. <!-- 密码 -->
  3. <property name="password">123456</property>
  4. <!-- 库名 -->
  5. <property name="schemas">TESTDB</property>
  6. <property name="defaultSchema">TESTDB</property>
  7. </user>
  1. # 修改schema.xml
  2. vi /root/mycat/conf/schema.xml
  1. <!-- 建议百度找配置文件这个不太准确 -->
  2. <mycat:schema xmlns:mycat="http://io.mycat/">
  3. <!-- name为主服务器 server文件的虚拟库名与name必须一致 -->
  4. <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
  5. <table name="customer" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-intfile" autoIncrement="true" fetchStoreNodeByJdbc="true">
  6. <childTable name="customer_addr" primaryKey="id" joinKey="customer_id" parentKey="id"> </childTable>
  7. </table>
  8. </schema>
  9. <!-- name必须与datenode一致 database为真实的库名 -->
  10. <dataNode name="dn1" dataHost="localhost1" database="db1" />
  11. <dataNode name="dn2" dataHost="localhost1" database="db2" />
  12. <dataNode name="dn3" dataHost="localhost1" database="db3" />
  13. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
  14. writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
  15. <heartbeat>select user()</heartbeat>
  16. <!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
  17. <writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root"
  18. password="root">
  19. <!-- 从服务器 负责读 -->
  20. <readHost host="hostS1" url="从服务器+端口" user="" password="">
  21. </writeHost>
  22. </dataHost>
  23. </mycat:schema>
  1. # 重启 mycat
  2. ./mycat restart

使用时连接mycat的地址使用即可

7. 分库分表

将庞大数据量拆分为不同的数据库和数据表进行存储

7.1. 水平拆分

根据表的数据逻辑关系,将同一表中的数据按某种条件,拆分到多台服务器上,也叫横向拆分

  • 修改主服务器中 server.xml vi /root/mycat/conf/server.xml

      1. <!-- 添加property 配置主键方式 0为本地文件方式 -->
      2. <property name="sequnceHandlerType">0</property>
  • 修改主服务器的 sequence_conf.properties vi /root/mycat/conf/sequence_conf.properties

      1. GLOBAL.HISIDS= #可以自定义关键字
      2. GLOBAL.MINID=10001 #最小值
      3. GLOBAL.MAXID=20000 #最大值
  • 修改schema.xml vi /root/mycat/conf/schema.xml

      1. <mycat:schema xmlns:mycat="http://io.mycat/">
      2. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
      3. <table name="customer" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long">
      4. </table>
      5. </schema>
      6. <!-- name必须与datenode一致 database为真实的库名 -->
      7. <dataNode name="dn1" dataHost="localhost1" database="db1" />
      8. <dataNode name="dn2" dataHost="localhost1" database="db2" />
      9. <dataNode name="dn3" dataHost="localhost1" database="db3" />
      10. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
      11. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
      12. <heartbeat>select user()</heartbeat>
      13. <!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
      14. <writeHost host="hostM1" url="localhost:3306" user="root"
      15. password="root">
      16. <!-- 从服务器 负责读 -->
      17. <readHost host="hostS1" url="从服务器+端口" user="" password="">
      18. </writeHost>
      19. </dataHost>
      20. </mycat:schema>
  • 修改 rule.xml vi /root/mycat/conf/rule.xml

      1. <function name='mod-log' class='io.mycat.route.function.PartitionBymod'>
      2. <property name='count'>3</property>
      3. </function>

插入数据列名必须完整 如果是自增键 则需要用 NEXT VALUE FOR MYCATSEQ_GLOBAL 不能用null

以上配置用的是根据主键取模方式拆分

7.2. 垂直拆分

根据业务的维度,将不同的表切分到不同数据库上,也叫纵向拆分

  • 修改schema.xml vi /root/mycat/conf/schema.xml

      1. <mycat:schema xmlns:mycat="http://io.mycat/">
      2. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
      3. </table>
      4. <table name="dog" primaryKey="id" autoIncrement='true' dataNode='dn4'>
      5. </table>
      6. <table name="cat" primaryKey="id" autoIncrement='true' dataNode='dn5'>
      7. </table>
      8. </schema>
      9. <!-- name必须与datenode一致 database为真实的库名 -->
      10. <dataNode name="dn4" dataHost="localhost1" database="db1" />
      11. <dataNode name="dn5" dataHost="localhost1" database="db2" />
      12. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
      13. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
      14. <heartbeat>select user()</heartbeat>
      15. <!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
      16. <writeHost host="hostM1" url="localhost:3306" user="root"
      17. password="root">
      18. <!-- 从服务器 负责读 -->
      19. <readHost host="hostS1" url="从服务器+端口" user="" password="">
      20. </writeHost>
      21. </dataHost>
      22. </mycat:schema>


根据 表名 区分库 如dog 存放在db1中 cat存放在db2中